Это должно быть легко. Я хотел бы сократить использование кода worksheets("Sheet1").activate
, так как он громоздкий и часто ошибочный, однако все попытки, которые я пробовал, не работают. До сих пор я использовал вариант set worksheet
и вариант with worksheet
, но если я не нахожусь строго на рабочем листе 1 в Excel, код не выполняется.
Я попробовал некоторые из вариантов, перечисленных в этой ссылке, но ни один из них не сработал: Как избежать использования Select в Excel VBA. Я действительно начинаю думать, что мне нужно использовать активацию все время.
Например, такой код:
Sub test()
Dim Cols As integer
Cols = Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Count
End sub
Я ожидаю, что этот код будет выполняться, даже если я не нахожусь на Sheet1, поскольку я специально определил рабочий лист, на котором он должен выполняться. Однако, если я не нахожусь на этом листе, код не работает. В качестве справочной информации я запускаю большинство своих кодов под подпрограммами в разделе модулей VBA.
Посмотрите, поможет ли это понять, чего не хватает:
Option Explicit
Sub test()
'Your code:
Cols = Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Count 'Cells inside the range are not qualified
'Corrected code:
Cols = Worksheets("Sheet1").Range(Worksheets("Sheet1").Cells(1, 1), Worksheets("Sheet1").Cells(1, 1).End(xlToRight)).Count
'Above code is too long right?
'Option 1
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
Cols = ws.Range(ws.Cells(1, 1), ws.Cells(1, 1).End(xlToRight)).Count
'Option 2
With ThisWorkbook.Sheets("Sheet1")
.Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight)).Count
End With
'Changing your code works with any option:
With ThisWorkbook.Sheets("Sheet1")
.Cells(1, .Columns.Count).End(xlToLeft).Column 'This option goes from right to left to find the last column with data
End With
End Sub
Кроме того, всегда проверяйте рабочие листы, и рабочие тетради может показаться, что с рабочим листом достаточно, но если вы работаете с более чем 1 рабочей книгой, это также будет проблемой.
Вы очень близки к тому, чтобы сделать это правильно.
Вам нужно помнить, чтобы ссылаться на WB и WS для объекта диапазона каждый. В противном случае VBA будет ссылаться на активный WB и WS.
В Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Count
я насчитываю два Cells
объекта диапазона, на которые нужно ссылаться.
Кроме того, ваша книга не указана для листа, на который вы ссылаетесь. Если в активной книге нет листа с именем «Лист1», вы получите ошибку Индекс вне диапазона.
Чтобы предотвратить такие ошибки, рекомендуется использовать оператор With...End With
. Таким образом, вам нужно будет сначала указать рабочую книгу и лист, чтобы избежать загромождения кода.
Итак, было бы:
With Workbooks(REF).Sheets("Sheet1")
.Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight)).Count
End With