VBA: выбор диапазона по переменным

Я хочу выбрать форматированный диапазон листа Excel. Чтобы определить последнюю и первую строку, я использую следующие функции:

lastColumn = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count
lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row

На следующем шаге я хочу выделить эту область: Формула должна выглядеть так:

Range(cells(1, 1), cells(lastRow, lastColumn).Select

Однако это не работает. Может у кого есть мысли что с ним не так. Большое спасибо!


person Fabian Stolz    schedule 30.08.2012    source источник
comment
Что именно не работает? Я попытался заполнить диапазон от B2 до D4 случайными данными, и ваш код выбрал от A1 до D4. Разве это не то, что вы ожидаете?   -  person ssarabando    schedule 30.08.2012


Ответы (6)


Я записал макрос с «Относительными ссылками», и вот что я получил:

Range("F10").Select
ActiveCell.Offset(0, 3).Range("A1:D11").Select

Вот что я подумал: если выбор диапазона находится в кавычках, VBA действительно хочет STRING и интерпретирует ячейки из него, поэтому попробовал следующее:

Dim MyRange as String
MyRange = "A1:D11"
Range(MyRange).Select

И это сработало :) т.е. просто создайте строку, используя ваши переменные, убедитесь, что она имеет размеры как переменные STRING, и Excel сразу же прочитает ее;)

Следующие протестированы и найдены работающими:

Sub Macro04()

Dim Copyrange As String

Startrow = 1
Lastrow = 11
Let Copyrange = "A" & Startrow & ":" & "D" & Lastrow
Range(Copyrange).Select
End Sub
person Nikesh Rastogi    schedule 30.11.2012

Я столкнулся с чем-то похожим — я хотел создать диапазон на основе некоторых переменных. Использование Worksheet.Cells не работало напрямую, так как я думаю, что значения ячейки были переданы в Range.

Это действительно сработало:

Range(Cells(1, 1).Address(), Cells(lastRow, lastColumn).Address()).Select

Это позаботилось о преобразовании числового местоположения ячейки в то, что ожидает Range, то есть в формат A1.

person Daver    schedule 25.03.2015
comment
Спасибо, я провел все утро, пытаясь понять, как исправить проблему с синтаксисом из-за этого. :) - person Michelle; 23.10.2015
comment
Спасибо, вы спасли мой день! - person Balaji R; 09.08.2017

Если вы просто хотите выбрать используемый диапазон, используйте

ActiveSheet.UsedRange.Select

Если вы хотите выбрать от A1 до конца используемого диапазона, вы можете использовать метод SpecialCells, подобный этому

With ActiveSheet
    .Range(.Cells(1, 1), .Cells.SpecialCells(xlCellTypeLastCell)).Select
End With

Иногда Excel путается в том, какая ячейка является последней. Он никогда не бывает меньше, чем фактически используемый диапазон, но он может быть больше, если некоторые ячейки были удалены. Чтобы избежать этого, вы можете использовать Find и подстановочный знак звездочки, чтобы найти настоящую последнюю ячейку.

Dim rLastCell As Range

With Sheet1
    Set rLastCell = .Cells.Find("*", .Cells(1, 1), xlValues, xlPart, , xlPrevious)

    .Range(.Cells(1, 1), rLastCell).Select
End With

Наконец, убедитесь, что вы выбираете только в том случае, если вам это действительно нужно. Большую часть того, что вам нужно сделать в Excel VBA, вы можете сделать непосредственно с диапазоном, а не выбирать его сначала. Вместо

.Range(.Cells(1, 1), rLastCell).Select
Selection.Font.Bold = True

Ты сможешь

.Range(.Cells(1,1), rLastCells).Font.Bold = True
person Dick Kusleika    schedule 30.08.2012

Вам не хватает закрывающей скобки, т.е. вы не закрываете Range().

Попробуйте это Range(cells(1, 1), cells(lastRow, lastColumn)).Select

Но вам действительно следует взглянуть на другой ответ Дика Куслейки, чтобы найти возможные альтернативы, которые могут вам помочь. В частности, ActiveSheet.UsedRange.Select, который имеет тот же конечный результат, что и ваш код.

person Daniel    schedule 30.08.2012

вы превращаете их в адрес, но ячейки (#, #) используют целочисленные входы, а не адресные входы, поэтому просто используйте lastRow = ActiveSheet.UsedRange.Rows.count и lastColumn = ActiveSheet.UsedRange.Columns.Count

person 273K Kool    schedule 28.06.2013

Я пытался использовать:

Range(cells(1, 1), cells(lastRow, lastColumn)).Select 

где lastRow и lastColumn — целые числа, но во время выполнения получена ошибка 1004. Я использую более старую версию VB (6.5).

Что сработало, так это использовать следующее:

Range(Chr(64 + firstColumn) & firstRow & ":" & Chr(64 + lastColumn) & firstColumn).Select.  
person Chris Bates    schedule 23.09.2014
comment
На самом деле firstColumn следует читать как lastRow ==> Range(Chr(64 + первый столбец) и первая строка &: & Chr(64 + последний столбец) & lastRow).Selec - person Chris Bates; 23.09.2014