У меня вопрос по соединению макросов для выполнения на разных листах. есть макрос по переносу таблиц из эксель в ворд, тему создавала natanata12, Там у неё ошибки, но я поправил. А у меня вопрос можно ли в выполнении её макроса добавить другие макросы? Макрос там работает: открывается документ ворд - из экселя переносятся таблицы - вставляясь по определённой закладке. Мне же надо: с одного листа запустить макрос, лист "Т." оставить как есть, а остальные предварительно обработать, убрать ноли и далее удалить пустые строки (все макросы имеются в файле, рабочие) и обработанные таблицы вставить в ворд. Сам попытался (макрос попытка, в файле, там проблема с переменными), но знаний не хватает.
У меня вопрос по соединению макросов для выполнения на разных листах. есть макрос по переносу таблиц из эксель в ворд, тему создавала natanata12, Там у неё ошибки, но я поправил. А у меня вопрос можно ли в выполнении её макроса добавить другие макросы? Макрос там работает: открывается документ ворд - из экселя переносятся таблицы - вставляясь по определённой закладке. Мне же надо: с одного листа запустить макрос, лист "Т." оставить как есть, а остальные предварительно обработать, убрать ноли и далее удалить пустые строки (все макросы имеются в файле, рабочие) и обработанные таблицы вставить в ворд. Сам попытался (макрос попытка, в файле, там проблема с переменными), но знаний не хватает.AB0885
Sub попытка() Dim i As Integer, j As Integer, k As Integer Dim myWord As New Word.Application, myDoc As Word.Document Set myDoc = myWord.Documents.Open("C:\Users\Desktop\стр.docx") For k = 2 To 4 With Sheets(k) For j = 1 To 10 For i = 1 To 10 If .Cells(i, j) <> "" And .Cells(i, j) = 0 Then .Cells(i, j) = Empty End If Next i Next j .Range("A1").CurrentRegion.Copy myDoc.Bookmarks("закладка" & k).Range.PasteExcelTable False, False, False 'имена закладок - закладка2, закладка3, закладка4 End With Next k End Sub
[/vba]
Можно так попробовать доработать Ваш макрос [vba]
Код
Sub попытка() Dim i As Integer, j As Integer, k As Integer Dim myWord As New Word.Application, myDoc As Word.Document Set myDoc = myWord.Documents.Open("C:\Users\Desktop\стр.docx") For k = 2 To 4 With Sheets(k) For j = 1 To 10 For i = 1 To 10 If .Cells(i, j) <> "" And .Cells(i, j) = 0 Then .Cells(i, j) = Empty End If Next i Next j .Range("A1").CurrentRegion.Copy myDoc.Bookmarks("закладка" & k).Range.PasteExcelTable False, False, False 'имена закладок - закладка2, закладка3, закладка4 End With Next k End Sub
Pelena, я решил немного другим путём пойти. С начало решил необходимые листы привести в надлежащий порядок[vba]
Код
Sub удалноль() Dim iList As Variant Dim i As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Sheets(iList(i)).Activate For j = 1 To 10 For a = 1 To 10 While Cells(a, j) <> "" And Cells(a, j) = 0 Cells(a, j) = Empty Wend Next a Next j Next
End Sub
[/vba] и вот со следующим загвоздка [vba]
Код
Sub удалстрока() Dim iList As Variant Dim i As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Sheets(iList(i)).Activate Dim r As Long, rng As Range For r = 1 To ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count If Application.CountA(Rows(r)) = 0 Then If rng Is Nothing Then Set rng = Rows(r) Else Set rng = Union(rng, Rows(r)) End If Next r If Not rng Is Nothing Then rng.Delete Next
End Sub
[/vba] ругается на [vba]
Код
Set rng = Union(rng, Rows(r))
[/vba] помогите с этим кодом (полное выполнение только на листе "ПБ"),... и далее поставлю код натаната12
Pelena, я решил немного другим путём пойти. С начало решил необходимые листы привести в надлежащий порядок[vba]
Код
Sub удалноль() Dim iList As Variant Dim i As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Sheets(iList(i)).Activate For j = 1 To 10 For a = 1 To 10 While Cells(a, j) <> "" And Cells(a, j) = 0 Cells(a, j) = Empty Wend Next a Next j Next
End Sub
[/vba] и вот со следующим загвоздка [vba]
Код
Sub удалстрока() Dim iList As Variant Dim i As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Sheets(iList(i)).Activate Dim r As Long, rng As Range For r = 1 To ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count If Application.CountA(Rows(r)) = 0 Then If rng Is Nothing Then Set rng = Rows(r) Else Set rng = Union(rng, Rows(r)) End If Next r If Not rng Is Nothing Then rng.Delete Next
End Sub
[/vba] ругается на [vba]
Код
Set rng = Union(rng, Rows(r))
[/vba] помогите с этим кодом (полное выполнение только на листе "ПБ"),... и далее поставлю код натаната12AB0885
Сообщение отредактировал AB0885 - Четверг, 21.07.2022, 18:37
, я только начинаю знакомство с VBA и смотрю как делают другие, сам пытаюсь и точно не смогу поправить. Подскажите как лучше вывести из цикла? (после поправок ругаться стало на эту строчку).
Pelena,
Цитата
лучше вынести из цикла
, я только начинаю знакомство с VBA и смотрю как делают другие, сам пытаюсь и точно не смогу поправить. Подскажите как лучше вывести из цикла? (после поправок ругаться стало на эту строчку).AB0885
Sub удалстрока() Dim iList As Variant Dim i As Integer Dim r As Long, rng As Range iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Set rng = Nothing Sheets(iList(i)).Activate For r = 1 To ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count If Application.CountA(Rows(r)) = 0 Then If rng Is Nothing Then Set rng = Rows(r) Else Set rng = Union(rng, Rows(r)) End If Next r If Not rng Is Nothing Then rng.Delete Next
End Sub
[/vba] или более быстрый вариант без активации каждого листа [vba]
Код
Sub удалстрока1() Dim iList As Variant Dim i As Integer Dim r As Long, rng As Range iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Set rng = Nothing With Sheets(iList(i)) For r = 1 To .UsedRange.Row - 1 + .UsedRange.Rows.Count If Application.CountA(.Rows(r)) = 0 Then If rng Is Nothing Then Set rng = .Rows(r) Else Set rng = Union(rng, .Rows(r)) End If Next r If Not rng Is Nothing Then rng.Delete End With Next End Sub
[/vba]
[vba]
Код
Sub удалстрока() Dim iList As Variant Dim i As Integer Dim r As Long, rng As Range iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Set rng = Nothing Sheets(iList(i)).Activate For r = 1 To ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count If Application.CountA(Rows(r)) = 0 Then If rng Is Nothing Then Set rng = Rows(r) Else Set rng = Union(rng, Rows(r)) End If Next r If Not rng Is Nothing Then rng.Delete Next
End Sub
[/vba] или более быстрый вариант без активации каждого листа [vba]
Код
Sub удалстрока1() Dim iList As Variant Dim i As Integer Dim r As Long, rng As Range iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) Set rng = Nothing With Sheets(iList(i)) For r = 1 To .UsedRange.Row - 1 + .UsedRange.Rows.Count If Application.CountA(.Rows(r)) = 0 Then If rng Is Nothing Then Set rng = .Rows(r) Else Set rng = Union(rng, .Rows(r)) End If Next r If Not rng Is Nothing Then rng.Delete End With Next End Sub
Здравствуйте, Pelena. Всё соединил, работает. У меняя появился вопрос в связи с количеством листов обрабатываемых макросом "удалноль" время на обработку увеличилось. В макросе заданы определённые параметры обработки 10 ячеек на 10 ячеек, а есть возможность оптимизировать? Путём задачи листам, разные диапазоны обработки ячеек или другой путь?
P.S. Надеюсь мои вопросы в рамках данной темы.
Здравствуйте, Pelena. Всё соединил, работает. У меняя появился вопрос в связи с количеством листов обрабатываемых макросом "удалноль" время на обработку увеличилось. В макросе заданы определённые параметры обработки 10 ячеек на 10 ячеек, а есть возможность оптимизировать? Путём задачи листам, разные диапазоны обработки ячеек или другой путь?
P.S. Надеюсь мои вопросы в рамках данной темы.AB0885
Sub удалноль() Dim iList As Variant Dim i As Integer, j As Integer, a As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) With Sheets(iList(i)) For j = 1 To .UsedRange.Column - 1 + .UsedRange.Columns.Count For a = 1 To .UsedRange.Row - 1 + .UsedRange.Rows.Count If .Cells(a, j) = 0 Then .Cells(a, j).ClearContents Next a Next j End With Next
End Sub
[/vba]
Попробуйте так [vba]
Код
Sub удалноль() Dim iList As Variant Dim i As Integer, j As Integer, a As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) With Sheets(iList(i)) For j = 1 To .UsedRange.Column - 1 + .UsedRange.Columns.Count For a = 1 To .UsedRange.Row - 1 + .UsedRange.Rows.Count If .Cells(a, j) = 0 Then .Cells(a, j).ClearContents Next a Next j End With Next
Здравствуйте, Pelena. Я наконец выстроил необходимую структуру листов и запустил этот[vba]
Код
Sub удалноль() Dim iList As Variant Dim i As Integer, j As Integer, a As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) With Sheets(iList(i)) For j = 1 To .UsedRange.Column - 1 + .UsedRange.Columns.Count For a = 1 To .UsedRange.Row - 1 + .UsedRange.Rows.Count If .Cells(a, j) = 0 Then .Cells(a, j) = Empty Next a Next j End With Next
End Sub
[/vba] когда время работы превысило вдвое я всё остановил. Оптимизации работы макроса не вышло.
Здравствуйте, Pelena. Я наконец выстроил необходимую структуру листов и запустил этот[vba]
Код
Sub удалноль() Dim iList As Variant Dim i As Integer, j As Integer, a As Integer iList = Array("ПБ", "прил", "сод") For i = 0 To UBound(iList) With Sheets(iList(i)) For j = 1 To .UsedRange.Column - 1 + .UsedRange.Columns.Count For a = 1 To .UsedRange.Row - 1 + .UsedRange.Rows.Count If .Cells(a, j) = 0 Then .Cells(a, j) = Empty Next a Next j End With Next
End Sub
[/vba] когда время работы превысило вдвое я всё остановил. Оптимизации работы макроса не вышло.AB0885