#excel #vba #range
Вопрос:
Я хотел бы знать, как записать этот диапазон, изменив «G» на строковую переменную strColumn
.
Это код, который я хочу изменить:
Dim lastRowElemento As Integer lastRowElemento = Cells(Rows.Count, "G").End(xlUp).Row Set rngElemento = ws.Range("G2:G" amp; lastRowElemento)
Комментарии:
1.
ws.Range(strColumn amp; "2:" amp; strColumn amp; lastRowElemento)
2. До сих пор я не видел и не использовал это в качестве требования. Не могли бы вы поделиться кодом, в котором вы собираетесь его применить, т. Е. Должен быть другой (лучший способ)? Кроме того, почему вы не используете ссылку на рабочий лист во второй строке, т. Е.
lastRowElemento = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row
?3. Возможно, также
lastRowElemento = ws.Cells(ws.Rows.Count, strColumn).End(xlUp).Row
4. Другой способ:
ws.Range(ws.cells(2, strColumn ),ws.cells(lastRowElemento,strColumn)
Ответ №1:
Применяя метод OP, попробуйте это:
Sub TEST() Dim ws As Worksheet, Rng As Range, sCol As String sCol = "G" Set ws = ThisWorkbook.Sheets("TEST") 'change as required With ws.Columns(sCol) Set Rng = Range(.Cells(2), .Cells(.Rows.Count).End(xlUp)) End With End Sub
Комментарии:
1. У меня возникла проблема, когда я использовал этот код. Если я добавлю
Rng.Copy Destination:=Worksheets(2).Range("A2")
послеEnd With
, то это не сработает. Есть какие-нибудь предложения?2. @vbabeginner Я протестировал код для копирования в
Rng
сWorksheet(2)
Active.Workbook
помощью строкиRng.Copy Destination:=Worksheets(2).Range("A2")
, и он успешно выполнил копирование. Предложите добавить новый вопрос, объясняющий вашу проблему с достаточным количеством деталей, чтобы его можно было воспроизвести. Избегайте расплывчатых утверждений, таких как «Это не работает» , будьте конкретны. Если вы хотите, вы можете добавить комментарий с моим идентификатором к вопросу, чтобы я знал, что ваш вопрос опубликован.3. Спасибо за совет, я это сделаю
Ответ №2:
Ссылка на «Непустой» диапазон столбцов
- На самом деле существует два требования:
ColumnString = G
(Я предпочитаю строку, так как, напримерXFD
, это буква s)FirstRow = 2
Если вы сложите их вместе, вы получите
G2
(подумайте об одной, а не о двух переменных). - Поскольку использование
Find
метода более надежно, чем использованиеEnd
свойства для нахождения самой нижней (последней) непустой ячейки в столбце, я использовал его для записиRefColumn
функции, которую в вашем случае можно использовать следующим образом:Set rngElemento = RefColumn(ws.Range("G2"))
- Я оставлю это на ваше усмотрение, если вы собираетесь проверить, есть ли данные (обычно вы знаете, что они есть), но я предпочитаю сохранить в коде хотя бы «упрощенный» тест:
If rngElemento is Nothing Then Exit Sub ' no data ' Continue...
Код
Option Explicit Sub RefColumnTEST() Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code Dim ws As Worksheet: Set ws = wb.Worksheets("Sheet1") Dim rg As Range: Set rg = RefColumn(ws.Range("G2")) If rg Is Nothing Then ' the range 'G2:G1048576' is empty MsgBox "No data.", vbCritical Else MsgBox rg.Address(0, 0), vbInformation End If End Sub '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Purpose: Creates a reference to the one-column range from the first cell ' of a range ('FirstCell') to the bottom-most non-empty cell ' of the first cell's worksheet column. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Function RefColumn( _ ByVal FirstCell As Range) _ As Range If FirstCell Is Nothing Then Exit Function With FirstCell.Cells(1) Dim lCell As Range Set lCell = .Resize(.Worksheet.Rows.Count - .Row 1) _ .Find("*", , xlFormulas, , , xlPrevious) If lCell Is Nothing Then Exit Function Set RefColumn = .Resize(lCell.Row - .Row 1) End With End Function
Соответствие Вашим Требованиям
- Аналогично моему предпочтительному способу, вы можете использовать
RefData
функцию:
Function RefData( _ ByVal ws As Worksheet, _ ByVal ColumnIndex As Variant) _ As Range On Error GoTo ClearError With ws.Columns(ColumnIndex).Resize(ws.Rows.Count - 1).Offset(1) Set RefData = _ .Resize(.Find("*", , xlFormulas, , , xlPrevious).Row - 1) End With ProcExit: Exit Function ClearError: Resume ProcExit End Function
которые вы можете использовать следующим образом:
Set rngElemento = RefData(ws, "G") Set rngElemento = RefData(ws, 7) ' or: Const strColumn As String = "G" Set rngElemento = RefData(ws, strColumn)
Комментарии:
1. Только одно улучшение: У вас может быть функция
getLastRowRow(ws as worksheet)
для возвратаws.Find("*", , xlFormulas, , , xlPrevious).Row
. Это один из фрагментов кода, которые я всегда добавляю в свои проекты — и тем самым почти «забыл» синтаксис для этой части поиска.2. Ты имеешь в виду
ws.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
.3. да — ошибка копирования/вставки 🙂