сканирование листов в Vba
Sub Report()
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
'Цикл по всем листам книги
For Each curSheet In Workbooks("Книга1").Worksheets
If curSheet.Name <> "Отчет" Then
curSheet.Activate
For curRow = 1 To 10
If IsNumeric(Cells(curRow, 8 ).Value) And Cells(curRow, 8 ).Value <> Empty Then
Worksheets("Отчет").Cells(targetRow, 1 ).Value = Cells(curRow, 8 ).Value
Worksheets("Отчет").Cells(targetRow, 2 ).Value = Cells(curRow, 1 ).Value
Worksheets("Отчет").Cells(targetRow, 3 ).Value = Cells(curRow, 2 ).Value
targetRow = targetRow + 1
End If
Next curRow
End If
Next curSheet
Worksheets("Отчет").Activate
End Sub
как сделать чтобы сканирование листов происходило в определенном диапазоне. Например с 5 до 50.
имеется следующая програмка:
Sub Report()
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
'Цикл по всем листам книги
For Each curSheet In Workbooks("Книга1").Worksheets
If curSheet.Name <> "Отчет" Then
curSheet.Activate
For curRow = 1 To 10
If IsNumeric(Cells(curRow, 8 ).Value) And Cells(curRow, 8 ).Value <> Empty Then
Worksheets("Отчет").Cells(targetRow, 1 ).Value = Cells(curRow, 8 ).Value
Worksheets("Отчет").Cells(targetRow, 2 ).Value = Cells(curRow, 1 ).Value
Worksheets("Отчет").Cells(targetRow, 3 ).Value = Cells(curRow, 2 ).Value
targetRow = targetRow + 1
End If
Next curRow
End If
Next curSheet
Worksheets("Отчет").Activate
End Sub
как сделать чтобы сканирование листов происходило в определенном диапазоне. Например с 5 до 50.
Sub Report()
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
For curSheet = 5 To 50
If Worksheets(curSheet).Name <> "Отчет" Then
Worksheets(curSheet).Activate
For curRow = 1 To 10
If IsNumeric(Cells(curRow, 8 ).Value) And Cells(curRow, 8 ).Value <> Empty Then
Worksheets("Отчет").Cells(targetRow, 1 ).Value = Cells(curRow, 8 ).Value
Worksheets("Отчет").Cells(targetRow, 2 ).Value = Cells(curRow, 1 ).Value
Worksheets("Отчет").Cells(targetRow, 3 ).Value = Cells(curRow, 2 ).Value
targetRow = targetRow + 1
End If
Next curRow
End If
Next curSheet
Worksheets("Отчет").Activate
End Sub
Sub Report()
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
[COLOR=blue]вылазит ошибка "type mismatch" >>>[/COLOR] For curSheet = 5 To 50
[COLOR=blue] действительно ли нужно это условие?>>>[/COLOR] If Worksheets(curSheet).Name <> "Отчет" Then
Worksheets(curSheet).Activate
For curRow = 1 To 10
If IsNumeric(Cells(curRow, 8 ).Value) And Cells(curRow, 8 ).Value <> Empty Then
Worksheets("Отчет").Cells(targetRow, 1 ).Value = Cells(curRow, 8 ).Value
Worksheets("Отчет").Cells(targetRow, 2 ).Value = Cells(curRow, 1 ).Value
Worksheets("Отчет").Cells(targetRow, 3 ).Value = Cells(curRow, 2 ).Value
targetRow = targetRow + 1
End If
Next curRow
End If
Next curSheet
Worksheets("Отчет").Activate
End Sub
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
For curSheet = 5 To 50
Исправленный код не должен работать в принципе, так как в новом варианте переменная curSheet должна быть типа Integer, a не Worksheet
P.S. IMHO - можно обойтись и без выделения (активации) рабочих листов.
Заранее благодарен.
Sub Report()
Dim curSheet As Worksheet
Dim curRow, targetRow As Integer
targetRow = 1
For curSheet = 5 To 50
Исправленный код не должен работать в принципе, так как в новом варианте переменная curSheet должна быть типа Integer, a не Worksheet
P.S. IMHO - можно обойтись и без выделения (активации) рабочих листов.
Совершенно верно.
Виноват, забыл исправить Dim curSheet As Worksheet на Dim curSheet As Integer.
А как тогда сделать без активации листов?
Без активации можно так:
If IsNumeric(Worksheets(curSheet).Cells(curRow, 1).Value) And Worksheets(curSheet).Cells(curRow, 1).Value <> Empty Then
Worksheets("Отчет").Cells(targetRow, 1).Value = Worksheets(curSheet).Cells(curRow, 8 ).Value
Worksheets("Отчет").Cells(targetRow, 2).Value = Worksheets(curSheet).Cells(curRow, 1).Value
Worksheets("Отчет").Cells(targetRow, 3).Value = Worksheets(curSheet).Cells(curRow, 2).Value
targetRow = targetRow + 1
End If
По поводу необходимости условия If Worksheets(curSheet).Name <> "Отчет".
Это Вам решать. Если в диапазон сканируемых листов точно не попадёт лист "Отчёт", то - не нужно, а если такой гарантии нет, то лучше оставить, иначе этот лист тоже будет обработан, как и прочие.
Вот мой вариант, без активации :
Set iCells1 = Worksheets("Отчет").Cells
For curSheet = 5 To 50
Set iCells2 = Worksheets(curSheet).Cells
If iCells2.Parent.Name <> "Отчет" Then
For curRow = 1 To 10
If IsNumeric(iCells2(curRow, 8).Value) And iCells2(curRow, 8).Value <> "" Then
targetRow = targetRow + 1
iCells1(targetRow, 1).Value = iCells2(curRow, 8).Value
iCells1(targetRow, 2).Value = iCells2(curRow, 1).Value
iCells1(targetRow, 3).Value = iCells2(curRow, 2).Value
End If
Next
End If
Next
End Sub
Цитата : вот и я тоже пробовал вылазит не совпадение типов (Maks555)
Я не проверял отредактированную версию, только ознакомился визуально.
P.S.
Цитата : вот и я тоже пробовал вылазит не совпадение типов (Maks555)
Я не проверял отредактированную версию, только ознакомился визуально.
Все отлично работает спасибо еще раз!
Только у меня есть еще одна проблемка. В одной из страниц есть ошибка в формуле "#ссылка!" и при компеляции до ходя до этого места програмка останавливается и вылазит ошибка.
Можно ли как нибудь сделать проверку на эту ошибку, чтобы эта ячейка просто пропускалась.
Все отлично работает спасибо еще раз!
Только у меня есть еще одна проблемка. В одной из страниц есть ошибка в формуле "#ссылка!" и при компеляции до ходя до этого места програмка останавливается и вылазит ошибка.
Можно ли как нибудь сделать проверку на эту ошибку, чтобы эта ячейка просто пропускалась.
Попробуйте так:
If Not (IsError(Cells(curRow, 8 ))) Then
If IsNumeric(...) And ... Then
...
End If
End If
If IsNumeric(iCells2(curRow, 8).Value) And iCells2(curRow, 8).Value <> "" Then
'''
End If
End If
P.S. Откуда взялась "#ссылка!" и не хотите ли Вы это исправить ...