为一系列列分配变量并在范围内使用它

时间:2016-12-28 05:51:34

标签: excel-vba vba excel

1 个答案:

答案 0 :(得分:0)

如果我不熟悉某些VBA功能,我会创建一个如下所示的小例程并使用该功能:

Option Explicit
Sub Demo()

  Dim Rng As Range
  Dim Rng1 As Range
  Dim Rng2 As Range
  Dim Rng3 As Range

  With Worksheets("Sheet1")

    Set Rng1 = .Range("A1:D5")
    Set Rng2 = .Range("A6:D10")

    Set Rng = Union(Rng1, Rng2)

    Debug.Print "Rng1=" & Rng1.Address & " Rng2=" & Rng2.Address
    Debug.Print " Rng=" & Rng.Address

    Debug.Print "Notice that Union has combined the two ranges because they are contiguous"
    Debug.Print

    Set Rng1 = .Range("A1:D5")
    Set Rng2 = .Range("F1:F6")

    Set Rng = Union(Rng1, Rng2)

    Debug.Print "Rng1=" & Rng1.Address & " Rng2=" & Rng2.Address
    Debug.Print " Rng=" & Rng.Address

    Debug.Print "Notice that Union could not combined these two ranges because they are not contiguous"
    Debug.Print

    Set Rng1 = .Range("A1:D5")
    Set Rng2 = .Columns("B")

    Set Rng = Intersect(Rng1, Rng2)

    Debug.Print "Rng1=" & Rng1.Address & " Rng2=" & Rng2.Address
    Debug.Print " Rng=" & Rng.Address

    Debug.Print "Intersect gives the overlap between two ranges"
    Debug.Print

  End With

End Sub

上面的宏演示了UnionIntersect提供的一些功能。

您需要注意的关键点:

  • 范围可以是许多非连续子范围的组合。
  • 这些子范围必须都在一个工作表内。
  • 我无法找到范围内子范围数的最终最大值。我发现网页提供的限制为2,000到4,000之间的各种值。另一个声称他们移动4,000个子范围没有问题。我假设有2,000个子范围超出了你的需求,所以这对你来说不是问题。
  • Range.Address是一个限制大于255个字符的字符串。更全面的是,它将返回尽可能多的完整子范围,因为它可以容纳255个字符。

尝试使用我的宏,然后展开它以更好地符合您的要求。

响应更多信息请求的额外部分

我认为您关心的是处理不连续的列。

在我的第一条评论中,我用Dim Rng As Range说,以下将Rng设置为说范围:

Set Rng = Range("A1:AD50")
Set Rng = Range(Cells(1, 1), Cells(50, 30))

另外,A1:AD50是一个可以在运行时创建的字符串,1,1,50和30可以被变量替换。

您有时会看到如下语句:

Set Rng = Range("A1:AD" & RowLast)

其中RowLast已通过多种技术之一设置为最后一次使用的行。

我不相信我曾经使用过如上所述的陈述,因为我更喜欢:

Set Rng = Range(TopLeftCell, BottomRightCell)

其中TopLeftCellBottomRightCell的格式为:

Cells(Row, Column)

Cells(Row, Column)中,Row必须是整数或整数变量。 Column可以是字符串(“A”,“B”,“C”等)或整数(1,2,3等)或字符串变量或整数变量。我通常发现整数变量最方便,因为我可以写:

For ColCrnt = 1 To 30 
  Cells(RowCrnt, ColCrnt).Value = ??? 
Next

在上面我写了RangeCells,它引用了活动工作表。我几乎从不需要引用活动工作表,因为大多数宏都处理应该明确引用的特定工作表。引用活动工作表意味着您必须依赖用户在启动宏时激活正确的工作表,或者必须使用慢速Worksheet.Activate方法。

最好写点像

With Worksheets("Data") 
  RowLast = .Cells(.Rows.Count, "A").End(xlUp).Row       ' Last row with a value in column A  
  ColLast = .Cells(1, .Columns.Count).End(xlToLeft).Row  ' Last column with a value in row 1  
  Set Rng = .Range(.Cells(1, 1), .Cells(RowLast, ColLast))
End With

最后,我想补充一点,您将在任何在线Excel VBA教程的开头附近找到所有这些信息。一两个小时寻找你喜欢的教程,然后通过它完成它将及时回报自己保存得非常快。