Как я могу получить свой диапазон для задания параметров на листе конфигурации? - PullRequest
0 голосов
/ 12 февраля 2020

Необходимо перенести столбец шаблона на новый лист Sharepoint IDs. В настоящее время эти данные находятся в столбце D, поэтому я настроил рабочий лист конфигурации Configuration, чтобы пользователь мог найти номер столбца, а мой код мог ссылаться на него. Всякий раз, когда эти данные находятся в другом столбце, пользователь может просто ввести их, и приведенный ниже код будет обновляться при ссылках.

Копируя данные, я использовал это:

Dim wsConfig As Worksheet
Set wsConfig = ThisWorkbook.Worksheets("Configuration")
wb.Worksheets("Roster").Range(Cells(wsConfig.Range("B4")), _
                              Cells(wsConfig.Range("B2")), _
                              Cells(lastrow, Cells(wsConfig.Range("B2")))).Copy , _
Destination:=wb.Workheets("Sharepoint IDs").Range(wb.Workheets("Sharepoint IDs").Cells(1, 1), _
wb.Workheets("Sharepoint IDs").Cells(1, 1))

в этом случае вместо Cells(10,4) я поставлю wsConfig.Range("B4") (10) и wsConfig.range("B2") (4), потому что это указывает на то, что пользователь вводит в эти ячейки. Таким образом, он может адаптироваться к тому, что указывает пользователь.

Я продолжаю получать object doesn't support this property or method error в этой строке, есть идеи, почему?

1 Ответ

2 голосов
/ 12 февраля 2020

wsConfig не требуется. Дайте этому листу кодовое имя например ConfigSheet, а затем используйте это имя идентификатора в своем коде всякий раз, когда вам нужно обратиться к этому указанному c листу. Обратите внимание, что вы можете сделать это только с листами, которые существуют в ThisWorkbook во время компиляции; см. мою статью CodeName: Sheet1 для получения дополнительной информации.

Проблема One заключается во вложении квалифицированных и неквалифицированных вызовов Worksheet членов; вызовы квалифицированных членов выполняются для квалифицируемого объекта Worksheet, но вложенные неквалифицированные ссылаются на независимо от того, что ActiveSheet в это время происходит , и если это не объект Worksheet, который квалифицируется вызов внешнего члена, тогда вы можете ожидать ошибку 1004. Инструмент анализа кода stati c от Rubberduck помечает эти неквалифицированные вызовы члена как неявные ссылки ActiveSheet .

wb.Worksheets("Roster").Range(Cells(wsConfig.Range("B4")), _
............................................................................
^ workbook qualifier          ^ Worksheet member call (unqualified)
   ^ Workbook member call           ^ worksheet qualifier
                        ^ Worksheet member call

Неквалифицированные Cells вызовы участников не обязательно идут вразрез с листом wb.Worksheets("Roster"), , но они явно означают . Это следует сделать явным.

Блок With может решить эту проблему:

With wb.Worksheets("Roster")
    .Range(.Cells(ConfigSheet.Range("B4").Value, ConfigSheet.Range("B2".Value)) ...
End With

... но это не идеально, потому что теперь все неявно связано с поздним связыванием, потому что Worksheets возвращает Object и теперь мы теряем проверку во время компиляции.

Лучше всего объявить для нее локальную переменную ... и теперь компилятор начнет жаловаться на вызов Worksheet.Range, который имеет 3 аргумента, вместо закрывать глаза (благодаря неявному позднему связыванию) и взрываться только во время выполнения:

Dim rosterSheet As Worksheet
Set rosterSheet = wb.Worksheets("Roster")

Dim idSheet As Worksheet
Set idSheet = wb.Worksheets("Sharepoint IDs")

With rosterSheet
    .Range(.Cells(ConfigSheet.Range("B4").Value, _
           .Cells(ConfigSheet.Range("B2").Value), _
           .Cells(lastRow, .Cells(ConfigSheet.Range("B2").Value) _
    .Copy Destination:=idSheet.Cells(1, 1)
End With

Worksheet.Range принимает 1 или 2 аргумента: при наличии двух аргументов ожидается, что первая - это верхняя левая ячейка, а вторая - нижняя правая ячейка нужного прямоугольника angular, непрерывный диапазон ячеек.

Я не могу угадать, какой диапазон c вы указали пытаюсь скопировать, но это то, что происходит. В вашем сообщении недостаточно информации, чтобы найти действующий рабочий код; Я предполагаю, что lastrow это то, что B4 говорит в листе конфигурации. Если это так, то может быть таким:

Dim configColumn As Long
configColumn = ConfigSheet.Range("B2").Value
Debug.Assert configColumn > 0

Dim configRow As Long
configRow = ConfigSheet.Range("B4").Value
Debug.Assert configRow > 0

With rosterSheet
    .Range(.Cells(2, configColumn), .Cells(configRow, configColumn)) _
    .Copy Destination:=idSheet.Cells(1, 1)
End With

Избегать ненужного вложения вызовов Range и Cells и всегда явно указывать их с помощью ссылки на объект Worksheet; также избегайте продолжения строки, которая не является полным, полным, допустимым утверждением - спасибо за то, что не разбил именованный аргумент Destination:= на несколько строк.

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