range.Address&Range.Address之间的区别(,, xlR1c1)

发现它奇怪,但第一行的输出和第二行的输出有区别。 请注意,在R1C1格式中,行641和641错过了。

任何线索?

PS:为了便于阅读,手动添加了空格。

Debug.Print rngVisibleRange.Address 

$ A $ 1:$ XEW $ 1,$ A $ 226:$ XEW $ 226,$ A $ 239:$ XEW $ 239,$ A $ 370:$ XEW $ 370,$ A $ 373:$ XEW $ 374,$ A $ 462:$ XEW $ 462,$ A $ 474:$ XEW $ 474,$ A $ 479:$ XEW $ 481,$ 491:$ XEW $ 491,$ 523:$ XEW $ 524,$ 560:$ XEW $ 560,$ 582:$ XEW $ 584,$ 590: $ XEW $ 591,$ A $ 637:$ XEW $ 639,$ A $ 641:$ XEW $ 643,$ A $ 648:$ XEW $ 648

 Debug.Print rngVisibleRange.Address(, , xlR1C1) 

R1C1:R1C16377,R226C1:R226C16377,R239C1:R239C16377,R370C1:R370C16377,R373C1:R374C16377,R462C1:R462C16377,R474C1:R474C16377,R479C1:R481C16377,R491C1:R491C16377,R523C1:R524C16377,R560C1:R560C16377,R582C1:R584C16377,R590C1: R591C16377,R637C1:R639C16377

可validation的例子:

 Public Sub test() Dim r As Range Set r = [A1:XEW1,A226:XEW226,A239:XEW239,A370:XEW370,A373:XEW374,A462:XEW462,A474:XEW474,A479:XEW481,A491:XEW491,A523:XEW524,A560:XEW560,A582:XEW584,A590:XEW591,A637:XEW639,A641:XEW643,A648:XEW648] Debug.Print r.Areas.Count ' 16 Debug.Print UBound(Split(r.Address, ",")) ' 15 Debug.Print UBound(Split(r.Address(0, 0), ",")) ' 15 Debug.Print UBound(Split(r.Address(, , xlR1C1), ",")) ' 13 (2 areas missing) End Sub 

为了避免255个字符的限制,以下两个函数可以提供帮助:

 Public Function SetRange(s As String) As Range Dim i As Long For i = LBound(Split(s, ",")) To UBound(Split(s, ",")) If SetRange Is Nothing Then Set SetRange = Worksheets(1).Range(Split(s, ",")(i)) Else Set SetRange = Union(SetRange, Range(Split(s, ",")(i))) End If Next i End Function 

 Public Function GetRangeAddress(r As Range) As String Dim i As Range For Each i In r.Areas GetRangeAddress = GetRangeAddress & "," & i.Address(, , xlR1C1) Next i GetRangeAddress = Mid(GetRangeAddress, 2) End Function 

下面是这两个职能部门完成工作的一个简短的sub

 Option Explicit Private Sub tmpSO() Dim r As Range, s As String s = "$A$1:$XEW$1, $A$226:$XEW$226, $A$239:$XEW$239, $A$370:$XEW$370, $A$373:$XEW$374, $A$462:$XEW$462, $A$474:$XEW$474, $A$479:$XEW$481, $A$491:$XEW$491, $A$523:$XEW$524, $A$560:$XEW$560, $A$582:$XEW$584, $A$590:$XEW$591, $A$637:$XEW$639, $A$641:$XEW$643, $A$648:$XEW$648" Set r = SetRange(s) Debug.Print r.Address Debug.Print r.Address(, , xlR1C1) Debug.Print GetRangeAddress(r) End Sub 

请注意,这些函数中有validation确保传递给SetRange的string实际上可以用来指向一个范围。 此外, SetRange函数自动假定任何给定的Excel文件中的Worksheet(1) 。 当然,这可以很容易地调整,这两个函数可以得到很大的提高:可选参数,如用于SetRange的工作表,或者GetRangeAddress是否返回xlR1C1风格的地址等。

但是,我想保持简单,只是解决了原来的问题。

不知道这是否有用,但是当这些区域在同一列中时,相交forms中的地址可以更短。 例如A:B (1:1,3:4)C1:C2 (R1,R3:R4)

 Dim r As Range, s As String Set r = [A1:XEW1,A226:XEW226,A239:XEW239,A370:XEW370,A373:XEW374,A462:XEW462,A474:XEW474,A479:XEW481,A491:XEW491,A523:XEW524,A560:XEW560,A582:XEW584,A590:XEW591,A637:XEW639,A641:XEW643,A648:XEW648] ' A1 and R1C1 regular form s = r.Address(0, 0) Debug.Print Len(s); UBound(Split(s, ",")); s ' " 187 15 A1:XEW1,A226:XEW226,A239:XEW239,A370:XEW370,A373:XEW374,A462:XEW462,A474:XEW474,A479:XEW481,A491:XEW491,A523:XEW524,A560:XEW560,A582:XEW584,A590:XEW591,A637:XEW639,A641:XEW643,A648:XEW648" s = r.Address(, , xlR1C1) Debug.Print Len(s), UBound(Split(s, ",")), s ' " 247 13 R1C1:R1C16377,R226C1:R226C16377,R239C1:R239C16377,R370C1:R370C16377,R373C1:R374C16377,R462C1:R462C16377,R474C1:R474C16377,R479C1:R481C16377,R491C1:R491C16377,R523C1:R524C16377,R560C1:R560C16377,R582C1:R584C16377,R590C1:R591C16377,R637C1:R639C16377" ' A1 and R1C1 intersect form s = r.Areas(1).EntireColumn.Address(0, 0) & " (" & r.EntireRow.Address(0, 0) & ")" Debug.Print Len(s), UBound(Split(s, ",")), s ' " 131 15 A:XEW (1:1,226:226,239:239,370:370,373:374,462:462,474:474,479:481,491:491,523:524,560:560,582:584,590:591,637:639,641:643,648:648)" ' R1C1 intersect s = r.Areas(1).EntireColumn.Address(, , xlR1C1) & " (" & r.EntireRow.Address(, , xlR1C1) & ")" Debug.Print Len(s), UBound(Split(s, ",")), s ' " 124 15 C1:C16377 (R1,R226,R239,R370,R373:R374,R462,R474,R479:R481,R491,R523:R524,R560,R582:R584,R590:R591,R637:R639,R641:R643,R648)"