Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


38446 / 76732 ←次へ | 前へ→

【43422】Re:SpecialCellsの限界って・・・。
発言  ichinose  - 06/10/13(金) 22:30 -

引用なし
パスワード
   ▼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件以下と
決めていますから、過去作成したプログラムがこの現象を危惧することは
ないと思いますが、これはメモメモですね!!

勉強になりました。ありがとうございます。
2 hits

【43413】SpecialCellsの限界って・・・。 Jaka 06/10/13(金) 15:51 質問
【43422】Re:SpecialCellsの限界って・・・。 ichinose 06/10/13(金) 22:30 発言
【43423】Re:SpecialCellsの限界って・・・。 [名前なし] 06/10/13(金) 23:26 発言
【43425】Re:SpecialCellsの限界って・・・。 Ap 06/10/14(土) 9:14 発言
【43447】Re:SpecialCellsの限界って・・・。 Jaka 06/10/16(月) 13:58 お礼

38446 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free