• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCELマクロ、ループかけるとマクロが固まる)

EXCELマクロのループでマクロが固まる

このQ&Aのポイント
  • EXCELマクロのループを実行すると、マクロが固まってしまう現象が発生しています。
  • ループ無しの場合は正常に動作しており、ファイルを一つずつ開いてマクロを起動することで対応しています。
  • マクロの内容は、フォントの変更、記号の変換、テキストボックスのグループ化解除などです。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1632/2475)
回答No.1

> Set myRange = mySheet.UsedRange > For Each cell In myRange > > Cells.Select これはUsedRange分の回数分シートの全てのセルを選択してFontの指定やReplaceを行っていることになると思いますから、UsedRangeが10個あれば10回全てのセルにたいしてその操作行われています。 シートの全てのセルにたいして操作するのではなくcellにしたいのでしたら cell.Select とするか、間違わないように変数にcellを使わないようにした方がいいです。 また、 〇〇.Selectのあとに Selection.△△としなくても 直接 〇〇.△△ にしたほうがいいと思います。 > Set myRange = mySheet.UsedRange > For Each cell In myRange の中に > ActiveSheet.UsedRange.Select > > For Each セル In Selection があると思いますが、同じところを2回ループしているのではないでしょうか。 テキストボックス関連も > Set myRange = mySheet.UsedRange > For Each cell In myRange の外に出さないとUsedRange分同じことを繰り返していると思います。 > myFile = Dir() > Next > Loop は Next myFile = Dir() Loop じゃないでしょうか。

joezen05
質問者

お礼

ありがとうございました。ご指摘箇所を反映してみます!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelマクロループセル/シートにループ

    いつもお世話になります。 ずっと同じマクロについて質問しております。 アドバイスいただいた通りにしたつもりですが、現在セルとシートにループがかかっていないようで マクロをかけたファイルを見ても、変更がファイルの最後のページにしか反映されていないです。 お手数ですが改めて下記マクロをどのように修正すべきか教えてください。 Sub NEM_Macroループ() ' ' フォント変更、記号変換、テキストボックス、全シート ' Dim myFile As String Dim myPath As String Dim myBook As Workbook Dim mySheet As Worksheet Dim myRange As Range Application.ScreenUpdating = False 'インジケーター表示 Dim j As Long Info.Show vbModeless 'フォントを変更するファイルが保存されているフォルダのパスを指定します。 myPath = "C:\Users\NXXXXX\Desktop\NEM_macro" '指定したフォルダ内の全てのExcelファイルに対してループを実行します。 myFile = Dir(myPath & "\*.xlsx") Do While myFile <> "" 'インジケーター For j = 1 To 30000 With Info .ProgressBar1.Value = j .パーセント.Caption = Int(j / 30000 * 100) & "%" .Repaint End With Next j '各ファイルを開きます。 Set myBook = Workbooks.Open(myPath & "\" & myFile) '全てのワークシートに対してループを実行します。 For Each mySheet In myBook.Sheets 'シート内の全てのセルに対してループを実行します。 Set myRange = mySheet.UsedRange Cells.Font.Name = "MS Pゴシック" Cells.Font.Name = "Arial" Selection.Replace What:="、", Replacement:="," Selection.Replace What:="※", Replacement:="*" Selection.Replace What:="①", Replacement:="(1)" Selection.Replace What:="②", Replacement:="(2)" Selection.Replace What:="③", Replacement:="(3)" Selection.Replace What:="④", Replacement:="(4)" Selection.Replace What:="⑤", Replacement:="(5)" Selection.Replace What:="⑥", Replacement:="(6)" Selection.Replace What:="⑦", Replacement:="(7)" Selection.Replace What:="⑧", Replacement:="(8)" Selection.Replace What:="⑨", Replacement:="(9)" Selection.Replace What:="⑩", Replacement:="(10)" '半角全角修正 Dim セル As Range Dim 変換文字 As String Dim 半角 As String Dim i As Long Range("A1").CurrentRegion.Select For Each セル In Selection 変換文字 = StrConv(セル.Text, vbWide) For i = 1 To Len(変換文字) 半角 = StrConv(Mid(変換文字, i, 1), vbNarrow) If Asc(半角) >= 32 And Asc(半角) <= 126 Then _ 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, 半角) Next i セル = 変換文字 Next 'テキストボックスグループ化解除 Dim mySPg As Shape For Each mySPg In ActiveSheet.Shapes If mySPg.Type = msoGroup Then mySPg.Ungroup End If Next mySPg Dim mySP As Shape 'すべての図形テキストボックスをループ For Each mySP In ActiveSheet.Shapes 'テキストボックスの場合 If mySP.Type = msoTextBox Then 'フォント変更 mySP.TextFrame2.TextRange.Font.NameFarEast = "MS Pゴシック" mySP.TextFrame2.TextRange.Font.NameFarEast = "Arial" End If Next mySP Dim 年月 Dim ThisName, NewName Dim MojiCoA As Integer, MojiCoB As Integer 'Format,Year,Month関数を利用します 年月 = Year(Date) & "_" & Month(Date) '拡張子なしのファイル名を取得します MojiCoA = InStrRev(ActiveWorkbook.Name, ".") ThisName = Left(ActiveWorkbook.Name, MojiCoA - 1) 'ファイル名を変数へ設定します NewName = "C:\Users\NXXXXX\Desktop\NEM_macro\修正後" & "\" & ThisName & 年月 & ".xlsx" '作成したWorkbookを名前を付けて、移動先フォルダに保存します ActiveWorkbook.SaveAs Filename:=NewName ActiveWorkbook.Close Next '次のファイルに移動します。 myFile = Dir() Loop Info.Hide MsgBox "処理が終了しました。" Unload Info End Sub

  • Excelマクロ、Loopが望まぬところにかかる

    いつもお世話になってます。マクロ初心者です。 下記マクロもコピペで作りました。先日あまりに時間がかかるので相談したら 回答いただいたのですが、別の問題が出てきました。 フォルダ内のすべてのファイルに実施するLoopが、 フォント変更などのマクロを実施して保存されたファイルに、もう一度マクロがかかる仕組みになっています。 故にマクロをスタートさせると、ファイル名がどんどん長いファイルが増えていって 作業が永遠に終わりません。 既述の通り、マクロのつぎはぎで作成したので どこがどう問題なのか突き詰めることができません。 分かる方がいればご教示いただけますと幸いです。 ****** Sub NEM_Macroループ() ' ' フォント変更、記号変換、テキストボックス、全シート ' Dim myFile As String Dim myPath As String Dim myBook As Workbook Dim mySheet As Worksheet Dim myRange As Range Application.ScreenUpdating = False 'インジケーター表示 Dim j As Long Info.Show vbModeless 'フォントを変更するファイルが保存されているフォルダのパスを指定します。 myPath = "C:\Users\XXXXX\Desktop\NEM_macro" '指定したフォルダ内の全てのExcelファイルに対してループを実行します。 myFile = Dir(myPath & "\*.xlsx") Do While myFile <> "" 'インジケーター For j = 1 To 30000 With Info .ProgressBar1.Value = j .パーセント.Caption = Int(j / 30000 * 100) & "%" .Repaint End With Next j '各ファイルを開きます。 Set myBook = Workbooks.Open(myPath & "\" & myFile) '全てのワークシートに対してループを実行します。 For Each mySheet In myBook.Sheets 'シート内の全てのセルに対してループを実行します。 Set myRange = mySheet.UsedRange Cells.Font.Name = "MS Pゴシック" Cells.Font.Name = "Arial" Selection.Replace What:="、", Replacement:="," Selection.Replace What:="※", Replacement:="*" Selection.Replace What:="①", Replacement:="(1)" Selection.Replace What:="②", Replacement:="(2)" Selection.Replace What:="③", Replacement:="(3)" Selection.Replace What:="④", Replacement:="(4)" Selection.Replace What:="⑤", Replacement:="(5)" Selection.Replace What:="⑥", Replacement:="(6)" Selection.Replace What:="⑦", Replacement:="(7)" Selection.Replace What:="⑧", Replacement:="(8)" Selection.Replace What:="⑨", Replacement:="(9)" Selection.Replace What:="⑩", Replacement:="(10)" '半角全角修正 Dim セル As Range Dim 変換文字 As String Dim 半角 As String Dim i As Long Range("A1").CurrentRegion.Select For Each セル In Selection 変換文字 = StrConv(セル.Text, vbWide) For i = 1 To Len(変換文字) 半角 = StrConv(Mid(変換文字, i, 1), vbNarrow) If Asc(半角) >= 32 And Asc(半角) <= 126 Then _ 変換文字 = WorksheetFunction.Replace(変換文字, i, 1, 半角) Next i セル = 変換文字 Next 'テキストボックスグループ化解除 Dim mySPg As Shape For Each mySPg In ActiveSheet.Shapes If mySPg.Type = msoGroup Then mySPg.Ungroup End If Next mySPg Dim mySP As Shape 'すべての図形テキストボックスをループ For Each mySP In ActiveSheet.Shapes 'テキストボックスの場合 If mySP.Type = msoTextBox Then 'フォント変更 mySP.TextFrame2.TextRange.Font.NameFarEast = "MS Pゴシック" mySP.TextFrame2.TextRange.Font.NameFarEast = "Arial" End If Next mySP Dim 年月 Dim ThisName, NewName Dim MojiCoA As Integer, MojiCoB As Integer 'Format,Year,Month関数を利用します 年月 = Year(Date) & "_" & Month(Date) '拡張子なしのファイル名を取得します MojiCoA = InStrRev(ActiveWorkbook.Name, ".") ThisName = Left(ActiveWorkbook.Name, MojiCoA - 1) 'ファイル名を変数へ設定します NewName = ActiveWorkbook.Path & "\" & ThisName & 年月 & ".xlsx" '作成したWorkbookを名前を付けて、移動先フォルダに保存します ActiveWorkbook.SaveAs Filename:=NewName '次のファイルに移動します。 Next myFile = Dir() Loop Info.Hide MsgBox "処理が終了しました。" Unload Info End Sub

  • excel「マクロ」 置換えで困っています。

    いつも皆様には大変お世話になっております、回答者の皆様ありがとう御座います。 早速ですが質問させて頂きます。 初めてexcelにて 「置換え」 マクロを組んでいます、置き換えなければいけない候補が多いので Sub okikae() Dim myRng As Range Selection.SpecialCells(xlCellTypeConstants, 2).Select For Each myRng In Selection myRng.Value = StrConv(myRng.Value, vbUpperCase + vbNarrow) Next myRng Dim aa, zz As Integer, a, za As Integer aa = Array("-10", "P10", "P-10") a = Array("-1", "P1", "P01", "P-1", "G1", "G01", "G-1", "-") For zz = 0 To UBound(aa) Selection.Replace What:=aa(zz), Replacement:="@10", _ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False Next zz For za = 0 To UBound(a) Selection.Replace What:=a(za), Replacement:="", _ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False Next za end sub 上記の様なマクロを永遠と入力しました。(実際にはもっと長いです。(入力を多数の人数で行っている為、同じP1やP10がイロイロな形式で入力されています。) セルを選択しマクロを実行したところ、うまく置換えが出来たり出来なかったりするセルが出てきて困っています。 どこに不具合があり、置換え出来なくなっているのかすら分からない状態に陥っています。 アドバイスありましたら宜しくお願いいたします、説明に不明な点があれば再度補足させて頂きます。

  • マクロ処理後のファイル名変更について

    マクロでいくつかの処理を行った後、もとのファイル名に 「済+ファイル名」としてファイル名を変更して終了をしたいのですが、 どのようにすればできるのかわかりません。 どなたか教えていただけますか? イメージ) 処理前のファイル名:サラダ.xls、お肉.xls・・・ 処理後のファイル名:済サラダ.xls、済お肉.xls・・・ Dim myPath As String Dim myFile As String Dim w As Workbook Dim s As Worksheet myPath = ThisWorkbook.Path & "\" myFile = Dir(myPath & "*.xls") Do Until myFile = "" If myFile <> ThisWorkbook.Name Then Set w = Workbooks.Open(myPath & myFile) For Each s In w.Worksheets s.Range・・・・・     ・・・・・・・・     ・・・・・・・・ Next w.Close savechanges:=True End If myFile = Dir() Loop MsgBox "完了しました。" End Sub

  • Excel vbaファイル指定先に保存されない

    マクロをかけたエクセルファイルを、特定の名前を指定(年月を足す)して 「修正後」フォルダを作り、そこへ保存させたいのですが ファイル名の変数設定に「修正後」を入れてもだめなのでしょうか? ****** Sub NEM_Macroループ() ' ' フォント変更、記号変換、テキストボックス、全シート ' Dim myFile As String Dim myPath As String Dim myBook As Workbook Dim mySheet As Worksheet Dim myRange As Range Application.ScreenUpdating = False 'Cドライブに修正後というフォルダを作成します。 MkDir "C:\Users\XXXXXX\Desktop\NEM_macro\修正後" 'フォントを変更するファイルが保存されているフォルダのパスを指定します。 myPath = "C:\Users\XXXXXX\Desktop\NEM_macro" '指定したフォルダ内の全てのExcelファイルに対してループを実行します。 myFile = Dir(myPath & "\*.xlsx") Do While myFile <> "" '各ファイルを開きます。 Set myBook = Workbooks.Open(myPath & "\" & myFile) '全てのワークシートに対してループを実行します。 For Each mySheet In myBook.Sheets 'シート内の全てのセルに対してループを実行します。 Set myRange = mySheet.UsedRange Cells.Font.Name = "MS Pゴシック" Cells.Font.Name = "Arial" Dim 年月 Dim ThisName, NewName Dim MojiCoA As Integer, MojiCoB As Integer 'Format,Year,Month関数を利用します 年月 = Year(Date) & "_" & Month(Date) '拡張子なしのファイル名を取得します MojiCoA = InStrRev(ActiveWorkbook.Name, ".") ThisName = Left(ActiveWorkbook.Name, MojiCoA - 1) 'ファイル名を変数へ設定します NewName = ActiveWorkbook.Path & 修正後 & "\" & ThisName & 年月 & ".xlsx" '作成したWorkbookを名前を付けて、移動先フォルダに保存します ActiveWorkbook.SaveAs Filename:=NewName '次のファイルに移動します。 Next myFile = Dir() Loop End Sub

  • EXCEL マクロ につきまして

    お世話になっております。 以前、同様の質問をさせていただきまして、 その拡張バージョンをつくりたいと考えております。 Sub macro1() Dim myPath As String Dim myFile As String Dim c As Long Dim LastRowr As Long Application.ScreenUpdating = False myPath = ThisWorkbook.Path & "\" myFile = Dir(myPath & "*.xls") c = 6 Do Until myFile = "" If myFile <> ThisWorkbook.Name Then Workbooks.Open Filename:=myPath & myFile lastrow = Worksheets("特定のシート").Range("A65536").Row ThisWorkbook.Worksheets(2).Cells(1, c).Resize(lastrow, 1).Value = Worksheets("特定のシート").Range("H1").Resize(lastrow, 1).Value Workbooks(myFile).Close False c = c + 1 End If myFile = Dir() Loop Application.ScreenUpdating = True On Error Resume Next ActiveSheet.Name = Format(Date, "mmdd") On Error GoTo 0 End Sub こちらは"特定のシート"の特定の列(H)のみをひたすらフォーマットに 貼り付けていくものですが、コピペしたい列が増えた場合(数は一定ではない) のバージョンができればと思っております。 正直まったくわかりません。 1)データが何列あるかは不定 2)行1~3には自動的に何らかのデータが振られてしまっており(連番等)  データの終わりとして使えそうなのは、行4に「0」が入っていること  (但し0は非表示にしております) "特定のシート"名・データがH列から始まる等は変わりません。 現状の記述を改修、もしくは全とっかえでも構いません。 なにとぞよろしくお願い致します。

  • エクセルのマクロの制限

    エクセルで以下のようなタブとスペースを削除するマクロを実行したところ Sub Tab_Clear() Selection.Replace what:=" "+Chr(9), replacement:="" Selection.Replace what:=" ", replacement:="" End Sub 上のほうは削除されるのですが後のほうの行は削除されません、制限があるのでしょうか? また全行削除する方法はないでしょうか?

  • Excelのマクロで同じ処理を実行

    Excelのマクロについてです。 この度、フォルダ内にあるデータから傾きを抽出して、 データシートにまとめる作業を求められています。 一度ずつ開いて行うのが大変なので、マクロを用いようと思っています。 Sub マクロループ() Dim myPath As String Dim myFile As String myPath = "C:\test\" myFile = Dir(myPath & "*.CSV*") Do Until myFile = "" Workbooks.Open myPath & myFile ( ActiveWindow.ScrollRow = 2 ActiveWindow.ScrollRow = 3 ~ ~ ActiveSheet.Shapes("グラフ 1").IncrementLeft -125.25 ActiveSheet.Shapes("グラフ 1").IncrementTop 21.75 Application.CommandBars("Format Object").Visible = False ) ActiveWorkbook.Close True myFile = Dir() Loop End Sub ~の部分に省略した処理が入ります。 これでエラーなどは起きないのですが、開いて閉じるだけになってしまっています。 ()で括られた部分だけで実行すると、そのファイルで傾きを表示してくれます。 これを全ファイルでやりたいのですが、お力添えをお願いします。 また、それぞれで得られた傾きをデータシートに自動で入力することなどができればそれも教えていただければ幸いです。 どうかよろしくお願いします。

  • エクセルのマクロ

    Sub test() Dim x As Range  For Each x In Selection    If x.Value <> "●" And Selection.Font.ColorIndex = 0 Then    x.Value = "○"  End If Next End Sub 上記は、選択されているセルのフォントが黒でかつ"●"が入力されていない場合は"○"を入力する、というマクロですがうまく動作しません。どうすれば正常に動作するようになるでしょうか?

  • Excel 2010 VBA:ファイル名を読み込む

    下は複数のcsvファイルを一つに合体するVBAです。これにシートの右端に読み取ったファイル名を追加するにはどうしたらよいでしょうか。 よろしくお願いします。 Sub macro1() Dim myPath As String Dim myFile As String Dim s As String myPath = ThisWorkbook.Path & "\" On Error Resume Next Kill myPath & "合体版.csv" On Error GoTo 0 myFile = Dir(myPath & "*.csv") If myFile = "" Then Exit Sub Open myPath & "合体版.csv" For Output As #1 Do Until myFile = "" Open myPath & myFile For Input As #2 Do Until EOF(2) Line Input #2, s Print #1, s Loop Close #2 myFile = Dir() Loop Close #1 End Sub

専門家に質問してみよう