установите диапазон, используя строковую переменную для буквы столбца

#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. да — ошибка копирования/вставки 🙂