#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:
Используйте:
- Опция явная — помогает вам объявлять все переменные
-
Используйте Elseif a < Ячейки (2, 1).Значение вместо Else a < Ячейки(2, 1).Значение ИЛИ просто замените Else a < Ячейки(2, 1).Значение на Else
-
Переменные, ссылающиеся на последнюю строку или последний столбец, объявляются как длинные
-
Нет необходимости использовать при следующем возобновлении ошибок
-
Если вы хотите зациклить диапазон, используйте * для каждого * или * Для 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