Есть два подхода, которые вы можете предпринять. Я использую один или оба в своем коде - это не одна или другие ситуации.
объявляются переменные
Начните с определения каждого листа, который вы хотите работать в переменной. Обычно я остаюсь на уровне листа, но это всего лишь личный выбор. Если вы предпочитаете работать на уровне рабочей книги, все в порядке. Процедура может выглядеть так:
Dim shSource as Worksheet
Dim shDest as Worksheet
Set shSource = Workbooks("SomeBook").Worksheets(1)
Set shDest = ActiveWorkbook.Worksheets("Summary")
тогда, когда я ссылаться на диапазон или клетку или что-нибудь еще на одном листе, я предварить его с этим переменным объектом листа. Даже если мне нужно попасть в книгу, я начинаю с листа. Если мне нужно, например, закрыть исходную книгу из приведенного выше примера, я хотел бы использовать
shSource.Parent.Close False
настроить шпунтовую переменный мне нужно, и тогда все я делаю, это в терминах этих переменных.
Редактировать
Если вы открываете или создавать рабочие книги, то переменные, безусловно, путь.Например, если вы открываете книгу, вы можете использовать один из этих двух примеров
Dim wb As Workbook
Set wb = Workbooks.Open(C:\...)
Dim ws As Worksheet
Set ws = Workbooks.Open("C:\...).Worksheets(1)
или создавая новый, один из этих двух примеров:
Dim wb As Workbook
Set wb = Workbooks.Add
Dim ws as Worksheet
Set ws = Workbooks.Add.Worksheets(1)
с блоками
Когда я только пытаюсь что-то разобраться, кажется, что это пустая трата, чтобы создать кучу переменных. В таких случаях я использую блок «С блоком», поэтому у меня все еще есть полностью квалифицированные ссылки, но без кучу беспорядка в моем коде.
With Workbook("MyBook")
With .Worksheets("First_Sheet")
.Range("A1").Value = "stuff"
End With
With .Worksheets("Second_Sheet")
.Range("G10").Formula = "=A1"
End With
End With
Я, вероятно, предпочитаю метод переменной, но я использую их оба.
Edit 2: Неявное Реферирование
Вы должны всегда явно ссылаться на свои книги и рабочие листы, но она по-прежнему обучающее знать, как Excel будет вести себя, если вы этого не сделаете. Строка кода, начинающаяся как Range("A1").Value = ...
, называется неквалифицированной ссылкой. Вы ссылаетесь на диапазон, но вы не говорите, на каком листе его или на какой книге находится этот лист. Excel обрабатывает неквалифицированные ссылки по-разному в зависимости от того, где находится ваш код.
В модуле класса листа (например, когда вы используете события листа, такие как SelectionChange), неквалифицированные ссылки относятся к листу, представленному этим модулем. Если вы находитесь в модуле Sheet1, работающем в событии «Change», и вы вводите код x = Range("G1").Value
, тогда G1, на который вы ссылаетесь, находится на Sheet1. В этом случае вы должны использовать ключевое слово Me
, а не полагаться на Excel.
В любом другом модуле (например, в стандартном модуле) неквалифицированные ссылки относятся к ActiveSheet. Тот же код x = Range("G1").Value
в стандартном модуле относится к G1 на любом листе с фокусом.
Обработка Excel неквалифицированных ссылок очень надежна. Вы можете легко создать надежный код, полагаясь на Excel для разрешения квалифицированных ссылок. Но вы не должны. Ваш код будет более читабельным и более легким для отладки, если вы будете квалифицировать каждую ссылку. Я квалифицирую каждую ссылку. И это не одна из тех вещей, которые я «всегда» делаю, кроме как когда я ленив - я действительно делаю это в 100% случаев.
Было бы легче ответить, если бы вы включили некоторые соответствующие биты кода. В общем, вы на правильном пути, потому что вы всегда должны полностью квалифицировать имена книг. –