Как я уже говорил в моих комментариях, есть некоторые проблемы с тем, как вы решили реализовать это.
Ваш цикл For c = 1 To actCol
не нужен.Это легко увидеть, потому что c
на самом деле нигде в цикле не используется.
Предположим, что ваше целевое значение находится в wks.Range("A100")
(1-й ряд и 100-й столбец).
Ваш код будет выполнять ту же самую операцию 100 раз и получит точно такой же результат.Это то, что заставляет вас использовать Exit For
, что является плохой практикой.
Если я правильно понял ваш первоначальный пост, если Target
существует в конкретной рабочей таблице, то все ячейки до Target
пусты.
В этом случае Target
будет либо в wks.Range("A1")
, либо в wks.Range("A1").End(xlToRight)
.Если его нет ни в одной из этих двух ячеек, его вообще нет в этом конкретном листе, что означает, что 1-я строка полностью пуста.Вам не нужно проверять больше ячеек, кроме этих двух.
Ваш код не проверяет, находится ли Target
в wks.Range("A1")
.
Также ваше использование Application.Match
заставляет меня поверить, что вы, вероятно, были введены в заблуждение распространенным заблуждением, что wks.Range("A1").End(xlToRight)
- это диапазон ячеек, начинающийся с A1
и простирающийся вплоть до последнегопустая ячейка в 1-м ряду.
Правда в том, что wks.Range("A1").End(xlToRight)
является одиночной ячейкой , а не диапазоном ячеек.Выбор A1
и затем нажатие CTRL+right arrow
покажет вам, какая именно это ячейка.
Возможно, я что-то упустил, но, согласно вашему описанию в первоначальном посте, я бы сделал что-то вроде следующего:
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
If sht.Range("A1").Value = "Target" Or sht.Range("A1").End(xlToRight).Value = "Target" Then
sht.Visible = xlSheetVisible
Else
MsgBox "target was not found in " & sht.Name
End If
Next sht