Ответ 1
Я считаю, что вы хотите найти текущую область A1 и окружающих клеток - не обязательно все ячейки на листе. Если так - просто используйте... Range ( "A1" ). CurrentRegion
Я нашел аналогичное решение этого вопроса в С#... См. Ссылку ниже
Как выделить все ячейки на листе в Excel.Range объект С#?
У кого-нибудь есть фрагмент, чтобы сделать это в VBA? Я не очень знаком с VBA, так что это было бы полезно. Вот что у меня так далеко...
Я обычно выбираю данные, используя "Ctrl + стрелка над стрелкой, стрелка вниз", чтобы выделить весь диапазон ячеек. Когда я запускаю это в макросе, он кодирует A1: Q398247930, например. Мне нужно это просто
.SetRange Range("A1:whenever I run out of rows and columns")
Это очень просто, и я мог бы легко сделать это сам без макроса, но я пытаюсь сделать весь процесс макросом, и это всего лишь часть этого.
Sub sort()
'sort Macro
Range("B2").Select
ActiveWorkbook.Worksheets("Master").sort.SortFields.Clear
ActiveWorkbook.Worksheets("Master").sort.SortFields.Add Key:=Range("B2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Master").sort
.SetRange Range("A1:whenever I run out of rows and columns")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
редактировать: есть другие части, где я мог бы использовать тот же код, но диапазон, скажем, "C3: конец строк и столбцов". В VBA есть способ получить местоположение последней ячейки в документе?
Спасибо!
Я считаю, что вы хотите найти текущую область A1 и окружающих клеток - не обязательно все ячейки на листе. Если так - просто используйте... Range ( "A1" ). CurrentRegion
Вы можете просто использовать cells.select
, чтобы выбрать ячейки all на листе. Вы можете получить действительный адрес, указав Range(Cells.Address)
.
Если вы хотите найти последний Used Range
, где вы внесли некоторые изменения форматирования или ввели значение, вы можете вызвать ActiveSheet.UsedRange
и выбрать его там. Надеюсь, что поможет
вы можете использовать все ячейки как объект:
Dim x as Range
Set x = Worksheets("Sheet name").Cells
X теперь является объектом диапазона, который содержит весь рабочий лист
у вас есть несколько вариантов:
Я лично использую использованный диапазон и чаще всего использую метод последней строки и столбца.
Вот как вы это сделаете, используя свойство UsedRange:
Sheets("Sheet_Name").UsedRange.Select
Этот оператор выберет все используемые диапазоны на листе, обратите внимание, что иногда это не очень хорошо работает при удалении столбцов и строк.
Альтернативой является поиск самой последней ячейки, используемой на листе
Dim rngTemp As Range
Set rngTemp = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious)
If Not rngTemp Is Nothing Then
Range(Cells(1, 1), rngTemp).Select
End If
Что делает этот код:
Я бы рекомендовал записывать макрос, например, найденный в этом сообщении;
макрос Excel VBA для фильтрации записей
Но если вы хотите найти конец своих данных, а не конец рабочей книги, если нет пустых ячеек между началом и концом ваших данных, я часто использую что-то вроде этого:
R = 1
Do While Not IsEmpty(Sheets("Sheet1").Cells(R, 1))
R = R + 1
Loop
Range("A5:A" & R).Select 'This will give you a specific selection
Вы остаетесь с R = до номера строки после окончания ваших данных. Это также можно использовать для столбца, а затем вы можете использовать что-то вроде Cells (C, R). Выберите, если вы сделали C представление столбца.
Вот то, что я использовал, я знаю, что это может использовать некоторые усовершенствования, но я думаю, что это поможет другим...
''STYLING''
Dim sheet As Range
' Find Number of rows used
Dim Final As Variant
Final = Range("A1").End(xlDown).Row
' Find Last Column
Dim lCol As Long
lCol = Cells(1, Columns.Count).End(xlToLeft).Column
Set sheet = ActiveWorkbook.ActiveSheet.Range("A" & Final & "", Cells(1, lCol ))
With sheet
.Interior.ColorIndex = 1
End With
Возможно, это может сработать:
Sh.Range( "A1", Sh.Range( "A" и Rows.Count).End(xlUp))
Обращаясь к самому первому вопросу, я изучаю то же самое. Результат, который я получаю, записывая макрос, начинается с выбора ячейки A76:
Sub find_last_row()
Range("A76").Select
Range(Selection, Selection.End(xlDown)).Select
End Sub
Sub SelectAllCellsInSheet(SheetName As String)
lastCol = Sheets(SheetName).Range("a1").End(xlToRight).Column
Lastrow = Sheets(SheetName).Cells(1, 1).End(xlDown).Row
Sheets(SheetName).Range("A1", Sheets(SheetName).Cells(Lastrow, lastCol)).Select
End Sub
Использовать с ActiveSheet:
Call SelectAllCellsInSheet(ActiveSheet.Name)
Другой способ выбора всех ячеек в диапазоне, если данные непрерывны, состоит в использовании Range("A1", Range("A1").End(xlDown).End(xlToRight)).Select
.
Я обнаружил, что метод ".UsedRange" на рабочем листе во многих случаях лучше для решения этой проблемы. Я боролся с проблемой усечения, которая является нормальным поведением метода .CurrentRegion. Использование [Worksheets ("Sheet1"). Range ("A1"). CurrentRegion] не дает желаемых результатов, когда рабочий лист состоит из одного столбца с пробелами в строках (и пробелы требуются). В этом случае ".CurrentRegion" будет обрезаться при первой записи. Я реализовал работу вокруг, но недавно нашел еще лучшую; см. код ниже, который позволяет скопировать весь набор на другой лист или идентифицировать фактический адрес (или только строки и столбцы):
Sub mytest_GetAllUsedCells_in_Worksheet()
Dim myRange
Set myRange = Worksheets("Sheet1").UsedRange
'Alternative code: set myRange = activesheet.UsedRange
'use msgbox or debug.print to show the address range and counts
MsgBox myRange.Address
MsgBox myRange.Columns.Count
MsgBox myRange.Rows.Count
'Copy the Range of data to another sheet
'Note: contains all the cells with that are non-empty
myRange.Copy (Worksheets("Sheet2").Range("A1"))
'Note: transfers all cells starting at "A1" location.
' You can transfer to another area of the 2nd sheet
' by using an alternate starting location like "C5".
End Sub