【问题标题】:set range using string variable for column letter使用列字母的字符串变量设置范围
【发布时间】:2021-12-13 04:35:04
【问题描述】:

我想知道如何编写这个范围,将“G”更改为字符串变量strColumn

这是我要更改的代码:

   Dim lastRowElemento As Integer
   lastRowElemento = Cells(Rows.Count, "G").End(xlUp).Row
   Set rngElemento = ws.Range("G2:G" & lastRowElemento)

【问题讨论】:

  • ws.Range(strColumn & "2:" & strColumn & lastRowElemento)
  • 到目前为止,我还没有看到或将其用作要求。您能否分享您打算应用它的代码,即应该有另一个(更好的方法)?另外,您为什么不使用第二行中的工作表参考,即lastRowElemento = ws.Cells(ws.Rows.Count, "G").End(xlUp).Row
  • 可能还有lastRowElemento = ws.Cells(ws.Rows.Count, strColumn).End(xlUp).Row
  • 另一种方式:ws.Range(ws.cells(2, strColumn ),ws.cells(lastRowElemento,strColumn)

标签: excel vba range


【解决方案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

【讨论】:

  • 我在使用这段代码时遇到了问题。如果我在End With 之后添加Rng.Copy Destination:=Worksheets(2).Range("A2"),则它不起作用。有什么建议吗?
  • @vbabeginner 我使用Rng.Copy Destination:=Worksheets(2).Range("A2")这一行测试了将Active.WorkbookRng复制到Worksheet(2)的代码,它成功地执行了复制。建议添加一个新问题,用足够的细节解释您的问题,以便可以复制。避免模​​糊的陈述,例如“它不起作用”,要具体。如果您愿意,可以在问题中添加带有我 ID 的评论,以便我知道您的问题已发布。
  • 谢谢你的建议,我会做的
【解决方案2】:

引用“非空”列范围

  • 其实有两个要求:

    • ColumnString = G(我更喜欢 string,因为例如 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)

【讨论】:

  • 只有一项改进:您可以有一个函数getLastRowRow(ws as worksheet) 用于返回ws.Find("*", , xlFormulas, , , xlPrevious).Row。这是我经常添加到我的项目中的代码 sn-ps 之一——因此几乎“忘记”了该查找部分的语法。
  • 你的意思是ws.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
  • 是的 - 复制/粘贴错误:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2012-03-17
相关资源
最近更新 更多