Ошибки кода VBA Excel, если еще между диапазоном

#excel #vba

#преуспеть #vba #excel

Вопрос:

Я пытаюсь написать простой код VBA, который требует от пользователя ввода числа от -9 до 9. Как только пользователь вводит число, код извлекает данные из определенных столбцов, связанных с введенным номером, с одного листа на новый лист. У меня есть написанный код, но у меня возникла проблема с функцией If Else. Я получаю сообщение об ошибке следующего содержания: «Ошибка компиляции: синтаксическая ошибка». Если я избавлюсь от функции Else, код отлично работает для всего, что больше или равно 0, но мне нужно иметь возможность извлекать данные, связанные с отрицательными входными данными. Должен ли я не использовать If Else для этого кода?

 Sub AA()
On Error Resume Next
er = Sheets("D2").Range("AA65536").End(xlUp).Row
ec = Range("IV1").End(xlToLeft).Column
r = 3
Range("A3:IV65536").ClearContents
For i = 504 To er
 a = Sheets("D2").Cells(i, "AA")
If WorksheetFunction.IsErr(a) Then a = 0
If a >= Cells(2, 1).Value Then
    For j = 2 To ec
        f = Cells(1, j)
        Cells(r, j) = Sheets("D2").Cells(i, f)
    Next j
    r = r   1

Else a < Cells(2, 1).Value Then
    For j = 2 To ec
        f = Cells(1, j)
        Cells(r, j) = Sheets("D2").Cells(i, f)
    Next j
    r = r   1
End If
Next i
End Sub
  

Комментарии:

1. Если у вас есть Else с условием, вы должны использовать ElseIf вместо Else

2. И, пожалуйста, удалите этот печально известный On Error Resume Next . Он автоматически перешагивает все ошибки времени выполнения, и это сделает практически невозможным перехватить любую ошибку

3. Пробовал как Else, так и ElseIf, но оба раза, когда я вводил число, подобное 2, в итоге все данные были переведены с -9 на 9.

4. Используйте отладчик, чтобы понять, как работает ваш код. Установите точку останова (F9) в начало кода и выполните процедуру с помощью F8. Посмотрите, что происходит, и попытайтесь понять, почему. Подумайте о своей логике и адаптируйте ее к своим потребностям.

Ответ №1:

Заменить

 Else a < Cells(2, 1).Value Then
  

с:

 Else
  

Комментарии:

1. Попытался сделать это, и в итоге произошло то, что когда я ввожу определенное число, т.Е. 2, оно выдает мне данные от -9 до 9.

Ответ №2:

Используйте:

  1. Опция явная — помогает вам объявлять все переменные
  2. Используйте Elseif a < Ячейки (2, 1).Значение вместо Else a < Ячейки(2, 1).Значение ИЛИ просто замените Else a < Ячейки(2, 1).Значение на Else

  3. Переменные, ссылающиеся на последнюю строку или последний столбец, объявляются как длинные

  4. Нет необходимости использовать при следующем возобновлении ошибок

  5. Если вы хотите зациклить диапазон, используйте * для каждого * или * Для i = 1 до *

Рекомендации по кодированию:

 Option Explicit

Sub Test()

    Dim LastRow As Long, LastColumn As Long, Row As Long, Column As Long
    Dim cell As Range, rng As Range

    With ThisWorkbook.Worksheets("Sheet1") '<- Set the worksheet you want to use

        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row '<- Find last row of column A sheet1
        LastColumn = .Cells(7, .Columns.Count).End(xlToLeft).Column '<- Find last column of row 7 sheet1

        Set rng = .Range("A1:A" amp; LastRow) '<- Set range

        'Method 1
        For Each cell In rng
            If cell.Value = 1 Then
            ElseIf cell.Value = 2 Then
            End If
        Next cell

        'Method 2
        For Row = 2 To LastRow '<- Loop from row 2 to last row
            For Column = 1 To LastColumn '<- Loop from column 1 to last column
            Next Column
        Next Row

    End With

End Sub
  

Комментарии:

1. @soup12 я пытаюсь предоставить некоторый демонстрационный код, чтобы помочь вам

Ответ №3:

Вы пробовали избавиться от Else и просто использовать другой If оператор? Также я бы избавился от On Error Resume Next , особенно если вы все еще тестируете свой код.

 Sub AA()
On Error Resume Next
er = Sheets("D2").Range("AA65536").End(xlUp).Row
ec = Range("IV1").End(xlToLeft).Column
r = 3
Range("A3:IV65536").ClearContents
For i = 504 To er
 a = Sheets("D2").Cells(i, "AA")
If WorksheetFunction.IsErr(a) Then a = 0
If a >= Cells(2, 1).Value Then
    For j = 2 To ec
        f = Cells(1, j)
        Cells(r, j) = Sheets("D2").Cells(i, f)
    Next j
    r = r   1
End if

If a < Cells(2, 1).Value Then
    For j = 2 To ec
        f = Cells(1, j)
        Cells(r, j) = Sheets("D2").Cells(i, f)
    Next j
    r = r   1
End If
Next i
End Sub