• ベストアンサー

マクロの処理速度を上げたい

Wendy02の回答

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

こんにちは。 あまり、特定の人をひいきにしたりしてはいけないかもしれませんが、#2 のKenKen_SP さんの入れ出しで2次元配列を使ったものは、文句のつけようがありませんね(^^;。(ボタンを押しました。)KenKen_SPさん以上のものを考えるとなると、ちょっと厳しいです。 私も通常は、同じ方法は使いますが、私の場合は、いろいろ考えすぎてしまいます。 60万のデータですから、VBAとはいいながら、まったく次元の違う世界の話です。簡単にみえて、これは、なかなかできません。 #6のmisatoannaさんの紹介されている OfficeTanakaさんのサイトは、有名で、最近では、そこで書かれている話が常識にもなってきていますが、Select が問題だということよりも、Rangeオブジェクトを選んでアクセスするということに自体に、時間のロスがあります。また、Rangeオブジェクトのプロパティを書かずに、EXCEL側にキャストしてもらうという方法も、時間のロスになりますね。 私は、大量データでなかったら、Selectを入れようが、Selection を使おうが、あまり細かく言う必要はないと思っています。記録マクロを手直しして、Selectをなくしてみたところで、あまり大勢に影響を与えるわけではありません。 ためしに、他の方法で、作ってみましたが、以下のコードは25秒で、KenKen_SPさんのは、11秒でした。どうも、それぞれの列やCriteriaにアクセスするロスが遅くする原因でしょうね。(悔しいです! ) 計測; APIのtimeGetTime /データ;1~30のランダム/範囲; A1:GR3000 まで Sub CeckData2Zero()  Dim myCrng As Range  Dim myCriteria As Range  Dim i As Long  Const myCondition As String = "<10"  Application.ScreenUpdating = False  Range("A1").EntireRow.Insert Shift:=xlDown  Range("A1", Range("A2").End(xlToRight).Offset(-1)).Formula = _  "=""FC"" & COLUMN()"  Set myCrng = Range("A1").CurrentRegion  Range(myCrng.Cells(myCrng.Rows.Count + 1, 1), "A65536").ClearContents  With Range("A65536").End(xlUp).Offset(2)   .Offset(1).Value = myCondition   Set myCriteria = .Resize(2)  End With  For i = 1 To myCrng.Columns.Count   myCriteria.Cells(1, 1).Value = "FC" & i   With myCrng.Columns(i)    .AdvancedFilter _    Action:=xlFilterInPlace, _    CriteriaRange:=myCriteria, _    Unique:=False    .Value = 0    ActiveSheet.ShowAllData   End With  Next  myCriteria.ClearContents  Range("A1").EntireRow.Delete Shift:=xlUp  Application.ScreenUpdating = True  Set myCrng = Nothing End Sub

MARIE1203
質問者

お礼

皆さん、いろいろとプログラムが出てきてすごいです。 もっと勉強して、早く脱初心者したいです。 ありがとうございました。

関連するQ&A

  • 行方向の同じ値のセルを結合するマクロ

    ネットで色々調べながら、A列方向の同じ値のセルを結合させるマクロ を作ってみたのですが、もっと簡単にできるようでしたら教えていただきたいです。 どうぞよろしくお願いいたします。 Sub セル結合() Dim r As Integer '行数 Dim i As Integer 'カウンタ r = Sheets(1).Range("a1").CurrentRegion.Rows.Count - 1 Application.DisplayAlerts = False For i = 1 To r Cells(i, 1).Activate '項目の一つ下のセルをアクティブに If ActiveCell.Value = ActiveCell.Offset(1).Value Then Range(ActiveCell, ActiveCell.Offset(1)).Merge End If Next Application.DisplayAlerts = True End Sub

  • マクロの処理速度向上

    教えてください。マクロ初心者です。以下のようなマクロを組みました。 Sub 処方箋一覧() Dim vbOK As Integer Set WS1 = Worksheets("sheet1") Set WS7 = Worksheets("sheet7") WS7.Select Range("b2").Select Selection.End(xlDown).Select ActiveCell.Offset(1, -1).Select ActiveCell.Offset(0, 1) = WS1.Range("B3") ActiveCell.Offset(0, 2) = WS1.Range("h3") ActiveCell.Offset(0, 3) = WS1.Range("q3") ActiveCell.Offset(0, 4) = WS1.Range("v3") ActiveCell.Offset(0, 5) = WS1.Range("y3")         ~中略~ ActiveCell.Offset(0, 167) = WS1.Range("w75") ActiveCell.Offset(0, 168) = WS1.Range("x75") vbOK = MsgBox("入力完了!!", vbOKOnly, "処理確認") If vbOK = 1 Then Worksheets("sheet1").Activate End If End Sub 合計で167のセルを違うシートに転記するマクロです。 動作するのですが、速度が非常に遅くて困っています。 処理速度を向上させるようなマクロの組み方を調べているのですが、わからず困っています。どなたか、教えていただけると助かります。 よろしくお願いいたします。

  • マクロよ動け

    VBA 難民です。 Excel で、左のセルが空白の場合、印刷文字を見えなくするつもりのマクロを作ってみましたが、知らん顔をされます。声の掛け方がまだよくわかってないのです。 こっちを向かせる方法を教えて下さい。よろしくお願いします。 Sub MacroWhiter() Dim a As Variant Dim b As Variant a = ActiveCell.Value b = ActiveCell.Offset(0, -1).Value '一つ左のセルの値 Range("B1").Activate 'ここから始める Do Until IsEmpty(ActiveCell.Value) '空きセルまで続ける If b = 0 Then 'ゼロの場合 ActiveCell.Font.Color = 2 '文字を白色にする ActiveCell.Offset(1, 0).Activate '下の行に移る End If Exit Do Loop '繰り返す a = ActiveCell.Value

  • 処理速度を早くする

    処理速度を早くする よろしくお願いします。 下の構文で処理するのに5,6秒掛かります。 もっと早く処理をさせる方法をお教えください。 Private Sub 消去_Click() Application.ScreenUpdating = False Dim k As Integer Dim s As Integer With Worksheets("予定情報") k = 1 ActiveCell.Offset(0, k).Value = Temp For s = 0 To 30 ActiveCell.Offset(0, 0 + s).Delete Shift:=xlUp Range("A200:M204").Borders.LineStyle = True Next End With Application.ScreenUpdating = True End Sub

  • エクセルのマクロで

    お世話になります 下記のマクロで実行した所 100まで書式設定で保護、ロックしたいのですが b3:l3はロックするものの 4行目以降はロックしません どうしたらいいでしょうか もう1つ、このシートはいつもc3からはじめたいのですが If ActiveCell.Value >= "" Then の部分はどうしたらいいでしょうか よろしくおねがいいたします 初心者でバカな質問ですみません Sub マクロ1() Dim i As Integer For i = 1 To 100 If ActiveCell.Value >= "" Then Range("B3:l3").Select Selection.Locked = True Selection.FormulaHidden = False End If ActiveCell.Offset(1, 0).Select Next End Sub

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • 任意の整数まで欠番行を挿入するマクロは?

    エクセルのSheet1のA列の1行目から下の行へ1から1000まで数字(整数)が入っているとします。ただし、欠番があります。そこで、欠番を挿入して行を増やしたいのですが、すべての整数を挿入するには以下のマクロで解決しているのですが、任意の整数(下二桁が同じ整数)まで挿入したら次の桁へ飛んで、また同じ任意の整数(下二桁が同じ整数)まで来たら次の桁へ飛んでという具合に、これらを繰り返したいのです。例えば、1から46まで、100から146まで、200から246まで、300から346までという具合です。どなたかご教授よろしくお願いします。 Sub 欠番挿入() Dim i As Integer i = 0 Do Until ActiveSheet.Range("a2").Offset(i, 0).Value = "" ActiveSheet.Range("a2").Offset(i, 0).Activate If ActiveCell.Value <> ActiveCell.Row Then Rows(ActiveCell.Row).Insert ActiveSheet.Range("a2").Offset(i, 0).Value _ = ActiveCell.Row End If i = i + 1 Loop End Sub

  • マクロでの次の実行マクロへの記述

    下記のマクロを記述しました。 一つのマクロ処理を終わらせて、次のマクロ(例:test)を動かしたいのですが何処に 記述したら良いかわかりません。 教えてください。 Sub Macro1() Dim i As Integer Dim buff As String i = 2 While 1 If Range("B" & i).Value = "" Then End End If buff = Range("B" & i).Value Range("B" & i).Value = Left(buff, 7) + " " + Mid(buff, 8, 5) + " " + Right(buff, 6) i = i + 1 Wend   Call test →ここに仮に記述したのですが、testのマクロに行きません。 End Sub 以上

  • 連続印刷処理前に確認しOKしてから再開するマクロ

    連続印刷マクロを作成したのですが、印刷の手前で確認を入れたいので、その処理を教えてください。 エクセルの表は項目が14列あり、999行です。 印刷は、2種類のシートに分け印刷できるようになっているのですが、確認は1度だけを考えています。 Sub 印刷_Click() Worksheets("集計・印刷").Activate '作業シート名 Range("A2").Select '番号(001~999)をこの次の"A3"セルより転記される。 Do '↓ ※1度の作業で15個の番号を最大とします。 'アクティブセルを1つ下に移動 ActiveCell.Offset(1, 0).Select '1度の作業で15枚印刷する。 '空欄であれば、プログラムを終了する 'Trim関数は前後のスペースを消去する If Trim(ActiveCell.Value) = "" Then Exit Do End If '非表示セルは印刷の対象としない If ActiveCell.EntireRow.Hidden = False Then If ActiveCell.Offset(, 2).Value = "単品" Then 'C列で単品の判断をする。 With Worksheets("A") 'Aシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 '繰返し処理をしているので一度に印刷される。 .PrintOut End With ElseIf ActiveCell.Offset(, 2).Value = "複数品" Then'C列で複数品の判断をする。 With Worksheets("B") 'Bシートへ記入 .Range("C3").Value = ActiveCell.Offset(0, 0).Value '番号 .Range("L24").Value = ActiveCell.Offset(0, 2).Value '種類 .Range("F3").Value = ActiveCell.Offset(0, 3).Value '型式 .Range("C23").Value = ActiveCell.Offset(0, 4).Value '測定日 .Range("C24").Value = ActiveCell.Offset(0, 5).Value '製造日 .Range("C9").Value = ActiveCell.Offset(0, 6).Value 'ライン .Range("C10").Value = ActiveCell.Offset(0, 7).Value '担当 .Range("C7").Value = ActiveCell.Offset(0, 9).Value '外観 .Range("C8").Value = ActiveCell.Offset(0, 10).Value '気密 .Range("C11").Value = ActiveCell.Offset(0, 23).Value '(1)min .Range("C12").Value = ActiveCell.Offset(0, 24).Value '(1)max .Range("F7").Value = ActiveCell.Offset(0, 25).Value '(2)min .Range("F8").Value = ActiveCell.Offset(0, 26).Value '(2)max '繰返し処理をしているので一度に印刷される。 .PrintOut End With End If End If Loop End Sub

  • VBAの処理を軽くしたい

    各行ごとに5回セルを参照した結果を吐き出すプログラムを作成しています。 200行前後の処理が必要なのですが、現在のコードではあまりにも処理が重くなっています。 とにかく処理を軽くしたいのですが、どのような方法が考えられるでしょうか? 初心者なのでコードも含めてご教示頂けたら幸いです。 Sub test(b, c, d) Dim i1, i2 As Long Dim A1 As String  For i1=0 To Cells(Rows.Count, 1).End(xlUp).Row For i2 = 0 To 5 If Range(b).offset(i1, i2).Value = "x1" Or Range(c).offset(i1, i2).Value = "x1" Then A1 = "XXX" ElseIf Range(b).offset(i1, i2).Value = Range(c).offset(i1, i2).Value Then A1 = "YYY" Else A1 = "ZZZ" End If Range(d).offset(i1, i2).Value = A1 Next i2 Next i1 End Sub