Здесь есть несколько вещей, которые стоит упомянуть.Если вы хотите указать диапазон с помощью .Range
, вы должны указать столбцы с обеих сторон :
;кроме того, он принимает строку.Это означает, что вы передаете "B1:a"
, что не имеет смысла для компьютера, потому что он не знает, что вы хотите, чтобы он использовал значение a
вместо буквы.Вам нужно передать "B1:B" & a
на .Range
.Это объединяет значение, которое вы нашли в переменной a, со строкой, чтобы оно выглядело как одна строка для компьютера.
Лично я считаю, что проще взять все значения как вектор столбца, а не затемнитьx
как range
, потому что это делает итерацию немного проще.Вместо того, чтобы отслеживать, в какой строке я нахожусь, Counter
всегда будет сообщать мне, где я нахожусь, так как я просто двигаюсь вниз на один столбец.В качестве дополнительного бонуса это сокращает время доступа к рабочему листу, что помогает ускорить ваш макрос.
Несмотря на то, что он закомментирован, стоит отметить, что цикл в нижней части сабвуфера не будет работать, поскольку у вас нетне правильно закрыли if или for.
Я не уверен, для чего ты это задумал, но никогда не плохая идея использовать значимые имена, чтобы ты мог оглянуться на свой код и разобраться в нем.без особых усилий.Например, я переименовал вашу переменную a
в lastrow
, которая с первого взгляда описывает, какое значение она хранит.
Ниже вашего кода, который я изменил
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim lastrow As Long
Dim Criteria As Long
Dim x() As Variant
Dim Counter As Long
lastrow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
Criteria = Worksheets("Sheet1").Range("E1").Value
x = Worksheets("Sheet1").Range("B1:B" & lastrow).value
For Counter = 1 To UBound(x)
If x(Counter,1) = Criteria Then
Worksheets("Sheet1").Cells(Counter, "B").Value = "X"
End If
Next Counter
MsgBox (Criteria)
End Sub