Избегайте использования worksheet.activate для выполнения кода - PullRequest
0 голосов
/ 29 мая 2019

Это должно быть легко. Я хотел бы сократить использование кода 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

Я ожидаю, что этот код будет выполняться, даже если я не нахожусь на Листе 1, так как я определенно определил лист, на котором он должен быть выполнен. Однако, если я не нахожусь на этом листе, код не работает. В качестве справочной информации я запускаю большинство своих кодов в подпрограммах раздела модулей VBA.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Вы очень близки к тому, чтобы сделать это правильно.

Вы должны помнить, что нужно ссылаться на WB и WS для каждого объекта диапазона. В противном случае VBA будет ссылаться на active WB и WS

В Worksheets("Sheet1").Range(Cells(1, 1), Cells(1, 1).End(xlToRight)).Count Я считаю два Cells объекта диапазона, на которые нужно сослаться.
Кроме того, ваша рабочая книга не указана для листа, на который вы ссылаетесь. Если в активной книге нет листа с именем «Sheet1», вы получите ошибку Subscript out of Range .

Чтобы предотвратить такие ошибки, рекомендуется использовать оператор With...End With. Таким образом, вам нужно будет только сначала указать рабочую книгу и лист, чтобы избежать загроможденного кода.

Итак, это будет:

With Workbooks(REF).Sheets("Sheet1")
    .Range(.Cells(1, 1), .Cells(1, 1).End(xlToRight)).Count
End With
1 голос
/ 29 мая 2019

Посмотрите, поможет ли это понять, чего не хватало:

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

Кроме того, всегда можно квалифицировать рабочие листы и рабочие книги может показаться, что с рабочим листом достаточно, но если вы работаете с более чем одной рабочей книгой, не соответствующей требованиям, это тоже будет проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...