VBA:通过变量自适应选择行,列,范围

时间:2018-07-19 20:09:14

标签: excel-vba

我很难选择一个特定的标题。不过,我希望有人能够帮助我。

我知道我可以通过这样的字符串引用范围:

    Dim Str as String

    Str = "A1:A10"

    ThisWorkbook.Sheets("Table1").Range(Str).Select
    [...]
    ThisWorkbook.Sheets("Table2").Range(Str).Select
    [...]

但是通过将两个语句之间的整个语句(例如'Range(“ A1:A10”)')放入变量中,是否也可以解决特定的范围?

这很方便,因为我经常复制和粘贴代码,有时需要引用'Rows(1:5)',有时需要引用'Columns(A:E)'或特定的'Range(“ A1:A10” )'。然后,我需要遍历整个代码并替换这些部分。

最好在开头就在变量中定义此部分,并在整个脚本中使用它。像

    Dim Rfrc As String

    Rfrc = Rows("1:5")
or  Rfrc = Columns("A:E")
or  Rfrc = Range("A1:A10")

    ThisWorkbook.Sheets("Table1").Rfrc.Select
    [...]
    ThisWorkbook.Sheets("Table2").Rfrc.Select
    [...]

这确实是我的第一个问题,希望您能帮助我。到目前为止,我始终可以在这里找到所有问题的答案,但是这次我找不到。

1 个答案:

答案 0 :(得分:1)

“但是也可以通过将整个'Range(“ A1:A10”)'之类的语句放入变量来解决特定的Range吗?“

是-Range变量,是Excel VBA工具包的基本组成部分。不用Set来引用范围,而是直接引用Range变量。

Sub WorkWithRanges()
    Dim rng As Range

    ' Work with a specific range, rows or columns
    With Sheets("Sheet1")
        Set rng = .Range("A1:A10")
        Set rng = .Rows("1:5")
        Set rng = .Columns("A:E")
    End With
End Sub

请注意,您通常不需要Select范围就可以使用它们,并且希望始终完全限定它们在Worksheet上所处的位置-即,尽量避免使用ActiveSheet。 / p>


编辑1

如果要遍历工作表,并且每张工作表上的Range相同,请使用一个引用设置Range

Sub DimARangeOnceOnly()
    Dim ws As Worksheet
    Dim rng As Range

    For Each ws In ThisWorkbook.Worksheets
        With ws
            ' It's the same Range on each Worksheet
            ' And if I need to update the reference I only need to do it once
            Set rng = .Range("A1:A10")
            Set rng = .Rows("1:5")
            Set rng = .Columns("A:E")
            ' ...
        End With
    Next ws
End Sub

如果您想在开始时定义一个引用并在以后使用,这是一种基于String的方法。

Sub UseAStringForARangeReference()
    Dim rowRfrc As String
    Dim colRfrc As String
    Dim rngRfrc As String
    Dim rng As Range
    Dim ws As Worksheet

    rowRfrc = "1:5"
    colRfrc = "A:E"
    rngRfrc = "A1:A10"

    For Each ws In ThisWorkbook.Worksheets
        With ws
            Set rng = .Range(rngRfrc)
            Set rng = .Rows(rowRfrc)
            Set rng = .Columns(colRfrc)
        End With
    Next ws
End Sub