Я хотел бы знать, могу ли я сохранить общий диапазон без привязки к нему имени листа?

Допустим, моя программа создает лист для каждого дня недели, а затем делает заголовки для каждого листа. Я хочу дать ему несколько диапазонов, и он должен объединить и добавить разные заголовки к этим диапазонам на КАЖДОМ листе. Таким образом, заголовки каждого листа выглядят одинаково.

Например, у меня есть следующий диапазон:

...
Set rowTwoHeadingKiloRange = Range(Cells(2, 4), Cells(2, 8)) 
Set rowTwoHeadingUnitRange = Range(Cells(2, 10), Cells(2, 14)) 
...

Теперь, когда я пытаюсь передать этот диапазон в словаре на каждый создаваемый лист, я обнаруживаю, что у меня есть нежелательные результаты, поскольку некоторые заголовки создаются на листах, которым они не принадлежат (и я думаю, что это потому, что когда диапазон созданный, он прикрепляется к активному листу в этот момент - который может время от времени изменяться).

Итак, теперь у меня есть функция, которая выглядит примерно так ...

Public Function colmHeadingsAndSpacing(sheetName)
    With Worksheets(sheetName)
        ...
        Set rowTwoHeadingKiloRange = Range(Cells(2, 4), Cells(2, 8)) 
        Set rowTwoHeadingUnitRange = Range(Cells(2, 10), Cells(2, 14)) 
        ...
    End with
End Function

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

Второй вопрос, есть ли способ узнать по диапазону, какой лист «прикреплен» к диапазону. Что-то вроде: msgbox rowTwoHeadingKiloRange.worksheets.name, что даст результат Sunday

0
Alfa Bravo 3 Янв 2018 в 15:58

2 ответа

Лучший ответ

Вы были близки. Чтобы прикрепить Range и Cell к оператору With, вам необходимо использовать точку . перед ключевым словом. Как это:

Public Function colmHeadingsAndSpacing(sheetName)
    With ThisWorkbook.Worksheets(sheetName)
        ...
        Set rowTwoHeadingKiloRange = .Range(.Cells(2, 4), .Cells(2, 8)) 
        Set rowTwoHeadingUnitRange = .Range(.Cells(2, 10), .Cells(2, 14)) 
        ...
    End with
End Function

Это хорошая практика, чтобы квалифицировать каждую ссылку на диапазон с помощью прилагаемого рабочего листа. Я пошел еще дальше и включил ссылку на книгу (ThisWorkbook). Теперь он полностью квалифицирован.

По второму вопросу - попробуйте MsgBox rowTwoHeadingKiloRange.Parent.Name получить имя рабочего листа. Обычно лучше начать с имени рабочего листа, чем возвращаться к нему.

3
CallumDA 3 Янв 2018 в 13:10

Диапазон - это ссылка на (в основном прямоугольную) область на листе. Таким образом, обращение к диапазону без определения листа типа Set r = Range ("B2:F10") в точности совпадает с Set r = Activeworkbook.Activesheet.Range ("B2:F10"). Таким образом, для более профессиональных целей VBA предлагает вам гибкость следующим образом:

Dim wb As Workbook
Dim ws As Worksheet

Set wb = Workbooks.Add   ' open new xlsx file
Set ws = Activesheet OR 
Set ws = wb.Activesheet OR 
Set ws = wb.Sheets(1)
' do something else here and later when neither wb nor ws is active, you can
Set r = wb.ws.Range("B5:G22") OR 
Set r = ws.Range("B5:G22")

Дополнение: для изготовления нескольких листов одного формата вы также можете рассмотреть возможность использования шаблонов. Тогда вам нужно программно заполнить только различия. Меньше программирования, проще обслуживание :)

0
AcsErno 3 Янв 2018 в 14:02