• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelのVBAのループで時間短縮する方法を教えてださい。)

ExcelのVBAのループで時間短縮する方法

このQ&Aのポイント
  • ExcelのVBAのループを使用して株式会社や有限会社を短縮する方法を紹介します。
  • 数万行のデータでも効率的に処理する方法をお教えします。
  • ループ内の置換処理を最適化することで実行時間を短縮することが可能です。

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

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

お邪魔します。 置換の手順がちょっとおかしいような気がしたもので、、、。 配列変数を使うのが速いでしょうけど、こんな感じでどうでしょう。 App系の更新停止をする場合は、必ず解除もしてください。 中間に他の記述を追記するなら、エラー処理を検討してください。  Replace()関数についてはVBAのヘルプ等で確認してください。 Sub Re6140122()  Dim 最終行 As Long  Dim i As Long, j As Long  Dim arr As Variant '  With Application ' App系の処理は状況次第で。必ず要るという訳でもなく、、、 '    .ScreenUpdating = False ' データが大量の場合のみメリットあり(←配列出力の記述では) '    .Calculation = xlCalculationManual ' シート上での関数使用状況 '    .EnableEvents = False ' SelectionChange イベント | Change イベント 等を使うなら '  End With  最終行 = Cells(Rows.Count, "H").End(xlUp).Row  With Range("F2:H" & CStr(最終行))   ' ' セル範囲の値をVariant型の配列変数に格納   arr = .Value   For i = 1 To 最終行 - 1    For j = 1 To 3     ' ' (株)|(有) に統一     arr(i, j) = Replace(arr(i, j), "株式会社", "(株)")     arr(i, j) = Replace(arr(i, j), "有限会社", "(有)")     ' ' 括弧(全角|半角)を半角に統一 # 必要ありませんかね?     arr(i, j) = Replace(arr(i, j), "(株)", "(株)", , , 1)     arr(i, j) = Replace(arr(i, j), "(有)", "(有)", , , 1)     ' ' (株)|(有)の前後のスペース(全角|半角)を削除     arr(i, j) = Replace(arr(i, j), " (株)", "(株)", , , 1)     arr(i, j) = Replace(arr(i, j), "(株) ", "(株)", , , 1)     arr(i, j) = Replace(arr(i, j), " (有)", "(有)", , , 1)     arr(i, j) = Replace(arr(i, j), "(有) ", "(有)", , , 1)    Next j   Next i   .Value = arr  End With '  With Application '    .ScreenUpdating = True '    .Calculation = xlCalculationAutomatic '    .EnableEvents = True '  End With End Sub

tainosuke
質問者

お礼

ありがとうございます。 置換の手順がおかしかったです! 無駄な作業をしていました。 本当に助かりました。

その他の回答 (8)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.9

No.8です! たびたびごめんなさい。 微々たるものでしょうけど、前回のコードは各セルの最終文字まで調べてしまいます。 「株式会社」「有限会社」ともに4文字ですので、各セルの最終文字から4文字前までマクロを実行すれば良いと思います。 と言う訳で、少しコードを訂正させていただきます。 Sub test() Dim i, j, k As Long Dim str As String For i = 1 To ActiveSheet.UsedRange.Rows.Count For j = 1 To ActiveSheet.UsedRange.Columns.Count For k = 1 To Len(Cells(i, j)) - 3 str = Mid(Cells(i, j), k, 4) If str = "株式会社" Then Cells(i, j) = Replace(Cells(i, j), str, "(株)") ElseIf str = "有限会社" Then Cells(i, j) = Replace(Cells(i, j), str, "(有)") End If Next k Next j Next i End Sub 実際どの程度短縮されるかは判りません。 何度も失礼しました。m(__)m

tainosuke
質問者

お礼

ありがとうございます。私の書いたコードだと同じ構文を繰り返していて、見栄えが悪いというかVBAというよりマクロっぽいと気になっていたので、上記のようなコードの書き方をすればすっきりしますね。助かりました!

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.8

こんばんは! すでに回答は出ているようなので、参考程度で目を通してみてください。 一例です。 考え方は各セルを1文字ずつ(4文字を一まとめにして)、舐めるように順番に見てゆきます もし「株式会社」であれば(株)に、「有限会社」であれば(有)に置き換えるようにしてみました。 Sub test() Dim i, j, k As Long Dim str, buf As String For i = 1 To ActiveSheet.UsedRange.Rows.Count For j = 1 To ActiveSheet.UsedRange.Columns.Count For k = 1 To Len(Cells(i, j)) str = Mid(Cells(i, j), k, 1) buf = Mid(Cells(i, j), k, 4) If buf = "株式会社" Then Cells(i, j) = Replace(Cells(i, j), buf, "(株)") ElseIf buf = "有限会社" Then Cells(i, j) = Replace(Cells(i, j), buf, "(有)") End If Next k Next j Next i End Sub 上記のマクロを試すときは別Sheetにコピー&ペーストして行ってみてください。 以上、参考になればよいのですが・・・m(__)m

  • layy
  • ベストアンサー率23% (292/1222)
回答No.7

「同じエリアに対してReplaceを  10回も  やってやること」 「対象文字があってもなくてもReplaceを行っていること」 「一度『株式会社』が『(株)』に置換できたら『株式会社 』の置換は不要」 こういうことが、遅くしている要因と思います。 ロジックを見なおしてください。 さらには VBAが使えたらの話で、 「エクセル(セル操作)でやっていること」も遅く、テキストデータの入出力のが早いかもしれない。 情報をCSVファイルで保存しておいて、CSVファイル上でやってみる。 文字列置換のロジックはVBAで提供ありますし、 ファイル1レコードを読み込み、検知と置換、書き込み、の繰り返しです。

tainosuke
質問者

お礼

ありがとうございます。 置換の手順がおかしかったです! 無駄な作業をしていました。 本当に助かりました。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.6

 #5 さんがお書きの >置換の手順がちょっとおかしいような気がした ということと同じことかも知れませんが。。。 "株式会社" → "(株)" の置換が済んだ時点で、 " 株式会社" → " (株)" "株式会社 " → "(株) " となります。  従って、ステップインデバッグ していただくと一目瞭然ですが、 " 株式会社" → "(株)" "株式会社 " → "(株)" " 有限会社" → "(有)" "有限会社 " → "(有)" の4行は無意味です(余計な時間を費やします)。

tainosuke
質問者

お礼

ありがとうございます。 置換の手順がおかしかったです! 無駄な作業をしていました。 本当に助かりました。

  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

Replaceメソッドはどうでしょうか。   '-------------------------------------- Sub test()   Dim myRange As Range   Set myRange = Range("F2", Cells(Rows.Count, "H").End(xlUp))     With myRange      .Replace "株式会社", "(株)", xlPart      .Replace " 株式会社", "(株)", xlPart      .Replace "株式会社 ", "(株)", xlPart      .Replace "有限会社", "(有)", xlPart      .Replace " 有限会社", "(有)", xlPart      .Replace "有限会社 ", "(有)", xlPart      .Replace "(有) ", "(有)", xlPart      .Replace " (有)", "(有)", xlPart      .Replace "(株) ", "(株)", xlPart      .Replace " (株)", "(株)", xlPart   End With End Sub '-------------------------------------   言わずもがなですが、テストはコピーしてから。 以上です。  

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1に追加して、高速化3点セットです。 Sub test() Dim i As Long, j As Long Dim buf As Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual buf = Range("F2:H" & 最終行) For i = 1 To 最終行 - 1 For j = 1 To 3 buf(i, j) = Replace(buf(i, j), "株式会社", "(株)") '以下 略 Next j Next i Range("F2:H" & 最終行) = buf Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

単純に For Each MyRange In Range("F2:H" & 最終行) If InStr(MyRange, "株式会社") Then MyRange.Value = Replace(MyRange.Value, "株式会社", "(株)") MyRange.Value = Replace(MyRange.Value, " 株式会社", "(株)") MyRange.Value = Replace(MyRange.Value, "株式会社 ", "(株)") ElseIf InStr(MyRange, "有限会社") Then MyRange.Value = Replace(MyRange.Value, "有限会社", "(有)") MyRange.Value = Replace(MyRange.Value, " 有限会社", "(有)") MyRange.Value = Replace(MyRange.Value, "有限会社 ", "(有)") ElseIf InStr(MyRange, "(有)") Then MyRange.Value = Replace(MyRange.Value, "(有) ", "(有)") MyRange.Value = Replace(MyRange.Value, " (有)", "(有)") ElseIf InStr(MyRange, "(株)") Then MyRange.Value = Replace(MyRange.Value, "(株) ", "(株)") MyRange.Value = Replace(MyRange.Value, " (株)", "(株)") End If Next のようにしても多少早くなりますよ

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

For Each の前に, Application.ScreenUpdating = False Next の後に, Application.ScreenUpdating = true を入れて,実行してみてください。

tainosuke
質問者

補足

ありがとうございます。 申し訳ございません。 Application.ScreenUpdating = False は入れてあります。 補足にいれます。

関連するQ&A