копирует по адресам только построчно, т.е. если выделить 2 строчки с разными адресами, то он скопирует их в один файл,
так и задумывалось именно для того,чтобы не было недоразумений с разными адресами в разных строках. Именно для этого я при задании адреса и написАл, что выбирать его нужно из Selection(1).Row, т.е. из первой строки выделенного диапазона. Конечно, не очень сложно было бы и цикл по всем выделенным строкам устроить... Но, честно говоря, лень. Сейчас вдруг образовался перерыв в завале на работе. Вот я и смог немного отвлечься на любимую головоломку - Excel. А учиться можно, например, по литературе, лежащей здесь на сайте в Библиотеке Уокенбах - это Библия для VBA Excel
копирует по адресам только построчно, т.е. если выделить 2 строчки с разными адресами, то он скопирует их в один файл,
так и задумывалось именно для того,чтобы не было недоразумений с разными адресами в разных строках. Именно для этого я при задании адреса и написАл, что выбирать его нужно из Selection(1).Row, т.е. из первой строки выделенного диапазона. Конечно, не очень сложно было бы и цикл по всем выделенным строкам устроить... Но, честно говоря, лень. Сейчас вдруг образовался перерыв в завале на работе. Вот я и смог немного отвлечься на любимую головоломку - Excel. А учиться можно, например, по литературе, лежащей здесь на сайте в Библиотеке Уокенбах - это Библия для VBA ExcelAlex_ST
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91092-16-1398251538 ' DateTime : 23.04.14, 15:12 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Selection(i).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
[/vba]не проверял. Но может быть и заработает. Правда за тормоза не ручаюсь. Да! И выбирайте только непрерывные диапазоны! Тут только цикл по строкам выделенного диапазона. Циклы по областям я не делал.
А попробуйте-ка так:[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91092-16-1398251538 ' DateTime : 23.04.14, 15:12 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row Selection(i).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
[/vba]не проверял. Но может быть и заработает. Правда за тормоза не ручаюсь. Да! И выбирайте только непрерывные диапазоны! Тут только цикл по строкам выделенного диапазона. Циклы по областям я не делал.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 23.04.2014, 15:17
Построчно все работает, диапазон с одинаковыми адресами не работает (копируется только первая строчка), и диапазон с разными адресами тоже не копируются (так же только первая строчка)+ сама таблица становится невидимой.
Построчно все работает, диапазон с одинаковыми адресами не работает (копируется только первая строчка), и диапазон с разными адресами тоже не копируются (так же только первая строчка)+ сама таблица становится невидимой.amiko
Понял где собака порылась... В цикле по строкам Selection При одномерном переборе Selection(i) ячейки перебираются слева-направо, сверху вниз. А нам нужно сверху вниз. Тогда нужен двумерный перебор (т.е. по любому фиксированному столбцу, например, 1) Попробуйте так:[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91092-16-1398251538 ' DateTime : 23.04.14, 15:12 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i, 1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i, 1).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'lr = wbkDEST.Sheets(1).UsedRange.Row + wbkDEST.Sheets(1).UsedRange.Rows.Count - 1 Selection(i).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
[/vba]
Понял где собака порылась... В цикле по строкам Selection При одномерном переборе Selection(i) ячейки перебираются слева-направо, сверху вниз. А нам нужно сверху вниз. Тогда нужен двумерный перебор (т.е. по любому фиксированному столбцу, например, 1) Попробуйте так:[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91092-16-1398251538 ' DateTime : 23.04.14, 15:12 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i, 1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i, 1).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'lr = wbkDEST.Sheets(1).UsedRange.Row + wbkDEST.Sheets(1).UsedRange.Rows.Count - 1 Selection(i).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
Уже почти пашет как надо: -Строки с разными уникальными адресами пишутся в разных файлах, но в каждом из них пишется только первая выделенная строка -Строки с одинаковыми адресами закрывают принудительно файл с макросом и пишут так же только первую выделенную строку -По одной строке все работает как надо
Уже почти пашет как надо: -Строки с разными уникальными адресами пишутся в разных файлах, но в каждом из них пишется только первая выделенная строка -Строки с одинаковыми адресами закрывают принудительно файл с макросом и пишут так же только первую выделенную строку -По одной строке все работает как надоamiko
Ну, правильно... Не везде поправил выборку на двумерное обращение. Пробуйте[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91092-16-1398251538 ' DateTime : 23.04.14, 15:12 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i, 1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i, 1).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'lr = wbkDEST.Sheets(1).UsedRange.Row + wbkDEST.Sheets(1).UsedRange.Rows.Count - 1 Selection(i, 1).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
[/vba]
Ну, правильно... Не везде поправил выборку на двумерное обращение. Пробуйте[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91092-16-1398251538 ' DateTime : 23.04.14, 15:12 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i, 1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i, 1).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'lr = wbkDEST.Sheets(1).UsedRange.Row + wbkDEST.Sheets(1).UsedRange.Rows.Count - 1 Selection(i, 1).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
Ну всё! Работы под конец дня подвалили. Больше бездельничать не смогу. Завтра буду весь день на объекте, а послезавтра - разгребать недоделанное сегодня и то, что завтра подкинут.
Ну всё! Работы под конец дня подвалили. Больше бездельничать не смогу. Завтра буду весь день на объекте, а послезавтра - разгребать недоделанное сегодня и то, что завтра подкинут.Alex_ST
))) Развязка близко! -Строки с разными уникальными адресами пишутся в разных файлах как надо!!! -Строки с одинаковыми адресами закрывают принудительно файл с макросом и пишут только первую выделенную строку -По одной строке все работает как надо Спасибо большущее в любом случае!
))) Развязка близко! -Строки с разными уникальными адресами пишутся в разных файлах как надо!!! -Строки с одинаковыми адресами закрывают принудительно файл с макросом и пишут только первую выделенную строку -По одной строке все работает как надо Спасибо большущее в любом случае!amiko
Сообщение отредактировал amiko - Среда, 23.04.2014, 17:22
-Строки с одинаковыми адресами закрывают принудительно файл с макросом
Чудеса! Т.е. если строки с одинаковыми адресами получателя идут подряд, то после первого обращения кирдык настаёт? И сам файл Источник даже закрывается? А если не подряд в один и тот же файл, а по очереди в два? Ну всё. Разлогиниваюсь.
-Строки с одинаковыми адресами закрывают принудительно файл с макросом
Чудеса! Т.е. если строки с одинаковыми адресами получателя идут подряд, то после первого обращения кирдык настаёт? И сам файл Источник даже закрывается? А если не подряд в один и тот же файл, а по очереди в два? Ну всё. Разлогиниваюсь.Alex_ST
Настает именно кирдык, и сам источник закрывается, а если одинаковые адреса не подряд, то при первом же повторе происходит тоже самое, но до повтора все прекрасно пишется. Т.е. все уникальные адреса пропишутся как надо, но повторы в последнем варианте не проходят вне зависимости от последовательности строк.
Настает именно кирдык, и сам источник закрывается, а если одинаковые адреса не подряд, то при первом же повторе происходит тоже самое, но до повтора все прекрасно пишется. Т.е. все уникальные адреса пропишутся как надо, но повторы в последнем варианте не проходят вне зависимости от последовательности строк.amiko
Чтобы не загибался Excel можно попробовать ввести задержку после каждого закрытия файла Получателя в цикле. Попробуйте вот так:[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91117-16-1398258642 ' DateTime : 23.04.14, 17:10 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i, 1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i, 1).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'lr = wbkDEST.Sheets(1).UsedRange.Row + wbkDEST.Sheets(1).UsedRange.Rows.Count - 1 Selection(i, 1).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением fnDelay (0.5) ' задержка Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
Function fnDelay(Seconds As Single) ' задержка Dim Finish As Single: Finish = Timer + Delta Do While Timer < Finish: Loop End Function
[/vba]здесь функция fnDelay, вызываемая после закрытия и сохранения книги, получает в аргументе время задержки 0,5 секунд. Может быть такой задержки и будет достаточно. Если не поможет, попробуйте увеличить задержку, например для начала до 1 секунды. Завтра я весь день буду в местной командировке. Так что на мою помощь днём не рассчитывайте. А вечером загляну. Удачи.
Чтобы не загибался Excel можно попробовать ввести задержку после каждого закрытия файла Получателя в цикле. Попробуйте вот так:[vba]
Код
Sub Copy_ROWs_to_EXT_FILES() ' скопировать строки выделенных ячеек во внешние файлы-накопители '--------------------------------------------------------------------------------------- ' Procedure : Copy_ROWs_to_EXT_FILES ' Author : KuklP & Alex_ST ' Topic_HEADER : Макрос "Copy_ROWs_to_EXT_FILE" ' Topic_URL : http://www.excelworld.ru/forum/3-176-91117-16-1398258642 ' DateTime : 23.04.14, 17:10 ' Purpose : скопировать строки выделенных ячеек во внешние файлы-накопители ' Notes1 : основной и резервный (сетевой) пути к файлам-накопителям прописываются в указанных в коде ячейках копируемых строк листа файла-источника ' Notes2 : чтобы после работы макроса файлы-накопители не становились невидимым в окнах Excel (как надстройка или Personal.xls), в их модулях ЭтаКнига нужно прописать: ' Private Sub Workbook_Open() ' If Me.Parent.Caption = Application.Caption Then Windows(Me.Name).Visible = True ' End Sub '--------------------------------------------------------------------------------------- If Not TypeName(Selection) = "Range" Then Exit Sub Dim lr&, wbkDEST As Workbook, i% Const sLocAddrCol$ = "A" ' столбец, в ячейках которого прописан локальный (основной) путь к файлу-накопителю Const sNetAddrCol$ = "B" ' столбец, в ячейках которого прописан сетевой (резервный) путь к файлу-накопителю Dim sLocDestPath$ ' локальный (основной) путь к файлу-накопителю Dim sNetDestPath$ ' сетевой (резервный) путь к файлу-накопителю With Application: .ScreenUpdating = False: .DisplayAlerts = False: .EnableEvents = False: End With For i = 1 To Selection.Rows.Count sLocDestPath = Range(sLocAddrCol & Selection(i, 1).Row).Value sNetDestPath = Range(sNetAddrCol & Selection(i, 1).Row).Value On Error Resume Next Set wbkDEST = GetObject(sLocDestPath) ' локальный файл-накопитель If Err Then Err.Clear: Set wbkDEST = GetObject(sNetDestPath) ' сетевой файл-накопитель (если нужно) If Err Then MsgBox "Файл-накопитель " & wbkDEST.FullName & " не доступен!": GoTo Next_i
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 'lr = wbkDEST.Sheets(1).UsedRange.Row + wbkDEST.Sheets(1).UsedRange.Rows.Count - 1 Selection(i, 1).EntireRow.Copy wbkDEST.Sheets(1).Cells(lr + 1, 1) ' копирование wbkDEST.Close (True) ' закрыть с сохранением fnDelay (0.5) ' задержка Next_i: Next i With Application: .EnableEvents = True: .DisplayAlerts = True: .ScreenUpdating = True: End With Set wbkDEST = Nothing End Sub
Function fnDelay(Seconds As Single) ' задержка Dim Finish As Single: Finish = Timer + Delta Do While Timer < Finish: Loop End Function
[/vba]здесь функция fnDelay, вызываемая после закрытия и сохранения книги, получает в аргументе время задержки 0,5 секунд. Может быть такой задержки и будет достаточно. Если не поможет, попробуйте увеличить задержку, например для начала до 1 секунды. Завтра я весь день буду в местной командировке. Так что на мою помощь днём не рассчитывайте. А вечером загляну. Удачи.Alex_ST
500 секунд ждали?!!! Ну, блин, терпеливый энтузиаст! Ну, тогда я пас. Мысли кончились Может быть кто-нибудь из местных знатоков сможет помочь? А вообще-то сляпайте-ка Вы тестовый файл в несколько строк данных с прописанными разными и одинаковыми накопителями в корне диска С и выложите сюда. Пусть народ попробует на своих компах. Может быть дело не в процедуре, а в Вашем Офисе/компе?
500 секунд ждали?!!! Ну, блин, терпеливый энтузиаст! Ну, тогда я пас. Мысли кончились Может быть кто-нибудь из местных знатоков сможет помочь? А вообще-то сляпайте-ка Вы тестовый файл в несколько строк данных с прописанными разными и одинаковыми накопителями в корне диска С и выложите сюда. Пусть народ попробует на своих компах. Может быть дело не в процедуре, а в Вашем Офисе/компе?Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 24.04.2014, 20:26
Завтра утром выложу обязательно, а подождать 500 секунд не смог бы даже еслиб хотел, т.к. Все Закрывается при копировании по повторяющимся адресам сразу после запуска. Хотя даже и по разным адресам при копировании такой длинной паузы не было, может там ошибка в синтаксисе задержки? Проще будет положить пример в архиве с накопителями, адреса пропишу сразу чтоб все работало в корне диска с: для удобства. З.ы. Кстати книгу почти всю прочел, спасибо, действительно вещь, жаль диск не приложен, примеры из текста копируется с огромным количеством ошибок, устаю исправлять.
Завтра утром выложу обязательно, а подождать 500 секунд не смог бы даже еслиб хотел, т.к. Все Закрывается при копировании по повторяющимся адресам сразу после запуска. Хотя даже и по разным адресам при копировании такой длинной паузы не было, может там ошибка в синтаксисе задержки? Проще будет положить пример в архиве с накопителями, адреса пропишу сразу чтоб все работало в корне диска с: для удобства. З.ы. Кстати книгу почти всю прочел, спасибо, действительно вещь, жаль диск не приложен, примеры из текста копируется с огромным количеством ошибок, устаю исправлять.amiko
Сообщение отредактировал amiko - Пятница, 25.04.2014, 00:10
Позор на мою седую бороду Вот что значит второпях и не проверяя на ночь глядя процедуры писАть... Ну вот и получилось, что при "причёсывании" процедуры задержки не все сходу заданные имена переменных заменил на новые, более корректные. Так должно быть (на этот раз проверил ) [vba]
Код
Function fnDelay(Seconds As Single) ' задержка Dim Finish As Single: Finish = Timer + Seconds Do While Timer < Finish: Loop End Function
[/vba] А вывод сообщения об ошибке блокировал ранее включенный в основной процедуре обработчик ошибок [vba]
Код
On Error Resume Next
[/vba]
Позор на мою седую бороду Вот что значит второпях и не проверяя на ночь глядя процедуры писАть... Ну вот и получилось, что при "причёсывании" процедуры задержки не все сходу заданные имена переменных заменил на новые, более корректные. Так должно быть (на этот раз проверил ) [vba]
Код
Function fnDelay(Seconds As Single) ' задержка Dim Finish As Single: Finish = Timer + Seconds Do While Timer < Finish: Loop End Function
[/vba] А вывод сообщения об ошибке блокировал ранее включенный в основной процедуре обработчик ошибок [vba]
А по поводу учебников, так, похоже, что Серж почистил библиотеку от старых файлов и "вместе с грязной водой из ванночки ребёнка выплеснул" Или я просто не смог найти Но тогда значит не только я, старожил, но и новички не смогут найти. Ну, в общем, я слил свою библиотеку на Гугл.Диск поковыряйтесь. Там кроме Уокенбаха ещё много других ценных книжек лежит.
А по поводу учебников, так, похоже, что Серж почистил библиотеку от старых файлов и "вместе с грязной водой из ванночки ребёнка выплеснул" Или я просто не смог найти Но тогда значит не только я, старожил, но и новички не смогут найти. Ну, в общем, я слил свою библиотеку на Гугл.Диск поковыряйтесь. Там кроме Уокенбаха ещё много других ценных книжек лежит.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 25.04.2014, 09:33
За базу знаний спасибо. Задержка заработала, но дело оказалось не в ней, при копировании области по повторному адресу debuger указал на эту строку "lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row" Подстегнул пример с накопителями и адресами накопителей (1.xls,2.xls,3.xls) на диске С: + сообщение об ошибке. Попробуйте, может действительно дело в версиях или настройках Excel или VBA.
За базу знаний спасибо. Задержка заработала, но дело оказалось не в ней, при копировании области по повторному адресу debuger указал на эту строку "lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row" Подстегнул пример с накопителями и адресами накопителей (1.xls,2.xls,3.xls) на диске С: + сообщение об ошибке. Попробуйте, может действительно дело в версиях или настройках Excel или VBA.amiko
Я не могу на работе скачивать файлы с макросами... 1. Какую ошибку выдал? Скиньте скриншот. 2. Если выделить одну строку, то нормально проходит цикл из одного элемента? И не ругается? 3. Попробуйте применить другой метод определения первой свободной строки: снимите комментарий со строки[vba]
lr = wbkDEST.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
[/vba]
Я не могу на работе скачивать файлы с макросами... 1. Какую ошибку выдал? Скиньте скриншот. 2. Если выделить одну строку, то нормально проходит цикл из одного элемента? И не ругается? 3. Попробуйте применить другой метод определения первой свободной строки: снимите комментарий со строки[vba]
1. Скрин в файле 2. Из одного проходит нормально, и из нескольких разных все проходит нормально даже без задержки. 3. попробовал, опять ошибка но в другой строке с другим оператором.
1. Скрин в файле 2. Из одного проходит нормально, и из нескольких разных все проходит нормально даже без задержки. 3. попробовал, опять ошибка но в другой строке с другим оператором.amiko