#excel #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
Однако это не работает. Может быть, у кого-то есть идея, что с этим не так. Большое спасибо!
Комментарии:
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 ==> Диапазон(Chr(64 firstColumn) amp; firstRow amp; «:» amp; Chr(64 lastColumn) amp; lastRow). Выберите