Я использую код ниже несколько раз в одной подпрограмме для разных значений, а не только "CPNEC". Он отлично работает, когда в таблице есть диапазон с этим значением, но если он выходит за его пределы, то значение не существует. Это процедура, которую я хочу использовать каждый месяц, когда в моих данных иногда не будет определенного значения, поэтому мне нужно, чтобы он мог перейти к следующему значению без выхода за пределы. Может ли кто-нибудь мне помочь, пожалуйста.
Sub SelectCPNEC()
' Figure out where the "CPNEC" data starts.
For nRow = 1 To 65536
If Range("A" & nRow).Value = "CPNEC" Then
nStart = nRow
Exit For
End If
Next nRow
' Figure out where the "CPNEC" data ends.
For nRow = nStart To 65536
If Range("a" & nRow).Value <> "CPNEC" Then
nEnd = nRow
Exit For
End If
Next nRow
nEnd = nEnd - 1
'Select the range required
Range("A" & nStart & ":G" & nEnd).Select
'Now copy and paste into the right worksheet
Selection.Copy
Application.Goto ActiveWorkbook.Sheets("CPNEC").Cells(1, 1)
ActiveSheet.Paste
End Sub
решение1
Если совпадающего значения не существует, nStart
сохраняет значение по умолчанию 0
. Это приводит к ошибке в этой строке.
If Range("a" & nRow).Value <> "CPNEC" Then
because A0
не является допустимой ссылкой на диапазон. Чтобы обойти эту проблему (и избавить себя от ненужного цикла), добавьте условную проверку nStart = 0
после первого цикла. Если это ноль, выйдите из подпрограммы; в противном случае продолжите. Это должно избежать ошибок, останавливающих ваш код, когда совпадение не найдено.
Sub SelectCPNEC()
' Figure out where the "CPNEC" data starts.
For nRow = 1 To 65536
If Range("A" & nRow).Value = "CPNEC" Then
nStart = nRow
Exit For
End If
Next nRow
If nStart > 0 Then
' Figure out where the "CPNEC" data ends.
For nRow = nStart To 65536
If Range("A" & nRow).Value <> "CPNEC" Then
nEnd = nRow
Exit For
End If
Next nRow
nEnd = nEnd - 1
'Select the range required
Range("A" & nStart & ":G" & nEnd).Select
'Now copy and paste into the right worksheet
Selection.Copy
Application.Goto ActiveWorkbook.Sheets("CPNEC").Cells(1, 1)
ActiveSheet.Paste
End If
End Sub
решение2
Excellll объясняет это. Но поскольку вы хорошо справляетесь с циклами for, вы также можете искать строку в каждой ячейке и, если макрос ее найдет, копировать всю строку на нужный лист. Вы не получите ошибку, если значение не существует.
For Each cell In Range("A1: A65536")
If cell.Value = "CPNEC" Then
cell.EntireRow.Copy Workbooks.Open("otherWorkbook.xls").Sheets("Sheet1").Range("A1").End(xlDown).Offset(1, 0)
End If
Next cell
В ячейке «A1» и ячейке «A2» должна быть какая-то информация, например заголовки столбцов. .End(xlDown)
Затем .Offset(1,0)
будет найдена первая пустая строка для вставки информации.