# こんにちは^^
既に回答は出ていますので、またオマケ程度の話ですが、
参照文字列に関する制限は、文字の長さに対して255です。
(非VBA Excel のセル参照に倣います)
引数の数や、領域(Areas)の数の問題ではありません。
■255文字で表せる領域(列|行、除く)の最大数を試してみました。
Sub Test_RngRef2Areas()' 非実践的なテストです。(ちょと遊び)
Const S_REF = _
"(A:A,B:B,C:C,D:D,E:E,F:F,G:G,H:H,I:I,J:J,K:K,L:L,M:M" _
& ",N:N,O:O,P:P,Q:Q,R:R,S:S,T:T,U:U,V:V,W:W,X:X,Y:Y,Z:Z)" _
& " " _
& "(1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:10,11:11" _
& ",12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19" _
& ",20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27)"
Rem ↑重複なし。領域数:26 * 27 = 702
Rem ↓重複あり。領域数:31 * 32 = 992
' Const S_REF = _
"(A:A,B:B,C:C,D:D,E:E,F:F,G:G,H:H,I:I,J:J,K:K,L:L,M:M,N:N,O:O,P:P" _
& ",Q:Q,R:R,S:S,T:T,U:U,V:V,W:W,X:X,Y:Y,Z:Z,A:A,B:B,C:C,D:D,E:E)" _
& " " _
& "(1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,1:1,2:2,3:3,4:4,5:5,6:6,7:7" _
& ",8:8,9:9,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,1:1,2:2,3:3,4:4,5:5)"
Dim l: l = Len(S_REF)
If l > 255 Then
MsgBox l
Else
Range(S_REF).Select
MsgBox "Len(Ref_Str) :" & l _
& vbLf & ".Areas.Count :" & Selection.Areas.Count
End If
End Sub
参照演算子 ":" "," " "
括弧 "(" ")"
参照文字(A1形式)
すべての合計で255文字迄ということです。(勿論""は数えません)
引数の数で言えば、文字列(全体)として、1、なのです。
領域数の制限もある筈ですが、問題になり得ない証として以上を書きました。
# No.4007086でも説明書いていたような、、、(^^;)
# 以降は、ついでのような、書きたいことを書くような感もあり。
■参照演算子 スペース、(積、AND)の話。(今回の主題?オマケ?)
Range("A:J 1:10")
と書いて、
Range("A1:J10")
と同じ意味になります。
単領域では却って字数が多くなりますが、複数領域では、
Range("(B:D,F:H) (2:4,6:8)").BorderAround , 3
のような書き方で、
Range("B2:D4,F2:H4,B6:D8,F6:H8").BorderAround , 3
と同じ結果で、字数を少なく、範囲(多くの領域)を捉え易く、できます。
この特徴が、上記テストの702, 992という結果に出ています。
非VBA Excel では基本テクと呼べるのでしょうか、、、?
=SUM((B:D,F:H) (2:4,6:8))
と似たような使い方です。(この数式内の引数の数は1です!)
■Rangeによる領域指定とUnion、Intersect
Range("A1,B1,C1,D1")
は4つの領域を持ちます。これに対し、
Union(Range("A1"),Range("B1"),Range("C1"),Range("D1"))
は(似たような命令ですが)結果的に
Range("A1:D1")
と同じ意味になり、ひとつの領域です。
UnionやIntersectには、
共通した行範囲・列範囲にある連続した矩形(四角い)範囲を
纏めて整理する(規則性は複雑です)機能があります。
(その分、動作は少し重いようですね。XL2000では特に)
これに対して、
領域の数とその順列(インデックス)を
指定(間接的にアクティブセルも指定)できるのが、
Rangeによる領域指定という言い方になります。
Range("(D:E,B:C) (4:5,2:3)").Select
と、(似たような命令ですが)
Intersect(Range("D:E,B:C"), Range("4:5,2:3")).Select
を、
Debug.? Selection.Address; vbLf; ActiveCell.Address
で、比較してみると違い(それぞれの特徴)が解ると思います。
■Rangeによる領域指定の用法
(スペース演算子なしで実践する機会は少ないと思います。)
例に挙げた.BorderAroundのような書式の一括処理などが主ですが、
プロパティやメソッドによって、
*全領域を処理
*.Areas(1)のみ処理
*エラー
と挙動が分れます。
(この点が、一般にはあまり馴染んでない理由だと私は考えています。)
ひとつひとつ挙動を確認しながらTipsにしていけば、
きっと役に立つ(活用の幅は広い)と思うのですが、、、。
書式全般(.Font .Interior .Locked .Borders ...)、
.Clear .Delete ...等の処理では、私には必要不可欠な手法です。
(∵私が作るファイルは殆ど、シートを持たないアドインなので余計に)
他の用法として、複数のセル範囲を其々Range型変数にSetする代わりに、
纏めてSetしてからArea毎に(ループなど)処理することで、
効率的になる場合もあるようです。
ただし、勿論、配列やコレクションへの理解が前提になりますし、
ご承知のように簡単にエラーが出ますから、全般に難易度はやや高めです。
# まだよくわからないのですが、Unionにも(XL2000、02、03で確認済)、
# .SpecialCellsにも(XL2000で確認済)、
# 領域に対する何らか(数?or?)の制限があるようですね。(研究してみます)
■コメント:領域指定について(閲覧された方へ)
VBAを学ぶ課程として、
最初の内はループを用いながら、オブジェクトの扱いや条件分岐などに慣れ、
応用的なコーディング『経験』を重ねて、十分な知識を身に付けていきます。
その先のステップで、能率、効率、安定、等の課題が
「自然に向こうからやって来る」と思います。
今その必要を感じない方はこの話を、情報として「こんなのもある」程度に、
とどめておいて下さい。ショートカットして消化不良になりませんよう。
また、VBAを職場で扱う方は、「いつ担当引継があっても困らないように」
誰でも読める記述を心がけて欲しいです。(請負い仕事で今も閉口してます;)
今回の話はそういう意味では、あまり知られていない、使われない、手法
に関する話ですし、試験に基づく研究ネタとしてご理解ください。
趣味的?と言われても否定しません(^^;
が、
非VBA Excel の習熟が進んだ方なら、すんなり実践できるものとも思っています。
実はこれ、非VBA Excel の特性に関する理解の問題であって、根本的には
VBAやVisual Basicの題目ではないという旨のご意見を頂いたこともあります。
(ならばと、部分的にはVBAビギナーにこそ奨めてみたいというのが
私の本音なのですが、同じ意見に出会ったことはまだありません。)
# それでは、、、また^^
投稿日時 - 2009-01-28 09:25:14