#vba #excel #search
#vba #excel #Поиск
Вопрос:
Что я хочу сделать, так это когда я сохраняю свой файл Excel, я хочу, чтобы скрипт проверил наличие всех ячеек, в которых последним символом является «$», и проверил, есть ли ячейка с именем «Backup» в том же столбце, в котором была найдена ячейка, и если есть, только тогда примените мой скрипт
Вот мой код:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim c As Range
Dim x As Integer
Dim y As Integer
Dim isbackup As Boolean
isbackup = False
For Each c In Range("A1:N60")
If Right(c, 1) = "$" Then y = c.Column: x = c.Row
For i = 1 To 60
If Cells(i, y).Value = "Backup" Then
isbackup = True
Exit For
End If
Next i
If isbackup = True And Right(c, 1) = "$" Then <my script>
Next c
Я не вижу никаких синтаксических или логических ошибок, но я получаю код ошибки
1004: «ошибка, определяемая приложением или объектом»
Комментарии:
1. Если ваше первое
If
значение false для первогоc
, то y = 0. ==>Cells(1,0)
не существует, отсюда ошибка 1004. Также вы должны быть более четкими в определенииRange
примера.:ThisWorkbook.Worksheets(1).Range("A1:N60")
2. Используйте F8 для выполнения одного цикла. Наведите указатель мыши на переменную, чтобы увидеть ее значение. Используйте
debug.print ..
, чтобы увидеть, что происходит. Существуют другие варианты отладки.3. это не работает, потому что после вашей первой
if
вы должны начать новую строку и остановить блок then с помощьюend if
. также я бы использовал `Right (c.address, 1) = «$»
Ответ №1:
Возможно, это могло бы помочь:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim c As Range
Dim x As Integer, y As Integer
Dim isbackup As Boolean
isbackup = False
Dim rng As Range
Set rng = ThisWorkbook.Worksheets(1).Range("A1:N60")
For Each c In rng
If Right(c, 1) = "$" Then
y = c.Column: x = c.Row
Dim i As Integer
For i = 1 To rng.Rows.Count '--> I find this more flexible
If Cells(i, y).Value = "Backup" Then
isbackup = True
Exit For
End If
Next i
End If
If isbackup = True And Right(c, 1) = "$" Then DoEvents 'Replaced by your script
Next c
End Sub
Комментарии:
1. это идеально! Я люблю тебя! 🙂 Причина, по которой я не использовал «ThisWorkbook. Worksheets (1) «потому что я использую несколько листов, но я помещу все это в цикл, чтобы применить ко всем листам.
2. но с этим все еще есть проблема… Это также работает для столбцов, в которых нет ячеек «Backup». Я постараюсь это исправить
3. Я думаю, это потому, что он циклически проходит через c для каждой ячейки, и как только isbackup станет true, оно останется true, поэтому нам нужно найти способ снова сделать его false после перехода к строке, где нет «резервной копии»
4. хорошо, у меня все заработало, просто нужно было поместить «If isbackup = True And Right (c, 1) = «$» Then DoEvents «Заменено вашим скриптом» после isbackup = True, и это работает как мечта! Еще раз спасибо за вашу помощь! Это здорово!