• ベストアンサー

このコードを実行するとエクセルがフリーズしてしまいます。

とある為替データファイル(600KB)の編集をマクロで実行したい(何度も新規で編集するため)のですが画面がフリーズしてしまいます。たまに最後まで出来ます。長すぎるのでしょうか。省略できる部分があったら教えて欲しいです。(初心者です) 以下そのまま添付 Sub 画面を固定() Application.ScreenUpdating = False End Sub Sub いち() Call 画面を固定 Cells.Select With Selection.Font .Size = 9 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With 'セルの結合を解除・折り返して全体を表示するの解除・文字を左詰で表示 With Selection .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False .HorizontalAlignment = xlLeft '(文字を左詰で表示) End With '列の幅 Selection.ColumnWidth = 2.38 '行の幅 Selection.RowHeight = 12 '列の幅を自動調整 Cells.Select Cells.EntireColumn.AutoFit 'A列の調整 Columns("A:A").ColumnWidth = 3 '不要行削除 Range("a:a,c:c,e:H,J:R,T:U,X:AA,AC:AO,AQ:Au,Aw:BB,BD:BG,BI:CC").Select Selection.Delete Shift:=xlToLeft '円マークを取る Cells.Replace What:="\", Replacement:="", LookAt:=xlPart, SearchOrder:= _ xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False '円の列の書式 Range("K:K,I:I").Select Selection.NumberFormatLocal = "#,##0_ ;[赤]-#,##0 " ' 列の入れ替え() '(建時) Columns("G:G").Select Selection.Cut Columns("B:B").Select Selection.Insert Shift:=xlToRight '(建値) Columns("G:G").Select Selection.Cut Columns("C:C").Select Selection.Insert Shift:=xlToRight Columns("H:H").Select Selection.Cut Columns("e:e").Select Selection.Insert Shift:=xlToRight 'スクロールで画面左に戻る ActiveWindow.ScrollColumn = 1 '仕切取引まで行削除 On Error GoTo line x = Application.WorksheetFunction.Match("仕切取引", Columns("A:A"), 0) If x = 1 Then Exit Sub Else Rows("1:" & x - 1).Delete End If Exit Sub line: MsgBox "見当たりません", vbCritical, "(>_<) " '一行目(仕訳取引)削除 Rows("1:1").Select Selection.Delete Shift:=xlUp 'オートフィルタ Rows("1:1").Select Selection.AutoFilter '不要列にかかったフィルタを削除 Columns("L:CE").Select Selection.Delete Shift:=xlToLeft End Sub よろしくお願いします。

noname#150256
noname#150256

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

  • ベストアンサー
  • pauNed
  • ベストアンサー率74% (129/173)
回答No.4

ぁ、すみません。 あらためて流れを見直してみると、少し非効率な気が。 残すデータのほうが少ないですよね? 新規シートに必要データのみコピーしたほうがよくないでしょうか。 それが不都合ある場合でも、 まず不要行の削除、不要列の削除をして、その後にReplaceや書式設定や列幅行高の設定をしたほうが良いでしょう。 検討してみてください。

noname#150256
質問者

お礼

大変参考になりました。ご回答ありがとうございます。

その他の回答 (3)

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.3

こんにちは。 まず、Cells.Selectでシート全体が対象ですから、 ここは .UsedRange に絞ったほうが良いかもしれません。 それと、対象データが多いとReplaceメソッドは負担かかります。 下記で改善しない場合、別案を検討したほうが良いかもしれません。 最低限の修正として、イベントの制御と範囲の絞込み、Selection排除、などをしてみました。 Sub いち改()   Dim x As Long   With Application     .ScreenUpdating = False     .EnableEvents = False     .Calculation = xlCalculationManual   End With   With ActiveSheet.UsedRange     With .Font       .Size = 9       .Strikethrough = False       .Superscript = False       .Subscript = False       .OutlineFont = False       .Shadow = False       .Underline = xlUnderlineStyleNone       .ColorIndex = xlAutomatic     End With     'セルの結合を解除・折り返して全体を表示するの解除・文字を左詰で表示     .WrapText = False     .Orientation = 0     .AddIndent = False     .ShrinkToFit = False     .ReadingOrder = xlContext     .MergeCells = False     .HorizontalAlignment = xlLeft  '(文字を左詰で表示)     '列の幅     .ColumnWidth = 2.38     '行の幅     .RowHeight = 12     '列の幅を自動調整     .EntireColumn.AutoFit     'A列の調整     .Columns("A").ColumnWidth = 3     '不要行削除     .Range("A:A,C:C,E:H,J:R,T:U,X:AA,AC:AO,AQ:AU,AW:BB,BD:BG,BI:CC").Delete Shift:=xlToLeft     Application.Calculation = xlCalculationAutomatic     '円マークを取る     If Not .Find("*") Is Nothing Then .Replace What:="\", _                           Replacement:="", _                           LookAt:=xlPart, _                           SearchOrder:=xlByRows, _                           MatchCase:=False, _                           SearchFormat:=False, _                           ReplaceFormat:=False     Application.Calculation = xlCalculationManual     '円の列の書式     .Range("K:K,I:I").NumberFormatLocal = "#,##0_ ;[赤]-#,##0 "     ' 列の入れ替え()     '(建時)     .Columns("G").Cut     .Columns("B").Insert Shift:=xlToRight     '(建値)     .Columns("G").Cut     .Columns("C").Insert Shift:=xlToRight     .Columns("H").Cut     .Columns("E").Insert Shift:=xlToRight     'スクロールで画面左に戻る     ActiveWindow.ScrollColumn = 1     '仕切取引まで行削除     On Error GoTo line     x = Application.WorksheetFunction.Match("仕切取引", .Columns("A"), 0)     If x > 1 Then       .Rows("1:" & x - 1).Delete     End If     GoTo endline line:     MsgBox "見当たりません", vbCritical, "(>_<) "     '一行目(仕訳取引)削除     .Rows(1).Delete Shift:=xlUp     'オートフィルタ     .Rows(1).AutoFilter     '不要列にかかったフィルタを削除     .Columns("L:CE").Delete Shift:=xlToLeft   End With endline:   With Application     .EnableEvents = True     .Calculation = xlCalculationAutomatic     .ScreenUpdating = True   End With End Sub ※実際のシート状況を見て修正したわけではありませんので、 ※必ず、バックアップを取った上で試してください。

noname#150256
質問者

お礼

大変参考になりました。ご回答ありがとうございます。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

#1の方と同様に、処理に時間がかかっているだけのような気がします 可能性としては、画面の書き直しをしないことで処理の高速化ができるかもしれません 処理のはじめで Application.ScreenUpdating = False 終わりで Application.ScreenUpdating = true を実行するようにしてみてください

noname#150256
質問者

お礼

やってみます!ご回答ありがとうございます。

  • Yamatoken
  • ベストアンサー率53% (7/13)
回答No.1

まず、 >フリーズしてしまいます。たまに最後まで出来ます。 という話なので、フリーズはしていないのでしょう。 処理が重い状態かと思います。 次にモジュールをパっと見た限りですが・・・ 然程重い処理をさせる要素は少なそうかと。 が、列幅の自動調整に関してはExcel処理内では負荷のかかる 処理かと思います。(個人的には) 自動調整を外してどうなるか、というのを試されてみるのも いいかと思います。

noname#150256
質問者

お礼

そうですか。試してみます。ご回答ありがとうございます。

関連するQ&A

  • excel vba

    (1)下記のマクロに出てくるApplication.CutCopyMode = False というのは何でしょうか。 (2)また自分でマクロ記録してあるシートを、別のシートにコピーしたとき Application.CutCopyMode = False Selection.Copy というのが、付くときとつかないときがあったんですがなぜそのようなことがおきるのか。 (3)またSelection.Copyというのは何ですか。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2007/1/11 ユーザー名 : ××××× ' ' Workbooks.Open Filename:="C:\aaa\bbbbb\cccc\aaaa_1.xls" Columns("H:H").Select Application.CutCopyMode = False Selection.Cut Columns("E:E").Select Selection.Insert Shift:=xlToRight Columns("I:I").Select Selection.Cut Columns("G:G").Select Selection.Insert Shift:=xlToRight With Selection.Font .Name = "MS 明朝" .Size = 10 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With ActiveSheet.PageSetup.PrintArea = "$A$1:$L$61" ActiveWorkbook.Save End Sub

  • マクロLOOP文を別方法で高速化

    シート2のボタンをクリックすると Sub 編集が起動します。 Sub 編集にはCallで2種類のプロシージャーを 呼び出します。 シート1には約20,000行のデータがあります。 処理に約2分かかっています。 もう少し高速にする方法は 有りますでしょうか? プロシージャーは分けておきたいです。 シートに式は入れたくありません。 Sub 編集にはCall文でさらに別のプロシージャーを5個呼び出しますが F8キーで確認すると、それらは秒速で処理されてました。 一番時間がかかっているのがこの部分なので この部分を対策したいです。 よろしくお願いします。 Sub 編集()  Call 検索キー  Call 日付02   Sheets("シート1").Select   Range("R1") = "キー"   Range("S1") = "日付"   Columns("B:B").Select   Selection.Delete Shift:=xlToLeft   Columns("F:F").Select   Selection.Delete Shift:=xlToLeft   Columns("H:O").Select   Selection.Delete Shift:=xlToLeft   Range("A1").Select   MsgBox "編集終了"   Sheets("シート2").Select End Sub   Sub 検索キー()    '2010年11月17日    'R列にC,D,E列を連結させた値を転記     Sheets("シート1").Select     行 = 2     Do     If Cells(行, 1).Value = "" Then Exit Do     Cells(行, 18).Value = Cells(行, 3) & Cells(行, 4) & Cells(行, 5)     行 = 行 + 1     Loop    End Sub    Sub 日付02()     '2010年11月17日     'A列の値、半角数字8桁を下4桁で     '2桁目に/を入れてS列に転記(セルの値もセル表示も)     '例:A列20101117 S列 11/17     'セルの値が2010/11/17でセルの表示が11/27は不可      Sheets("シート1").Select      For 行 = 2 To Cells(Rows.Count, "A").End(xlUp).Row      With Cells(行, 19)      .NumberFormat = "@"      .Value = Format(Cells(行, 1), "!@@/@@")      End With      Next    End Sub

  • セル結合と列挿入

    マクロの記録を使い書いて見ましたが、1行置きに3行挿入し 、A2:A5 , B2:B5 ,C2:C5 ,D2,D5 言う感じでセル結合を5000行まで行い、最後にD、E列、列の挿入したいのですが、どのように書けば宜しいでしょうか? すでに、データが入っています。 Sub Macro1() Rows("3:5").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Rows("7:9").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("A2:A5").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Range("B2:B5").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Range("C2:C5").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Range("A6:A9").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Range("B6:B9").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Range("C6:C9").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = True .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.Merge Columns("D:E").Select Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove Selection.ColumnWidth = 18.88 Range("A2:A5").Select End Sub

  • VBAマクロエラー【オーバーフローしました。】

    以下のVBAマクロで突然エラーが出るようになってしまいました。 原因がわからず困っています。 どなたかご教授ください。 該当部分 :S = Range("B2").End(xlDown).Row エラーMrg:実行時エラー'6': オーバーフローしました ----------マクロ文---------- Sub 部担コード読み替え() Dim R_Count As Integer Dim P_Sheet As String Dim S As Integer 'データ取込用のファイルを開く Workbooks(D_Book).Activate Sheets("Data1").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select Sheets("Data2").Select Columns("C:C").Select Selection.Insert Shift:=xlToRight Range("B2").Select S = Range("B2").End(xlDown).Row Range("C2:C" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("C1").Value = "部担コード" Columns("G:G").Select Selection.Insert Shift:=xlToRight Range("G2:G" & S).Formula = "=SUBSTITUTE(SUBSTITUTE(RC[-1],""%"",""1""),""*"",""2"")" Range("G1").Value = "キー" Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Columns("B:B").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Columns("E:E").Select Application.CutCopyMode = False Selection.Delete Shift:=xlToLeft Range("A1").Select End Sub

  • EXCEL 外部データの取り込みからのページ取得(VBA)

    OS:WIN XP EXCEL2000使用 EXCELから簡易データ取得を行いたいとおもっています。 マクロ化しVBAをいじって複数のページデータを取得したいと考えています。 取得したいページのURLが ​http://hogehoge.com/0000XXX.html​ XXX部分が数字で001~100まで可変すると想定。 001~100までのデザインは同じ。 1~100までをそれぞれSHEET1~SHEET100までに貼り付けたいとおもっています。 その際に邪魔なA列と1~5行目を削除とする場合 どのような記述に変更すればよいのでしょうか。 ページの取得までは出来るのですが VBAがあまりよくわからないので質問させていただきました。 宜しくお願い致します。 下記001.htmlだけを取得したものになります。 With ActiveSheet.QueryTables.Add(Connection:="URL;​http://hogehoge.com/0000001.html",​ _ Destination:=Range("A1")) .Name = "ExternalData_1" ~800文字に収まらないため中略~ .WebDisableDateRecognition = False .Refresh BackgroundQuery:=False End With Columns("A:A").Select Selection.Delete Shift:=xlToLeft Rows("1:5").Select Selection.Delete Shift:=xlUp Range("A1").Select End Sub

  • VBA 右端列の削除

    このたび初めて質問させていただきます。 周囲にVBAを扱うひとがいないため、初歩的(たぶん?)な質問をさせてください。 以下のようなマクロを記録したのですが、一部を編集したいと考えております。 Columns("F:H").Select Selection.Insert Shift:=xlToRight Columns("A:B").Select Selection.Cut Range("F1").Select ActiveSheet.Paste Columns("J:J").Select→J列固定ではなく右端の列と設定したい。 Selection.Cut Range("H1").Select ActiveSheet.Paste Columns("A:B").Select Selection.Delete Shift:=xlToLeft Columns("J:J").SelectをJ列固定ではなく右端の列を1列設定し切り取りがしたいのです。Range("A2").End(xlToRight).Select ActiveCell.Offset(-1,0).End(xlDown).Select と書き換えてみたのですが、うまく作動しませんでした。 どなたか教えていただけませんでしょうか?

  • エクセルVBAでエラーがでます。

    エクセルで以下のようなVBAをつくりましたが Columns("B:C").Select でエラーがでます。 初歩的なことですが教えてください。 Sub Macro3() ' ' Macro3 Macro Worksheets(1).Copy before:=Worksheets(1) Worksheets(1).Activate Columns("B:C").Select Selection.Delete Shift:=xlToLeft Columns("C:L").Select Selection.Delete Shift:=xlToLeft Columns("H:H").Select Columns("L:AA").Select Selection.Delete Shift:=xlToLeft End Sub

  • for next教えて下さい(;_;)

    以下のように1行残して9行消してという操作を連続してやりたいのですがfor nextをどう使えばうまくいくのかわかりません。誰か教えて下さいお願いしますm(_ _)m Sub Macro1() ' ' Macro1 Macro ActiveWindow.SmallScroll Down:=5 Rows("10:18").Select Selection.Delete Shift:=xlUp Rows("11:19").Select Selection.Delete Shift:=xlUp End Sub

  • 増やした列へ決められた文字を入力するには?

    いつもお世話になっております。 表があり、A列の前に1列追加し、その新しいA列の3行目のセルから表の最終行に「□」(四角)を表示するようにしたいのですが、思うように行かず困っております。 「□」は印刷後に手でチェックを入れる為に使うのが目的です。 Sub test() Columns("A").Select Selection.Insert shift:=xlToRight Dim myrow() As Variant Dim i As Integer For i = Cells(Rows.Count, 2).End(xlUp).Row To 2 Step -1 myrow(i, 3) = "□" & i Next End Sub A列は増えるんですが、その先が動きません。 よろしくお願いいたします。 環境はWindowsXP Excel2003です。

  • マクロを実行するとフリーズしてしまう。

    マクロを実行するとフリーズしてしまいます。 パソコンが原因なのでしょうか? マクロは Sub 抽出() ' '「貼り付け」シートを'一度全てクリアする Sheets("貼り付け").Select Cells.Select Selection.Clear '「元」シートを選択 Sheets("元").Select 'フィルタかけなおし Rows("1:1").Select Selection.AutoFilter Selection.AutoFilter '’抽出前「*」選択 Selection.AutoFilter Field:=1, Criteria1:="~*" '全て選択してコピー Cells.Select Application.CutCopyMode = False Selection.Copy '「元」を貼り付ける Sheets("貼り付け").Select Cells.Select ActiveSheet.Paste 'フォントを「9」 With Selection.Font .Size = 9 End With End Sub です。 パソコンのスペックは celeron® cpu3.20GHz 3.19GHz 1GB RAM です。 最近VBAを覚え始めたばかりな者です。 仕事のデータではもっと複雑なマクロを実行していてもパソコンはなんともないので マクロに原因があるのではなくパソコンに原因があるのでしょうか? (上記のマクロを実行しているのは自宅のPCです) よろしくお願いします。

専門家に質問してみよう