|
▼Jaka さん:
こんばんは。
すごいことに気が付きましたね!!
これ、目安箱ものですね。
Jaka さんの事例を参考に私も少し実験してみました。
>編集 → ジャンプ で、数値、もしくは定数でセルを選択するとC、E、F列は範囲ががでかすぎるとエラーになります。
とありますが、コードだとエラーになりません(Excel2002で確認)。
つまり、
Jaka さんのdatamakeで作成したサンプルデータのC列は
手動操作ではエラーになりますが、
sub test()
Range("c:c").SpecialCells(xlCellTypeConstants).Select
end sub
というコードでは、エラーにならず、C列全体を選択してしまいますね!!
Jaka さんの事例を試した限りでは、8192という数字がエラーになる境界値に
見えます。
例えば、新規ブックの
標準モジュールに
'======================================================================
Sub 準備()
Const 限界値 = 8192
Dim idx As Long
Cells.ClearContents
For idx = 1 To 4
With Range(Cells(1, idx), Cells((idx + 1) * 限界値, idx))
.Formula = "=if(mod(row()," & idx + 1 & ")=0,"""",1)"
.Value = .Value
End With
Next
End Sub
'========================================
Sub テスト()
Dim rng As Range
Set rng = Selection.SpecialCells(xlCellTypeConstants)
MsgBox rng.Areas.Count
End Sub
「準備」というプロシジャーを実行してみてください。
アクティブシートのA列〜D列にサンプルデータを作成します。
A列〜D列それぞれ単独列を選択した状態
(例えば、A列だけ選択する、B列だけ選択する)で「テスト」を実行してみてください。
「テスト」は、SpecialCellsメソッドを実行後、取得できたセル範囲のArea数を
表示するプロシジャーですが、A列を選択した状態で「テスト」を実行した時は、
「8192」という結果を得ることが出来ますが、
B,C,D列では「1」と表示され正しく作動していません。
A列でも セルA16385に「1」を入力して再度、
A列を選択した状態で「テスト」を実行した時は、
「1」と表示され正しく作動していません。
SpecialCellsメソッドで取得されたセル範囲のArea数が8192を超えると
エラーになるらしいことが想像されます。
ところがB列〜D列も
SpecialCellsメソッドで取得されたセル範囲のArea数は「8192」になるように
作成したサンプルです。
???ですね!!
再度、新規ブックの標準モジュールに
'=====================================================================
Sub 準備2()
Const 限界値 = 8192
Dim idx As Long
Cells.ClearContents
For idx = 1 To 4
With Range(Cells(1, idx), Cells((idx + 1) * (限界値 - 1), idx))
.Formula = "=if(mod(row()," & idx + 1 & ")=0,"""",1)"
.Value = .Value
.Cells((idx + 1) * (限界値 - 1) + 1).Value = 1
End With
Next
End Sub
'====================================================================
Sub テスト()
Dim rng As Range
Set rng = Selection.SpecialCells(xlCellTypeConstants)
MsgBox rng.Areas.Count
End Sub
として、準備2を実行した後、前者同様に
A列〜D列それぞれ単独列を選択した状態
(例えば、A列だけ選択する、B列だけ選択する)で「テスト」を実行してみてください。
今度は、A列〜D列まで「8192」と表示されるはずです。
(時間はかかりますよ、私の環境でB列で30秒、C列で55秒、D列で72秒)
では、準備 と準備2 ではどこが違うのか??
SpecialCellsメソッドで取得されるセル範囲の
Area数は、準備 と準備2は、共に同じ8192です。
違いはAreas(Areas.Count).countの値です。
つまり、B〜D列で「1」が連続する最後のセル範囲の数が1以上か1の違いです。
準備
B列 B24574:B24575がB列で最後に「1」が連続するセル範囲でセルの個数 2
C列 C32765:C32767がC列で最後に「1」が連続するセル範囲でセルの個数 3
D列 D40956:D40959がD列で最後に「1」が連続するセル範囲でセルの個数 4
いづれもセルの個数が複数あります。
準備2
B列 B24574がB列で最後に「1」が連続するセル範囲でセルの個数 1
C列 C32765がC列で最後に「1」が連続するセル範囲でセルの個数 1
D列 D40956がD列で最後に「1」が連続するセル範囲でセルの個数 1
この違いがArea数が8192でもエラーになるか否かの境界に思えます。
因みにArea数が8191の時は、最後のAreaのセルの個数は複数でも正常に
SpecialCellsメソッドは処理されます。
私は、ExcelだけでDBもどきの処理をするのはせいぜい5000件以下と
決めていますから、過去作成したプログラムがこの現象を危惧することは
ないと思いますが、これはメモメモですね!!
勉強になりました。ありがとうございます。
|
|