エクセルコードが遅くなる理由と改善方法

このQ&Aのポイント
  • エクセルのコードが遅くなる理由とは、処理が重くなる要因が複数存在するためです。処理がストップする原因や処理時間を短縮する方法についても考えましょう。
  • ListBox1をクリックした際の処理やListBox2のチェックをクリアする処理が遅い原因となっています。これらの処理を最適化することで、コードの動作を高速化することができます。
  • 処理の最適化には、ループ回数の削減や使用するオブジェクトの効率的な操作などが含まれます。また、計算方法や表示の更新を最小限にすることも重要です。
回答を見る
  • ベストアンサー

エクセル コードがどうしても早くならない

いつもお世話になります。 今回は下記コードを記載したのですが、どうにも遅いので何とかする方法があれば との思いから投稿させて頂きます。 ListBox1(590以上の項目があります)をクリックしたら 非対象シートのA列を検索して、ヒットした場合 同シートのB列と同様の数字をListBox2から探し出して チェックを付けて行く。(一応、計算ストップ等のコードは試しましたが変わりません) 基本情報としては 最初に、選択されているかもしれないListBox2のチェックをクリアをします。 ListBoxの1,2は同じ情報を使っています。 なので、ListBox1と同じ情報のListBox2については、最初の方でチェックを 付ける処理をしています。((1)) その後の処理が遅いのですが、ListBox1のどれかをクリックする度に20秒以上 動きが止まってしまうので、何か対策があればどうぞ宜しくお願い致します。 ※なぜか処理が終わるとフォームが消えてしまいます。例えばブラウザを一度アクティブ  にしてからエクセルに戻ると出てくるのですが、何が原因でしょうか? Private Sub ListBox1_Click() Dim RR, HRR As Range Dim SID As Integer ' 'With Application ' .ScreenUpdating = False ' .EnableEvents = False ' .Calculation = xlCalculationManual 'End With '// 選択されているかもしれないListBox2のチェックをクリア For i = 0 To Me.ListBox2.ListCount - 1 ListBox2.Selected(i) = False Next Debug.Print Time; " - 同じ会社にチェックを付けるスタート" '// 同じ会社にチェックを付ける For si = 0 To ListBox2.ListCount - 1 If Me.ListBox2.List(si, 0) = RR Then Me.ListBox2.Selected(si) = True si = 0 Exit For End If Next Debug.Print Time; " - 同じ会社にチェックを付ける終り" Debug.Print Time; " - 非対象シートにある対象外にチェックを付ける スタート" '// 非対象シートにある対象外にチェックを付ける With Sheets("非対象") For Each RR In .Range(.Cells(1, 1), .Cells(.Cells(600000, 1).End(xlDown).Row - 1, 1)) If RR = Me.ListBox1 Then For si = 0 To ListBox2.ListCount - 1 If Me.ListBox2.List(si, 0) = .Cells(RR.Row, 2) Then Me.ListBox2.Selected(si) = True End If Next End If Next End With Debug.Print Time; " - 非対象シートにある対象外にチェックを付ける 終り" End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8016/17133)
回答No.1

とりあえず For Each RR In .Range(.Cells(1, 1), .Cells(.Cells(600000, 1).End(xlDown).Row - 1, 1)) これを For Each RR In .Range(.Cells(1, 1), .Cells(.Cells(600000, 1).End(xlUp).Row - 1, 1)) に変更してみたらどうでしょう。

merrykun2006
質問者

お礼

完全にやらかしてましたね。。。 セルを最終行までやってれば遅くなるのは当たり前ですね(-_-;) ご指摘ありがとうございました! 瞬時に終わる様になりました!!

その他の回答 (1)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんにちは 最初の、'// 同じ会社にチェックを付ける For si = 0 To ListBox2.ListCount - 1 If Me.ListBox2.List(si, 0) = RR Then の時点で「RR」には何もセットされていませんけど?

関連するQ&A

  • EXCEL VBA 配列について

    リストボックスの選択から重複しないリストボックスに値を抽出する コードを作成しました。 しかし、スペックの低いPCで動作させると、処理に時間が かかってしまいます。 配列を使うと処理が早くなるとウェブで調べたのですが、 いまいち理解が出来ません。 やりたいこと ・配列にリストボックスの値を入れる ・配列から重複を削除する? どなたかご教授ください。 コードは下記のようになっています。    If Not UserForm1.ListBox6.Value = 0 Then      For w = UserForm1.ListBox1.ListCount - 1 To 0 Step -1 If Not UserForm1.ListBox6.Value = _ UserForm1.ListBox1.List(w, 5) Then UserForm1.ListBox1.RemoveItem (w) End If Next w    End If For w = UserForm1.ListBox1.ListCount - 1 To 1 Step -1 If UserForm1.ListBox1.List(w - 1, 6) = UserForm1.ListBox1.List(w, 6) Then UserForm1.ListBox1.RemoveItem (w) End If Next w

  • Excelのワークシート削除時のダイアログを表示させない方法

    Excel(97)で、ワークシートを削除する時に「選択したシートを削除します。一度削除したシートは・・・」という、警告ダイアログが出ますよね。これを出さずに強制削除する方法はあるのでしょうか? 現在、下記のようなプロシージャを用意し、シート名が要素になっているリストボックス(.MultiSelect = fmMultiSelectMulti)中で選択された全てのシートを削除するダイアログを作成しました。 ところが、選択した数だけ、前述の警告ダイアログが表示され、非常にうっとうしいのです。 どなたか、助けてください。お願いします。 '===現在使用しているプロシージャ=== For i = 0 To ListBox.ListCount - 1  If ListBox.Selected(i) Then   For Each AnySheet In ActiveWorkbook.Sheets    If AnySheet.Name = ListBox.List(i) Then AnySheet.Delete   Next AnySheet  End If Next i

  • エクセルVBAプログラム質問 リストボックス応用

    エクセルVBAプログラムについて質問です。 リストボックスから結果をリストボックスに表示させる リストボックスを応用した内容です。 (1)今回追加したいのは、チェックボックスにチェックすることで、 期限が今月中に切れるもののみをリストボックスに表示させたいです。 (2)期限更新ボタンを押したら、3カ月プラスして延長させたいです。 期限更新したら、リストボックスの中身も更新したいです。 例(1):今日の日付 2018/9/23だとしたら、期限切れる(9月分すべて)を表示させたい。 例(2):期限(変更前)『2018/9/23』から期限(変更後)『2018/12/23』に変更 下記のプログラムで追加していきたいです。 Dim myData Private Sub UserForm_Initialize() Dim Dic, Keys, buf As String, i As Long Me.ComboBox1.Style = fmStyleDropDownList Me.ListBox1.ColumnCount = 4 Me.ListBox1.ListStyle = fmListStyleOption Me.ListBox1.MultiSelect = fmMultiSelectMulti Me.CommandButton1.Caption = "印刷" Me.CommandButton1.Enabled = False With Worksheets("DATA") myData = .Range("A1:E" & .Cells(.Rows.Count, 1).End(xlUp).Row) End With Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 2 To UBound(myData, 1) buf = myData(i, 1) Dic.Add buf, buf Next i Keys = Dic.Keys For i = 0 To Dic.Count - 1 Me.ComboBox1.AddItem Keys(i) Next i Set Dic = Nothing End Sub Private Sub ComboBox1_Change() Dim i As Long, j As Integer With Me.ListBox1 .Clear For i = 2 To UBound(myData, 1) If Me.ComboBox1.Value = myData(i, 1) Then .AddItem "" For j = 2 To 5 .List(.ListCount - 1, j - 2) = myData(i, j) Next j End If Next i End With End Sub Private Sub ListBox1_Change() Dim i As Long, cnt As Long With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then cnt = cnt + 1 End If Next i End With Me.CommandButton1.Enabled = (1 <= cnt And cnt <= 2) End Sub Private Sub CommandButton1_Click() Dim ws As Worksheet, i As Long, j As Integer, cnt As Byte Set ws = Worksheets("印刷") ws.PageSetup.PrintArea = "$I$2:$P$5" ws.Range("J2:L5,N2:P5").ClearContents With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then ws.Range("J2").Offset(0, cnt).Value = Me.ComboBox1.Value For j = 0 To 2 ws.Range("J5").Offset(j * -1, cnt).Value = .List(i, j) Next j cnt = cnt + 2 End If Next i End With Unload Me ws.PrintPreview End Sub

  • エクセルVBA 対比表を作りたいです。

    お世話になります。混乱を極めてしまったので、質問させて頂きます。 下記の様なリストがあります。 A列  B列 No  相手 1   1 1   2 1   3 1   5 2   1 2   2 3   2 3   3 3   4 ・  ・ ・  ・ ・ 以下、数百まであります。 上記で 「1-2」と「2-1」はありますが、「1-3」はあるけど「3-1」がありません。 (その他「1-5」無いなどです。上記は一例としてます。) この場合「1-3」の部分の「1」を「0」などに置き換えたいのですが、下記コードを 書きましたが、上手く目的の結果にたどり着けない状態になっております。 (同じ部分を検索しているだけになってしまっていて。。。) 下記はユーザーフォームからのコードになりますので、ListBoxの記載ありますが、 選択されているListBoxの値で非一致を探すって形にしようとしております。 For Each KRR In Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row) If KRR = ListBox1.List(ListBox1.ListIndex, 0) Then SDF = Cells(KRR.Row, 2) For Each SRR In Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row) If Cells(SRR.Row, 1) = SDF Then SSDF = 1 End If Next If SSDF <> 1 Then Cells(KRR.Row, 1) = 0 End If SSDF = 0 End If Next 要するにA列とB列を反対にした状態で、一致する値が無い場合は、対象CellのA列に「0」を 代入したいって事を考えております。 完全に混乱してしまっているので、お助け下さい。。。

  • Excel VBA リストボックスについて

    現在エクセルのVBAを勉強中の 超初心者なのですが、 リストボックスを使うコードでエラーが出て どう直したらいいかわかりません。 下記コードをどのようになおしたらいいでしょうか? 回答、よろしくお願いいたします。 エラー内容は、実行時エラー381 Listプロパティを設定できません。プロパティの配列のインデックスが無効です。 Private Sub UserForm_Initialize() 'リストボックスの設定 With ListBox1 .Font.Size = 10 .ColumnCount = 7 .ColumnWidths = "50;100;80;80;100;30;70" .TextAlign = fmTextAlignLeft .Font.Name = "MSゴシック" End With Dim i As Integer Dim LastRow As Integer LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 2 To LastRow With ListBox1 .AddItem Cells(i, 1).Value .List(ListCount - 1, 1) = Cells(i, 2).Value .List(ListCount - 1, 2) = Cells(i, 3).Value ←ここでエラー .List(ListCount - 1, 3) = Cells(i, 4).Value .List(ListCount - 1, 4) = Cells(i, 5).Value .List(ListCount - 1, 5) = Cells(i, 6).Value .List(ListCount - 1, 6) = Cells(i, 7).Value End With Next End Sub

  • リストボックスからの入力をテキストに貼付

    下記コードではリストボックあ行選択しテキスト1~6に入力後、クリアボタンで消去したあと、か行選択しテキストに入力したら7~貼付けになるクリアボタンで消去後、改めてテキスト1~入力するコードがありますか。どなたか解る方よろしくお願いします。 Private Sub 実行_Click() Static cnt As Integer Dim i As Integer If Listbox.ListIndex = -1 Then Exit Sub For i = 0 To Listbox.ListCount - 1 If Listbox.Selected(i) Then cnt = cnt + 1 If cnt > 10 Then cnt = 1 Me.Controls("TextBox" & cnt).Text = Listbox.List(i) End If Next End Sub Private Sub クリア_Click() Dim tbCont As Control With Me.MultiPage1 For Each tbCont In .Pages(.Value).Controls If TypeName(tbCont) = "TextBox" Then tbCont.Value = Null End If Next tbCont End With End Sub

  • ListBox内の並び替えで実行エラー

    OSはXP、 Excelは2003を使用しています。 ユーザーフォーム内のListBox内で、コマンドボタンをクリックして行を上や下に並び替えたく、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1041407835 を参考にして、下記の通りに組んだのですが、 下に並び替えるCommandButton2を実行時や、 上に並び替えるCommandButton1を「2回目」に実行時に 「実行時エラー -2147417848(80010108)  オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。」 となってしまいます。 Private Sub CommandButton1_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ上げる。 i = Me.ListBox1.ListIndex If i > 0 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i - 1, j) Me.ListBox1.List(i - 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i - 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i - 1, k) Me.ListBox2.List(i - 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i - 1) = True Next k Next j End If End Sub Private Sub CommandButton2_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ下げる。 i = Me.ListBox1.ListIndex If i < Me.ListBox1.ListCount - 1 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i + 1, j) Me.ListBox1.List(i + 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i + 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i + 1, k) Me.ListBox2.List(i + 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i + 1) = True Next k Next j End If End Sub 説明不足や上記の記述にとんちんかんな間違いがありましたら、ごめんなさい。 どなたか解決方法を教えて頂けますようお願い致します。

  • リストボックスの内容を検索したいが...

    エクセル2019を使っています。 添付画像のようにユーザーフォームにテキストボックスとリストボックスを作り、テキストボックスに入力した文字でリストボックスの内容を検索しようとコードを作成しました。 Private Sub TextBox1_Change() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row .Range("A1").AutoFilter 1, "*" & TextBox1.Value & "*" If .Cells(Rows.Count, "A").End(xlUp).Row > 1 Then Set rng = .Range("A2:A" & LastRow).SpecialCells(xlCellTypeVisible) Else Me.ListBox1.Clear Exit Sub End If End With Me.ListBox1.Clear With Me.ListBox1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With End Sub Private Sub UserForm_Initialize() Dim LastRow As Integer Dim rng As Range, r As Range With Worksheets("Sheet1") If .AutoFilterMode <> True Then .Range("A1").AutoFilter End If LastRow = .Cells(Rows.Count, 1).End(xlUp).Row Set rng = .Range("A2:A" & LastRow) End With With Me.ListBox1 .ColumnCount = 1 For Each r In rng .AddItem r.Value .List(.ListCount - 1, 1) = r.Offset(0, 1).Value Next r End With ListBox1.ListIndex = 0 End Sub とりあえず検索はできるのですが、使用されていない文字や記号を入力したあとにバックスペースキーで入力した文字や記号を削除するとリストボックスの内容が意図した内容で表示されません。 どこを修正したらいいでしょうか。

  • エクセルでのリストボックスの値の取得

    早速ですが、エクセルでユーザーフォーム上にある リストボックスの複数選択した時の値の取得方法を教えてください。 具体的にはアンケート集計をするためのフォームで "Q6"というワークシートのA列に「項目名」、B列に「数」を 1行目から設定しています(「数」の初期値は"0"です)。 ユーザーフォームのリストボックスにはA列を表示させています。 そのユーザーフォーム上にあるコマンドボックスに 下記のようにコード記述しても、一番上の選択されたものしか"Q6"に 反映されません(2,3,4行目を選択しても2行目の「数」のみ+1になる)。 Private Sub CommandButton1_Click()  For n = 0 To ListBox1.ListCount - 1   If ListBox1.Selected(n) = True Then    Worksheets("Q6").Cells(n + 1, 2) = _    Worksheets("Q6").Cells(n + 1, 2) + 1   End If  Next n End Sub エクセルは97で、リストボックスのMultiSelectはMultiでもExtendedでもダメでした。 どなたかご存知の方がいらっしゃいましたらよろしくお願いします。

  • エクセルVBAでフォームのListboxをスクロールするには?

    エクセルVBAでフォームのListboxをスクロールするには? ワークシート上に貼り付けたリストボックスがあります。 このリストボックスはOLEObjectではなくフォームのリストボックスです。 For Each lb In .ListBoxes If lb.ListCount <= 4 Then lb.ListIndex = 1 Else lb.ListIndex = 16 ここで16番目が見えるようにスクロールしたいのです。 End If Next lb このスクロールさせる方法がわかりません。 ご教示いただければ幸いです。

専門家に質問してみよう