Excel VBA質問箱 IV

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

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


11185 / 13646 ツリー ←次へ | 前へ→

【17606】行の非表示マクロについて phoo 04/9/3(金) 11:28 質問[未読]
【17612】Re:行の非表示マクロについて Jaka 04/9/3(金) 12:23 回答[未読]
【17613】Re:行の非表示マクロについて かみちゃん 04/9/3(金) 12:38 発言[未読]
【17614】Re:行の非表示マクロについて Asaki 04/9/3(金) 12:44 発言[未読]
【17621】Re:行の非表示マクロについて phoo 04/9/3(金) 14:23 お礼[未読]

【17606】行の非表示マクロについて
質問  phoo  - 04/9/3(金) 11:28 -

引用なし
パスワード
   複数行を一度に非表示にするマクロを作成しているのですが。

まず、C列を検索し、*のある行をワーク領域に格納しています。
その後に、ワーク領域に格納したデータで行を一度で非表示にしたいのですが、
エラーが発生します。
エラー内容:実行時エラー'1004'
      アプリケーション定義またはオブジェクト定義のエラーです。

どーも、ワーク領域に格納したデータ長が256を超えると
エラーが発生しているので、
現状、複数回に分けて、非表示にしています。
どーすれば、一度で非表示にできますか?
よろしくお願いします。
'--------------------------------------------------------------------
Private Sub cmd_非表示_Click()

  Dim I      As Long
  Dim Count    As Integer
  Dim ST, ED   As Date
  Dim WK_A, WK_C As String
  Dim WK_B()   As String
  
  ST = Now()
  Count = 0
  Application.ScreenUpdating = False
  For I = 1 To 65536 Step 1
    If Range("C" & I) = "" Or Range("C" & I) = vbNullString Then
    Else
      If Range("C" & I) = "end" Then
        Exit For
      End If
      If InStr(Range("C" & I), "*") <> 0 Then
        ReDim Preserve WK_B(Count)
        WK_B(Count) = I & ":" & I
        Count = Count + 1
      End If
    End If
  Next I
  WK_A = Join(WK_B, ",")
  Range(WK_A).Select '←ここで、エラーが発生する!
  Selection.EntireRow.Hidden = True
  Range("A1").Select
  Application.ScreenUpdating = True
  Set ActiveSheet.HPageBreaks(1).Location = Range("A110")
  ED = Now()
  'MsgBox "End" & vbCr & "Time=" & Format(ED - ST, "hh:mm:ss")
  
End Sub

【17612】Re:行の非表示マクロについて
回答  Jaka  - 04/9/3(金) 12:23 -

引用なし
パスワード
   遅いですが、さほど多くないようですので...。
目安箱見てね。

PC&メモリ量も関係していると思いますが、10000行は、絶対止めたほうがいいと思います。また、5000行も避けた方がいいです。
3000ぐらいかな良いと思います。
PCスペックによるけど...。

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

【17613】Re:行の非表示マクロについて
発言  かみちゃん  - 04/9/3(金) 12:38 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>どーすれば、一度で非表示にできますか?

ということですから、
> If InStr(Range("C" & I), "*") <> 0 Then
で、C列I行のセルに*の文字があれば、その都度非表示にするのではいけませんよね?

【17614】Re:行の非表示マクロについて
発言  Asaki  - 04/9/3(金) 12:44 -

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

>どーも、ワーク領域に格納したデータ長が256を超えると
>エラーが発生しているので、
この部分は、制限になるので、どうにもならないですね。

処理対象となる行数にもよりますが、
Union と、1行ずつと、それ以外の複数回に分割する方法と、
いずれか一番よさそうな方法を選択する事になるのでは、と思います。

【17621】Re:行の非表示マクロについて
お礼  phoo  - 04/9/3(金) 14:23 -

引用なし
パスワード
   Jaka様:かみちゃん様:Asaki様

色々なアドバイス有難う御座います。

【補足】
レコード数は、約500行。
そのうち、*の行は約100行です。
(*の行は決まっていません。)

【検証】
1.Union  ⇒ 約1秒
2.1行ずつ ⇒ 約7秒
3.それ以外の複数回に分割 ⇒ 約1秒

【結果】
結果としては、行数もさほど多くなく、
処理時間も早いですし、
コードの見た目もよかったので、
1のUnionを最終的に選びました。

大変参考になりました。
有難う御座います。

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