Excel VBA это должно работать, но это не

#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, и это работает как мечта! Еще раз спасибо за вашу помощь! Это здорово!