Отказ от использования worksheet.activate для выполнения кода

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

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
239
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Другие вопросы по теме

Создание диапазона внутри databodyrange
Как я могу настроить сводную таблицу Excel для отображения только ранга 1 через VBA?
VBA: как автоматически включать границы ячеек без ошибки (время выполнения 1004) Стиль линии
Поиск пропущенных чисел в заданном диапазоне
Функция VBA для копирования текста из одной неподвижной ячейки для вставки в другую ячейку, перемещение вниз на одну ячейку при каждой вставке/цикле
Как выбрать вариант из выпадающего списка на веб-странице, используя внутренний текст
Нет разрешения на чтение «MSysObjects» (номер ошибки: -2147217911) при использовании Microsoft Excel VBA для запроса доступа только к файлам accdb — mdb работает нормально
EXCEL VBA: редактирование столбца строк с помощью функции
Цикл Excel VBA и интерактивное отображение изменений
VBA - ранжирование от самого высокого до самого низкого путем подсчета отрицательных значений?

Похожие вопросы

Создание диапазона внутри databodyrange
Как пометить элементы с повторяющимися именами и с условием, что его значение меньше 20?
Как я могу настроить сводную таблицу Excel для отображения только ранга 1 через VBA?
VBA: как автоматически включать границы ячеек без ошибки (время выполнения 1004) Стиль линии
Поиск пропущенных чисел в заданном диапазоне
Получение ошибок при работе с типами null или NaN при работе с CSV-файлами с пандами
Игнорировать дубликаты и создавать список уникальных значений, разделенных запятыми, в Excel
Функция VBA для копирования текста из одной неподвижной ячейки для вставки в другую ячейку, перемещение вниз на одну ячейку при каждой вставке/цикле
Как выбрать вариант из выпадающего списка на веб-странице, используя внутренний текст
Как рассчитать разницу между часами, когда ячейки содержат дату в формате даты? И есть некоторые условия тоже