#excel #vba
#excel #vba
Вопрос:
Я пытаюсь создать код VBA, который соответствует как минимум 2 критериям. Я хотел бы вернуть строки, где в столбце C есть «ACMA», а в столбце T — «0».
Он должен быть указан, как показано ниже, на другом листе:
Я перепробовал все формулы в Интернете и коды других пользователей, но это не работает. Не могли бы вы указать мне правильный путь?
Комментарии:
1. Я полагаю, что многие проблемы, которые вы видите, вызваны тем фактом, что вы ищете
0
в ячейке. Во многих случаях пустая ячейка также будет оцениваться0
как . Возможно, стоит рассмотреть альтернативную систему нумерации или добавить третий критерий, которыйcell <> ""
.
Ответ №1:
Как упоминалось в @CLR, вам нужно будет проверить, возвращает ли столбец T 0, потому что он пустой или потому, что он на самом деле равен 0. Для этого решения я проверил длину значения в ячейке <> 0 (т. Е. Пустой).
Sub ReturnMatches()
Dim ws1 As Worksheet, ws2 As Worksheet
Dim lastRow1 As Long, newRow2 As Long
Dim x As Long
'don't know the names of your sheets so adjust accordingly
Set ws1 = ThisWorkbook.Sheets("Sheet1")
Set ws2 = ThisWorkbook.Sheets("Sheet2")
'determine last row of data sheet
lastRow1 = ws1.Cells(ws1.Rows.Count, 3).End(xlUp).Row
For x = 2 To lastRow1
'check to see if it is a match
'for T, also check length of value in cell <> 0 (i.e. blank)
If _
ws1.Cells(x, 3) = "ACMA" And _
ws1.Cells(x, 20) = 0 And Len(ws1.Cells(x, 20).Value) <> 0 Then
'define first blank row of 2nd sheet
newRow2 = ws2.Cells(ws1.Rows.Count, 1).End(xlUp).Row 1
'copy matching information to first blank row
ws2.Cells(newRow2, 1) = "ACMA"
ws2.Cells(newRow2, 2) = ws1.Cells(x, 4)
End If
Next x
End Sub