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

#excel #vba #reference #range #concatenation

Вопрос:

Я хочу выбрать диапазон форматирования листа 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  

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

Комментарии:

1. Что именно не работает? Я попытался заполнить диапазон от B2 до D4 случайными данными, и ваш код выбрал от A1 до D4. Разве не этого ты ожидал?

Ответ №1:

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

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

Вот что я подумал : если выбор диапазона заключен в кавычки, VBA действительно хочет СТРОКУ и интерпретирует ячейки из нее, поэтому попробовал следующее:

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

И это сработало 🙂 т. е… просто создайте строку, используя свои переменные, обязательно измерьте ее как строковые переменные, и Excel сразу же прочитает ее 😉

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

 Sub Macro04()  Dim Copyrange As String  Startrow = 1 Lastrow = 11 Let Copyrange = "A" amp; Startrow amp; ":" amp; "D" amp; Lastrow Range(Copyrange).Select End Sub  

Ответ №2:

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

Однако это сработало:

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

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

Комментарии:

1. Спасибо, я провел все утро, пытаясь понять, как исправить проблему с синтаксисом из-за этого. 🙂

2. Спасибо, что спасли мне день!

Ответ №3:

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

 ActiveSheet.UsedRange.Select  

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

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

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

 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  

Ответ №4:

Вы пропускаете закрывающую скобку, т. Е. вы не закрываетесь Range() .

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

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

Ответ №5:

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

Ответ №6:

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

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

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

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

 Range(Chr(64   firstColumn) amp; firstRow amp; ":" amp; Chr(64   lastColumn) amp; firstColumn).Select.   

Комментарии:

1. На самом деле firstColumn должен читать lastRow ==gt; Диапазон(Chr(64 firstColumn) amp; firstRow amp; «:» amp; Chr(64 lastColumn) amp; lastRow). Выберите