• ベストアンサー

処理を早くできませんか?

お世話になります。 職場で日報をエクセルで作成していて運用してから1年になります。 先日1年となったので、さらに Sub ERS() Dim Msg, Style, Title, Help, Ctxt, Response, MyString Msg = ("入力の全てが消去されます。") & Chr(13) & ("よろしいですか?") & Chr(13) & ("処理には相当時間必要です。") Style = vbYesNo + vbExclamation + vbDefaultButton2 Title = "消去の確認" Help = "DEMO.HLP" Ctxt = 1000 Response = MsgBox(Msg, Style, Title, Help, Ctxt) If Response = vbYes Then GoSub kesu Else Exit Sub End If kesu: For i = 2 To 5200 Step 14 For j = 3 To 12 ActiveSheet.Range("F" & i + j) = "" ActiveSheet.Range("G" & i + j) = "" ActiveSheet.Range("H" & i + j) = "" ActiveSheet.Range("I" & i + j) = "" ActiveSheet.Range("J" & i + j) = "" ActiveSheet.Range("k" & i + j) = "" Next j Next i End Sub というものを作成して、フォーマットの初期化(入力を全て消す)をするようにしました。 しかし、このモジュールでは、処理速度がかなり遅く、数日分の消去にかかった時間から計算すると1年分に130分かかってしまいます。 PCのスペックによるものとはおもいますが、上記のモジュールを書き換えて早く処理できるものなら。。と思い、書き込みさせていただきました。 よろしくご教示願います。 ちなみにOSはWIN2000、EXCEL2002、PCはクロック800MHZです。

  • nkeis
  • お礼率57% (86/150)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 私も、ためしに作ってみました。 MsgBox の凝った造りのわりに、肝心なところをもう少し工夫したほうが良かったですね。元のコードを作る時の集中力があれば、おそらくは、簡単にできただろうに……?? ところで、PCのスペックは、Excelのデモでは、こんなに早いですと、PC画面の比較が出ますが、比較すると思ったほど変わらないような気がしますね。画面表示に関しては差があるようですが、それは、ScreenUpDating でとめてしまえばよいですからね。 Sub ClearData()   Dim Msg As String, Style As Integer, Title As String, Help As String   Dim Ctxt As Integer, Response As Integer, MyString As String   Dim bRng As Range   Dim i As Long      Msg = "入力の全てが消去されます。" & vbCrLf & "よろしいですか?"   Style = vbYesNo + vbExclamation + vbDefaultButton2   Title = "消去の確認"   Help = "DEMO.HLP"   Ctxt = 1000   Response = MsgBox(Msg, Style, Title, Help, Ctxt)      If Response = vbNo Then Exit Sub   Application.ScreenUpdating = False '←ここが大事   With ActiveSheet   Set bRng = Range("F5:K14") 'ベース   For i = 0 To (5200 \ 14) + 1     bRng.Offset(i * 14).ClearContents   Next i   End With   Application.ScreenUpdating = True   Set bRng = Nothing End Sub

nkeis
質問者

お礼

お礼が遅くなりすいません。ご丁寧にご教示いただきありがとうございます。今後ともよろしくお願いします。

その他の回答 (1)

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>ActiveSheet.Range("F" & i + j) = "" 時間が掛るの当然ですね。 範囲を決めて一括で消去する方が何倍も早いですよ。 Dim Msg, Help, Response, i Msg = ("入力の全てが消去されます。") & Chr(13) & ("よろしいですか?") Help = "DEMO.HLP" Response = MsgBox(Msg, vbYesNo + vbExclamation + vbDefaultButton2, "消去の確認", Help) If Response = vbYes Then For i = 2 To 5200 Step 14 Range("F3:K12").Offset(i).ClearContents Next i End If

nkeis
質問者

お礼

お礼が遅くなりすいません。 範囲指定で消去をする方法は気づいてましたが、手法がわかりませんでした。今後ともよろしくお願いします。

関連するQ&A

  • worksheet.find で Day(Now)

    EXCEL マクロでworksheet.find で 特定の日付の並んだ列に Day(Now) を判定基準にした所、2011/1/24 に判定処理を かけたにもかかわらず、2011/11/24 がヒットします。 2011/1/24 もヒットするのですが、11/24 は明らかに 判定ミスなのですが、どうしてこのような事が起こるのでしょうか? Sub ChkDate() ' ' ChkDate Macro ' マクロ記録日 : 2008/06/05 ユーザー名 : XXXXXX ' Dim Rslt, firstaddress, targetrow, c Dim Style, Title, Help, Ctxt, Response, MyString ' Style = vbYesNo + vbInformation + vbDefaultButton2 Title = "Result" Help = "" Ctxt = 1000 Rslt = "" Worksheets("LIST").Activate With Worksheets("LIST").Range("B6:B28") Set c = .Find(Day(Now), LookIn:=xlValues) Rslt = "" If Not c Is Nothing Then firstaddress = c.Address Do Rslt = Rslt + Worksheets("LIST").Cells(c.Row, 1) + Chr(10) + Chr(13) Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstaddress End If End With If Rslt = "" Then Rslt = "No Match" GoTo LabelEnd End If Response = MsgBox(Rslt, Style, Title, Help, Ctxt) If Response = vbYes Then MyString = Rslt Else MyString = "No" End If LabelEnd: End Sub

  • Excel ページ指定連続印刷

    お世話になります。 Excel2003にて sheet1(出力表)  A B C D E F  1行目は項目 1 ○○○○○ 1←表示指定頁数入力 2 *****    3 ***** |印刷|←ボタン A2:E2以降(実際は21行)に、 sheet2(データ)に表の項目順に入力し、並べ替えをしたデータを (A2であれば…データ!B3に必要な項目があるとして…)=IF(OR($F$1=0,$F$1=""),"",IF(OFFSET(データ!B3,($F$1-1)*21,0,1,1)="","",OFFSET(データ!B3,($F$1-1)*21,0,1,1))) で、F1に必要頁を入力し反映させ、表を印刷していましたが、頁数が多くなると手間がかかるので、指定頁までを印刷するように Private Sub CommandButton1_Click() Dim msg, style, title, help, ctxt, response, mystring msg = "表を出力します。" style = vbOKCancel + vbinfomation + vbDefaultButton1 title = "Print Out" help= "demo.hlp" ctxt = 1000 response = MsgBox(msg, style, title, help, ctxt) If response = vbOK Then mystring = "ok" Worksheets("出力表").Activate Dim page As Integer Dim pageend As Integer pageend = Range("F1") For page = 1 To pageend Cells(1, 6) = page Sheet1.PrintOut Next page Else mystring = "cansel" MsgBox "cancel...bye" End If End Sub(見づらいですが行詰めました…) これは、1頁目からの印刷なので、例)3頁目から5頁目を印刷という機能も欲しいな、と思い…F3=開始頁 G3=終了頁を入力…「印刷」…ここまで考えましたがまだあまり応用が利かないため、先に進みません…。 ☆この状態でのページ指定印刷の方法 ☆もっと簡単な方法があるよ!など アドバイスをいただけたら助かります。説明不明瞭で申し訳ありません。

  • VBAのエラー処理がうまくいきません!?

    下記のようなマクロを見よう見まねで作りました。 K13:K43に入れた文字列としての計算式を隣りのJ列に計算された答えを入れるというものです。 うまく動いたのですが、式が間違っている場合、エラーになるのでエラー処理をいれてみました。 On Error GoTo Trapと Exit Sub Trap: MsgBox "式が不正です。", vbCritical, "式" の3行を新たに挿入しましたが、どういうわけか全部がエラーになってしまいMsgBoxが出てしまいます。 どこが間違ったのでしょうか? Sub 包括料算() Dim i As Long Sheets("包括明細").Select For i = 1 To 30 If Range("K" & i + 13) <> "" Then 'K列14~43行で空白以外のセルの場合 On Error GoTo Trap 'エラーの時Trapへ Range("J" & i + 13).Formula = "=ROUND(" & Range("K" & i + 13).Value & ",2)" 'J列14~43行に式としていれる Exit Sub Trap: MsgBox "式が不正です。", vbCritical, "式" End If Next A% = MsgBox("入力完了ですか?" _ + Chr(&HD) + Chr(&HA) + "", vbYesNo + vbQuestion, "確認") Select Case A% Case vbYes 包括終了 '終了用マクロへ Case vbNo Exit Sub End Select End Sub

  • VBAで処理フラグの立て方

    こういった条件でやりたいのですがうまくいきません・・・ 処理フラグの立て方は間違っていないと思うのですが・・・ ちょっとセルとかは変えてあります。 もしE3の値が4で割り切れたら8行目を削除し次の処理は行わない もしE3の値が4で割り切れなかったらE4の値が4で割り切れるか処理をする。 割り切れたら18行目を削除 E3とE4の値両方が4で割り切れなかったら8行目を削除し1行あがるので17行目を削除したいです Sub rdlt() If Range("I1").Value = 0 Then Range("I1").Value = 1 '処理は一度きり If Range("E3").Value Mod 4 = 0 Then Rows("8:8").delete '4で割れたとき8行目を削除 Range("J1").Value = 1 '4で割れたときは次の処理用にフラグ End If If Range("J1").Value = 0 Then 'E3が4で割れなかったときは処理する If Range("E4").Value Mod 4 <> 0 Then Rows("18:18").delete Range("J1").Value = 1 End If End If End If End Sub

  • エクセル マクロ 繰り返し処理の制御方法について

    お世話になります。エクセル初心者です。 登録用のシートから(データ数は、5000行ほど)、印刷用のシートへの転記を考えています。  下記のコードはテスト用の簡易なものですが、試行錯誤でここまではたどりついたのですが。  A列には大分類用の番号を入れてあるので、A列のセルの値が変わるまで、同じ処理を繰り返したいのですが、そのためにはどうしたらよいでしょうか。下記のコードの i と j の変数部分を連動させたい(A列の同じ値の数だけ、5行おきの転記をしたい)のですが。  Do until 構文も試してみたのですが(下記のコードでは、テストなので、「=2」のように固定にして(a)の部分に挿入してみました。)、エラーメッセージに従い、Loop の位置を(b)から(c)に変えてみたところ、無限ループに陥り、対処に困っています。  よろしくお願いします。 Sub test3() Dim i As Long Dim j As Long i = 1 '転記元の行 'Do until range("A"&i)=2 -----------------------(a) For j = 1 To 200 Step 5 '転記先の行 Range("J" & j) = Range("B" & i) Range("k" & j) = Range("C" & i) Range("L" & j) = Range("D" & i) Range("J" & j + 1) = Range("E" & i) Range("J" & j + 2) = Range("F" & i) Range("J" & j + 3) = Range("G" & i) i = i + 1 'Loop-------------------------------------------'(b) Next j 'Loop-------------------------------------------'(c) End Sub

  • マクロが実行しない

     二行三列を一枡として月の勤務割表を作成しています。マクロで同じ事を しているのにMacro1の方が実行しません。お教え願えませんでしょうか。 (尚、図形を枠線上にコピペしています。) Sub Macro1()実行しません。 Dim i As Integer Dim j As Integer For i = 10 To 43 Step 2 For j = 10 To 103 Step 3 Select Case Cells(i, j).Value Case 1: ActiveSheet.Shapes("四角形1").Select Selection.Copy Cells(i + 1, j + 1).Select ActiveSheet.Paste End Select Next Next End Sub Sub Macro2()実行します。 ActiveSheet.Shapes.Range(Array("四角形1")).Select Selection.Copy Range("J11:K11").Select ActiveSheet.Paste End Sub

  • EXCEL VBA シートのコピー後処理?

    EXCEL2013使用にてフォーム内ボタンより 下記、受注一覧表シートをコピー→一番左に配置して 処理シートに名前を変更して J列基準の昇順に並び変えようとしていますが ActiveSheet.Name = "処理シート"で コードの実行が中断されましたメッセージが出ます。 ActiveSheet.Name = "処理シート"にブレークポイントを置いて F8で進めていきますと処理実行します。 ユーザーフォームは UserForm1.Show 0で開いております。 どの箇所の修正を行えばいいのか ご教示時お願いいたします。 Private Sub CommandButton1_Click() Worksheets("受注一覧表").Copy Before:=Worksheets(1) ActiveSheet.Name = "処理シート" Worksheets("処理シート").Select Rows("8:2328").Select Range("B8").Activate ActiveWorkbook.Worksheets("処理シート").Sort.SortFields.Clear ActiveWorkbook.Worksheets("処理シート").Sort.SortFields.Add Key:=Range("J9:J2328") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("処理シート").Sort .SetRange Range("B8:L2328") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("B8").Select End Sub

  • エクセル2013

    下記のコードがうまくいかないのですが間違っているところ教えてください。 標準モジュールです。 Sub color_change() ActiveSheet.Range("b1").Select If ActiveSheet.Range("B1") = "B" Then Selection.Font.ColorIndex = 3 End If End Sub

  • マクロを用いてのデータ加工

    1分のデータ(60個)の平均を繰り返し処理できるようにしたいのですが どうすれば上手くいくでしょうか? 00:00:00~00:00:59までのデータを00:00として平均をとろうと考えています。 単純にやると1440行も書かなくてはいけないので ActiveSheet.Range("L3").FormulaLocal = "=AVERAGE(B3:B62)" ActiveSheet.Range("L4").FormulaLocal = "=AVERAGE(B63:B122)" ・・・ ループ使いたいのですが、変数部分をどうしたらいいのかわかりません。 わかる方よろしくお願いします。 *イメージ Dim i, j For i = B3 To B28743 Step 60 For j = B62 To B28802 Step 60 ActiveSheet.Range("L3:L902").FormulaLocal = =Average(i & ":" & j) Next i,j

  • やはり図形のクリアで実行時エラー1004

     図形を二行三列で一枡とし図形を貼り付けていますが、どうしても実行時エラー 「1004」が出て図形のクリアができません。(尚、四角形は枠線上にあります。) 対処法がありましたらお願いします。 Windows7・SP1 Office2010 Sub 図形の貼付け() Dim i As Integer Dim j As Integer For i = 10 To 43 Step 2 For j = 9 To 99 Step 3 Select Case Cells(i, j).Value Case 1: ActiveSheet.Shapes("四角形1").Select Selection.Copy Cells(i + 1, j + 1).Select ActiveSheet.Paste Case 2: ActiveSheet.Shapes("四角形2").Select Selection.Copy Cells(i + 1, j).Select ActiveSheet.Paste Case 4: ActiveSheet.Shapes("四角形3").Select Selection.Copy Cells(i + 1, j + 1).Select ActiveSheet.Paste Case 5: ActiveSheet.Shapes("四角形3").Select Selection.Copy Cells(i + 1, j + 2).Select ActiveSheet.Paste Case 6: ActiveSheet.Shapes("円1").Select Selection.Copy Cells(i, j).Select ActiveSheet.Paste End Select Next Next End Select End Sub Sub 図形のクリア() Dim myRng As Range Set myRng = Range("I10:CW43") Dim n As Integer, sp As Variant For n = ActiveSheet.Shapes.Count To 1 Step -1 Set sp = ActiveSheet.Shapes(n) If Not Intersect(Range(sp.TopLeftCell, sp.BottomRightCell), myRng) Is Nothing  (ここで実行時エラー1004になります。) Then sp.Delete End If Next Set myRng = Nothing End Sub

専門家に質問してみよう