Excel VBA質問箱 IV

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

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


11359 / 13644 ツリー ←次へ | 前へ→

【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 お礼[未読]

【16518】離れた多数のセルの削除
質問  まむ  - 04/7/30(金) 17:50 -

引用なし
パスワード
   はじめまして、こんにちは^−^
ほとんどVBAについて知識がなく
変わったことがおこるとすぐに慌ててしまいます。

たくさんの離れたセルの削除を一度にしようと思い、

Sheets("月").Select
Range("E4:J9").Select
Selection.ClearContents

を実行しました。Range()の中を51箇所分入力したところ、
コンパイルエラーになってしまい、失敗しました。
3つのときは実行できたので
その構文をそのまま使用したのですが動きません。

何個まで、とかやはりあるのでしょうか?
できないのであれば、3箇所ずつなど区切って作り直そうと
思っていますが、はっきり理由がわかりたいのです。
いろいろなHPを調べてみたのですがわかりませんでした。

どうか教えて下さい。よろしくお願いいたします。

【16520】Re:離れた多数のセルの削除
回答  ちゃっぴ  - 04/7/30(金) 18:01 -

引用なし
パスワード
   > Range()の中を51箇所分入力したところ、

256文字を超えるとコンパイルエラーになるみたいです。
Unionメソッドを使用してみては?

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

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

【16528】Re:離れた多数のセルの削除
発言  ichinose  - 04/7/31(土) 12:06 -

引用なし
パスワード
   こんにちは、皆さん。

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

既にJakaさんがここで色々と検証されていたみたいです。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=54;id=FAQ

他の自由研究考えようかなあ!!

【16530】ありがとうございました^−^
お礼  まむ  - 04/7/31(土) 14:50 -

引用なし
パスワード
   ちゃっぴさん、ichinoseさん、ありがとうございました^0^
すごく助かりました。
初心者なので調べるのも一苦労で^^;

ちゃっぴさんの255文字までというのを参考にいくつかに
分けて入力しました^−^
やはりあまりだらだらしてもだめだったようですね。

ichinoseさんが実験してくださった構文は
大切に印刷して保存してあります。
難しく、まだ理解できないのでもっと
勉強してみます!!!!

本当に本当にありがとうございました。

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