2017-02-28 5 views
2

これは奇妙ですが、第1行の出力と第2行の出力&の出力には違いがあります。行641 & 641がR1C1形式で欠落していることに注意してください。range.AddressとRange.Address(,, xlR1c1)の差異

ヒント?

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、$ 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

Debug.Print rngVisibleRange.Address(, , xlR1C1) 

R1C1:R1C16377 R276C1:R226C1:R462C16377、R474C1:R474C16377、R474C16377、 R479C1:R481C16377、R491C1:R491C16377、R523C1:R524C16377、R560C1:R560C16377、R582C1:R584C16377、R590C1:R591C16377、R637C1:R639C16377

検証可能例:これは希望の場合

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 
+0

おそらく、 'String'の最大長255を渡していますか?より短い範囲を試してみるか、上記の範囲から最初の4つの範囲を削除し、それが正しく表示されるかどうか確認してください。 –

+0

@ShaiRado、私はdebug.printを使ってコンソールに表示しています。 –

+0

@avdheshmaurya私はあなたが気にしないことを願っています。私はちょうどあなたの記事に問題を再現するための小さな証明可能な例を追加しました。 – Ralph

答えて

0

わかりません便利ですが、領域が同じ列にある場合、アドレスは交差した形ではるかに短くなります。例えば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)" 
+1

具体的な例のために短い住所が見つかりました。しかし、私は 'rngVisibleRange'の範囲が彼のコードで変更できると思います。もしそうなら、あなたの「短い」コードでも、おそらくは失敗するでしょう。 255文字より長い 'range.address' **のためにこれを解決する方が良いでしょう。**今は3日後です。 –

+0

返信ありがとうございますスライ、私は私の問題を見るために新しい視点を持って.. .. –

1

255文字を回避するためには、次の2つの機能を限定するもので助けになることができます。

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です2つの機能が仕事をすること:

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 

SetRangeに渡される文字列が実際に範囲を指すために使用できることを確認する検証があります。また、SetRange関数は、任意のExcelファイルで自動的にWorksheet(1)とみなされます。もちろん、これは容易に調整することができ、両方の機能を大幅に向上させることができます

しかしなどxlR​​1C1スタイルやないでアドレスを返す必要がありますSetRangeためかGetRangeAddressかを使用するワークシートなどのオプションパラメータ、私はそれを単純なままにして、元の問題に対処したかったのです。

+0

ありがとうラルフ、私の問題をある程度解決します。私は範囲を設定するために別の関数を使用しているので、最初の関数は修正せずに直接使用することはできません。 –

関連する問題