Excel VBA質問箱 IV

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

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


64788 / 76732 ←次へ | 前へ→

【16522】Re:離れた多数のセルの削除
発言  ichinose  - 04/7/30(金) 19:49 -

引用なし
パスワード
   まむさん、ちゃっぴ さん、こんばんは。

>> 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メソッドのみでも大丈夫だと思いますが、
処理によっては、工夫が必要かもしれませんね!!

以上、休み前の自由研究でした。

0 hits

【16518】離れた多数のセルの削除 まむ 04/7/30(金) 17:50 質問
【16520】Re:離れた多数のセルの削除 ちゃっぴ 04/7/30(金) 18:01 回答
【16522】Re:離れた多数のセルの削除 ichinose 04/7/30(金) 19:49 発言
【16528】Re:離れた多数のセルの削除 ichinose 04/7/31(土) 12:06 発言
【16530】ありがとうございました^−^ まむ 04/7/31(土) 14:50 お礼

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