|
まむさん、ちゃっぴ さん、こんばんは。
>> Range()の中を51箇所分入力したところ、
>256文字を超えるとコンパイルエラーになるみたいです。
正確には、255文字までOKで、256は、OUTでした。
1バイト分しか数えないのでしょうかねえ!!
>Unionメソッドを使用してみては?
これは、賛成なんですが・・・。
せっかくのご質問だったのでいくつか実験してみました。
実験1
'==========================================================
Sub test1()
Dim rng As Range
st = Now()
Set rng = Cells(1, 1)
For Each c In Range("a2:j50")
Set rng = Union(rng, c)
Next
rng.Select
MsgBox Format(Now() - st, "hh:mm:ss")
MsgBox Len(rng.Address) & ":::" & rng.Address
End Sub
これは、Unionメソッドを使用してセルA1とA2:J50の集合処理をしたのですが、
これは、速かった(私の環境では、00:00:00でした)。
実験2
次に全部離れたセル範囲の集合処理をしてみました。
'=========================================================
Sub test2()
Dim rng As Range
st = Now()
Set rng = Cells(1, 1)
For idx = 1 To 151 Step 2
For jdx = 3 To 51 Step 2
Set rng = Union(rng, Cells(idx, jdx))
Next
Next
rng.Select
MsgBox Format(Now() - st, "hh:mm:ss")
MsgBox Len(rng.Address) & ":::" & rng.Address
End Sub
この処理時間は、なんと00:01:10もかかりました。まあ、処理時間は
飛び飛びだとExcelも大変なんだなあ と、理解は示しましたが・・・。
疑問に思ったのは、
MsgBox Len(rng.Address) & ":::" & rng.Address
このrng.Addressで表示される文字列長は、256なんです。
で、これを
Range(rng.address).select
なんてすると、エラーになりました。
実験3
実験2の範囲をUnionメソッドとセルアドレスの混合で行ってみました。
'============================================================
Sub test3()
On Error Resume Next
Dim rng As Range
Dim add As String
st=now()
Set rng = Cells(1, 1)
add = ""
For idx = 1 To 151 Step 2
For jdx = 3 To 51 Step 2
If Len(IIf(add = "", add & Cells(idx, jdx).Address, add & "," & Cells(idx, jdx).Address)) <= 255 Then
add = IIf(add = "", add & Cells(idx, jdx).Address, add & "," & Cells(idx, jdx).Address)
Else
Set rng = Union(rng, Range(add))
add = Cells(idx, jdx).Address
End If
Next
Next
Set rng = Union(rng, Range(add))
rng.Select
MsgBox Format(Now() - st, "hh:mm:ss")
MsgBox Len(rng.Address) & ":::" & rng.Address
End Sub
とすると、約3秒でした。
まむさんの場合は、Unionメソッドのみでも大丈夫だと思いますが、
処理によっては、工夫が必要かもしれませんね!!
以上、休み前の自由研究でした。
|
|