Некоторые примеры того, как избежать выбора
Используйте Dim
переменные d
Dim rng as Range
Set
переменная до необходимого диапазона. Есть много способов обратиться к диапазону одной ячейки
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
или многосотовый диапазон
Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1,1), Cells(10,2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10,2)
Вы можете использовать ярлык для Evaluate
метода, но он менее эффективен и его, как правило, следует избегать в рабочем коде.
Set rng = [A1]
Set rng = [A1:B10]
Все приведенные выше примеры относятся к ячейкам на активном листе . Если вы специально не хотите работать только с активным листом, лучше также затемнить Worksheet
переменную.
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1,1)
With ws
Set rng = .Range(.Cells(1,1), .Cells(2,10))
End With
Если вы действительно хотите работать с ActiveSheet
, для ясности , что лучше быть явным. Но будьте осторожны, так как некоторые Worksheet
методы меняют активный лист.
Set rng = ActiveSheet.Range("A1")
Опять же, это относится к активной книге . Если вы специально не хотите работать только с ActiveWorkbook
или ThisWorkbook
, лучше также Dim Workbook
переменную.
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
Если вы действительно хотите работать с ActiveWorkbook
, для ясности , что лучше быть явным. Но будьте осторожны, так как многие WorkBook
методы меняют активную книгу.
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
Вы также можете использовать ThisWorkbook
объект для ссылки на книгу, содержащую исполняемый код.
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Обычный (плохой) кусок кода - открыть книгу, получить некоторые данные и снова закрыть
Это плохо:
Sub foo()
Dim v as Variant
Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = ActiveWorkbook.Sheets(1).Range("A1").Value
Workbooks("SomeAlreadyOpenBook.xlsx").Activate
ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
Workbooks(2).Activate
ActiveWorkbook.Close()
End Sub
И было бы лучше, как:
Sub foo()
Dim v as Variant
Dim wb1 as Workbook
Dim wb2 as Workbook
Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = wb2.Sheets("SomeSheet").Range("A1").Value
wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
wb2.Close()
End Sub
Передайте диапазоны своим Sub
s и Function
s как переменные Range
Sub ClearRange(r as Range)
r.ClearContents
'....
End Sub
Sub MyMacro()
Dim rng as Range
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
ClearRange rng
End Sub
Вы также должны применять методы (такие как Find
и Copy
) к переменным
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2
Если вы циклически изменяете диапазон ячеек, часто лучше (быстрее) сначала скопировать значения диапазона в вариантный массив и выполнить цикл по нему.
Dim dat As Variant
Dim rng As Range
Dim i As Long
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
dat(i,1) = dat(i,1) * 10 'or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet
Это небольшой дегустатор для того, что возможно.
Select
и / или иActiveSheet
т. Д. Совершенно неизбежно. Вот пример, который я нашел: stackoverflow.com/questions/22796286/…