Excel VBA スケジュールマクロ最適化

このQ&Aのポイント
  • Excel VBA スケジュールマクロの最適化方法を教えてください。
  • セルの塗りつぶしや日付の操作、色の変更などを効率的に行いたいです。
  • VBA初心者ですが、改善ポイントや注意点などを教えてください。
回答を見る
  • ベストアンサー

Excel VBA スケジュールマクロ最適化

現在下記の様なスケジュール表を作成しています。 ・セル(14,3)から下方は"タスク"列 ・セル(14,5)から下方は"開始日"列 ・セル(14,7)から下方は"終了日"列 ・セル(14,8)から下方は"重要度"列 ・セル(11,11)から右側へ日付が連番で入っている ・開始日と終了日を入れると自動的に変更された行を取得し、開始/終了日の範囲でセルの塗り潰しを実行 ・重要度で色を変更し、"M"を入れると★マーク表示し、その右側へタスク名表示 3つ質問があります。 (1)現在、セルの塗り潰しを行うのに下記の様に設定しているのですが、日付を入れてからセルの塗り潰しがされるまで若干時間がかかるのですが、何か他に良い方法は無いでしょうか? (2)あと、終了日の最大値を取得して、セル(11,11)から右側へ伸びている日付行を自動調整したいのですが、方法が分からなくて困っています。 (3)VBA初心者の為、色々調べながら作っているのですが、継ぎはぎだらけなので、改善したらよいポイントなどがあれば教えて頂けると助かります。 ================================================================ Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) Dim Gyo As Long Dim COL As Long Dim c As Integer Dim l As Integer Dim n As Integer c = 11 l = 11 Gyo = Target.Row ' 変更した行を取得 If Gyo <= 13 Then Exit Sub ' 1~13なら無視 COL = Target.Column ' 変更した列を取得 If ((COL <= 4) Or (COL >= 9)) Then Exit Sub '開始日、終了日以外は無視 ' 計算式セット自体でもイベントが発生するのでイベントを抑制 Application.EnableEvents = False '入力した条件により、セルの塗りつぶし範囲を取得 If Cells(Gyo, 5) <= Cells(11, c) Then Do Until Cells(Gyo, 5) >= Cells(11, c) c = c + 1 Loop ElseIf Cells(Gyo, 5) >= Cells(11, c) Then Do Until Cells(Gyo, 5) <= Cells(11, c) c = c + 1 Loop End If If Cells(Gyo, 7) <= Cells(11, l) Then Do Until Cells(Gyo, 7) >= Cells(11, l) l = l + 1 Loop ElseIf Cells(Gyo, 7) >= Cells(11, l) Then Do Until Cells(Gyo, 7) <= Cells(11, l) l = l + 1 Loop End If 'セルの色をクリア Rows(Gyo).Interior.ColorIndex = xlNone 'セルの塗りつぶし範囲に色を設定 If Cells(Gyo, 8) = 1 Then For n = c To l Cells(Gyo, n).Clear Cells(Gyo, n).Interior.ColorIndex = 3 Next n ElseIf Cells(Gyo, 8) = 2 Then For n = c To l Cells(Gyo, n).Clear Cells(Gyo, n).Interior.ColorIndex = 26 Next n ElseIf Cells(Gyo, 8) = 3 Then For n = c To l Cells(Gyo, n).Clear Cells(Gyo, n).Interior.ColorIndex = 5 Next n ElseIf Cells(Gyo, 8) = "M" Then Cells(Gyo, c) = "★" Cells(Gyo, 3).Copy Cells(Gyo, c + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Cells(Gyo, 8).Select Else For n = c To l Cells(Gyo, n).Clear Cells(Gyo, n).Interior.ColorIndex = 10 Next n End If 'イベントを再開 Application.EnableEvents = True End Sub ============================================================

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

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

おはよう御座います 質問の(2)の自動調整ですが、終了日の最大値によって伸ばすだけでなく、短くもするのですか? 処理を重くするだけで、無駄なような気がします 期間を2ヶ月や3ヶ月と決めて、超えるものについては、期間の最終日か欄外に終了日を記入するようにしてはどうか (1)と(3)については、変更・削除をしたので、確認してみてください Private Sub Worksheet_Change(ByVal Target As Range) Dim Gyo As Long Dim COL As Long Dim Cli As Integer '<追加 セルの色用 Dim c As Integer Dim l As Integer Dim n As Integer c = 11 l = 11 Gyo = Target.Row ' 変更した行を取得 If Gyo <= 13 Then Exit Sub ' 1~13なら無視 COL = Target.Column ' 変更した列を取得 'If ((COL <= 4) Or (COL >= 9)) Then Exit Sub '開始日、終了日以外は無視 '<変更1 If ((COL < 4) Or (COL > 9)) Then Exit Sub '開始日、終了日以外は無視 '<変更1 厳密化しただけ ' 計算式セット自体でもイベントが発生するのでイベントを抑制 Application.EnableEvents = False '入力した条件により、セルの塗りつぶし範囲を取得 'If Cells(Gyo, 5) <= Cells(11, c) Then '<削除 'Do Until Cells(Gyo, 5) >= Cells(11, c) '<削除 'c = c + 1 '<削除 'Loop '<削除 'ElseIf Cells(Gyo, 5) >= Cells(11, c) Then '<変更2 If Cells(Gyo, 5) >= Cells(11, c) Then '<変更2 こちらの比較だけでよいように思う 'Do Until Cells(Gyo, 5) <= Cells(11, c) '<変更3 'c = c + 1 '<変更3 'Loop '<変更3 c = Cells(Gyo, 5) - Cells(11, c) + 11 '<変更3 計算で求めることが出来ます Else '<追加 c = Cells(11, 11).End(xlToRight).Column '<追加 変更前の動作を維持するため End If 'If Cells(Gyo, 7) <= Cells(11, l) Then '<削除 'Do Until Cells(Gyo, 7) >= Cells(11, l) '<削除 'l = l + 1 '<削除 'Loop '<削除 'ElseIf Cells(Gyo, 7) >= Cells(11, l) Then '<変更4 If Cells(Gyo, 7) >= Cells(11, l) Then '<変更4 こちらの比較だけでよいように思う 'Do Until Cells(Gyo, 7) <= Cells(11, l) '<変更5 'l = l + 1 '<変更5 'Loop '<変更5 l = Cells(Gyo, 7) - Cells(11, l) + 11 '<変更5 計算で求めることが出来ます Else '<追加 l = Cells(11, 11).End(xlToRight).Column '<追加 変更前の動作を維持するため End If 'セルの色をクリア Cli = -4142 '<追加 xlNoneを数値化 'Rows(Gyo).Interior.ColorIndex = xlNone '<変更6 Rows(Gyo).Interior.ColorIndex = Cli '<変更6 色を変数で設定 'セルの塗りつぶし範囲に色を設定 'If Cells(Gyo, 8) = 1 Then '<変更7 Select Case Cells(Gyo, 8) '<変更7 IfをSerect Caseに変更、構文が短く、見やすい Case 1 'For n = c To l '<変更8 'Cells(Gyo, n).Clear '<変更8 'Cells(Gyo, n).Interior.ColorIndex = 3 '<変更8 'Next n '<変更8 Cli = 3 '<追加 色を変数で設定 'ElseIf Cells(Gyo, 8) = 2 Then '<変更9 Case 2 '<変更9 IfをSerect Caseに変更したため 'For n = c To l '<変更8 'Cells(Gyo, n).Clear '<変更8 'Cells(Gyo, n).Interior.ColorIndex = 26 '<変更8 'Next n '<変更8 Cli = 26 '<追加 色を変数で設定 'ElseIf Cells(Gyo, 8) = 3 Then '<変更9 Case 3 '<変更9 IfをSerect Caseに変更したため 'For n = c To l '<変更8 'Cells(Gyo, n).Clear '<変更8 'Cells(Gyo, n).Interior.ColorIndex = 5 '<変更8 'Next n '<変更8 Cli = 5 '<追加 色を変数で設定 'ElseIf Cells(Gyo, 8) = "M" Then '<変更9 Case "M" '<変更9 IfをSerect Caseに変更したため Cells(Gyo, c) = "★" 'Cells(Gyo, 3).Copy '<変更10 'Cells(Gyo, c + 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '<変更10 'Application.CutCopyMode = False '<変更10 'Cells(Gyo, 8).Select '<変更10 Cli = -4142 '<追加 色を変数で設定 Cells(Gyo, c + 1) = Cells(Gyo, 3) '<変更10 書式は必要ないので値のみコピー 'Else '<変更9 Case Else '<変更9 IfをSerect Caseに変更したため 'For n = c To l '<変更8 'Cells(Gyo, n).Clear '<変更8 'Cells(Gyo, n).Interior.ColorIndex = 10 '<変更8 'Next n '<変更8 Cli = 10 '<追加 色を変数で設定 'End If '<変更9 End Select '<変更9 IfをSerect Caseに変更したため For n = c To l '<変更8 ここに移動して、まとめて処理 Cells(Gyo, n).Clear '<変更8 ここに移動して、まとめて処理 Cells(Gyo, n).Interior.ColorIndex = Cli '<変更8 ここに移動して、まとめて処理 Next n 'イベントを再開 Application.EnableEvents = True End Sub

oookazu
質問者

お礼

早速のご回答ありがとうございました。 計算で求めたり、If文をSelect文にするなどされてて、構文がとても見やすくなりました。 頭の中がぐちゃぐちゃになっていたので、とても助かりました! ただ、何故か"M"を入力しても★と文字が消えてしまうので、下記の2行をselect文の上に持って来させて頂きました。 For n = c To l '<変更8 ここに移動して、まとめて処理 Cells(Gyo, n).Clear '<変更8 ここに移動して、まとめて処理 質問(2)の自動調整は長くしたり短くしたりするつもりです。 (場合によっては数週間の予定であったり、数年の予定であったりするもので。。。) ただ、処理が遅くなるとの事ですので、ボタンなどを追加して独立した処理をさせようと思います。 まだどの様に作るかモヤモヤしてる所ですが、hige_082様の構文で色々と勉強になる部分もあったので、また自分なりに考えて作ってみます。また分からない場合は質問させて頂きますので、宜しくお願いします。

関連するQ&A

  • エクセル2003 VBAマクロにて 背景色 白色の抽出

    エクセル2003のマクロでセル背景色にて抽出したいのですが 背景色が白色(空白)の抽出ができません。 背景色別に 他セルに文字を自動記入したいのですが、 背景色が白(collorindex=0)の認識をしてくれません。 カラーインデックスでは、白は「0」か「2」になっているので その値でマクロを組んでも認識してくれないようです。 どのようにすればよいのでしょうか? 以下に私(素人)のマクロ文(一部)です。ご指摘お願い致します。 Dim 行番号 As Integer 行番号 = 7 Do Until Cells(行番号, 1).Value = "" If Cells(行番号, 9).Interior.ColorIndex = 5 Then Cells(行番号, 14).Value = "3号機"   ElseIf Cells(行番号, 9).Interior.ColorIndex = 7 Then Cells(行番号, 14).Value = "4号機" ElseIf Cells(行番号, 9).Interior.ColorIndex = 0 Then Cells(行番号, 14).Value = "未加工" End If 行番号 = 行番号 + 1 Loop

  • VBAでの計算後のセルに2重線で囲む

    まだPC・VBA不慣れな為、実行できないので、教えてください。 c16セルに休日を入力すると無理つぶしは成功しましたが、c16セルに祭日を入力すると赤の2重線で囲みたいのですが、できませんので、方法をお願いします。 もう1点がCELLS・RANGEを使った2種類の方法をお願いします。 よろしくお願いします。 Sub 練習44() Dim kyuyo As Currency If Range("c16").Value = "祭日" Then Worksheets("練習1If~Then").Cells(16, 3).xlDouble.ColorIndex = 3 ElseIf Range("c16").Value = "休日" Then Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 5 Else Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 10 End If End Sub

  • エクセル マクロ 複数セルの色付けについて

    マクロ初心者で苦戦しており、教えていただけると大変ありがたいです。 エクセルの複数のシートに、問2_1 、問2_2 、問2_10 (全部で問は2_28まであります)等の文字列があり、その文字に合わせて、そのセルだけ色を付けたいと考えております。 今書いているコードだと、ワークシートのA列にある場合は色が付けられるのですが、それ以外に色が付けられません。どこが間違っているでしょうか? どうぞご指導お願いいたします。 Sub 色つけ() Dim Maxrow As Long Dim i As Long Maxrow = Cells(Rows.Count, i).End(xlUp).Row For i = 1 To Maxrow If InStr(Cells(i, 1), "2_1 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_2 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_23 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 23 If InStr(Cells(i, 1), "2_13 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 4 If InStr(Cells(i, 1), "2_6 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 7 Next i End Sub

  • Excel2003 VBA 文字を打ち込んだだけで色が変わる方法

    突然失礼いたします。 前回、ファイルを開いたときに、青文字は無視、マイナスのときは赤に塗りつぶし、プラスのときは緑に塗りつぶし、それ以外は無視というプログラムを作りました。 今回は、それを文字を打っただけで実行できるようにしたいのですが、良い案はありますでしょうか。 ボタンを押すと・・・って処理でも良いんですが、それだと部長が忘れる可能性が高いんで・・・(^^;) 前回のプログラム: Private Sub Workbook_Open() Dim 英語 As Integer Dim 数字 As Integer Dim sh1 As Worksheet 英語 = 1 数字 = 1 For 数字 = 1 To 17 For 英語 = 1 To 7 '選択セル内が、文字色が青だったら無視、数字がマイナスだったら赤、数字がプラスだったら緑、それ以外は無視 If Cells(英語, 数字).Font.ColorIndex = 5 Then Cells(英語, 数字).Interior.ColorIndex = 0 ElseIf Cells(英語, 数字) < 0 Then Cells(英語, 数字).Interior.ColorIndex = 7 ElseIf Cells(英語, 数字) > 0 Then Cells(英語, 数字).Interior.ColorIndex = 4 Else Cells(英語, 数字).Interior.ColorIndex = 0 End If Next 英語 Next 数字 End Sub

  • このVBAソースのどこが間違ってるか教えてください

    Dim csp As Integer 'ストップ Dim css As Integer 'ストップorスタート Sub Quest2() If css = 0 Then css = 1 Quest2a Else cstp = 1 css = 0 End If End Sub Sub Quest2a() Sheets("Sheet1").Select Range("B1:J10").Select Selection.Interior.ColorIndex = x1None Range("a1").Select cstp = 0 Do r = 1: c = 5 For i = 0 To 15 If i < 9 Then Cells(r, c).Interior.ColorIndex = x1None r = r + 1 If i < 5 Then c = c + 1 Else c = c - 1 End If Cells(r, c).Interior.ColorIndex = 3 Else Cells(r, c).Interior.ColorIndex = x1None r = r - 1 If i < 13 Then c = c - 1 Else c = c + 1 End If Cells().Interior.ColorIndex = 3 End If 'タイミング For tm1 = 1 To 1000: For tm2 = 1 To 100: Next If cstp = 1 Then Exit For End If Next DoEvents If cstp = 1 Then Exit For End If If r = 3 And c = 5 Then Cells(r, c).Interior.ColorIndex = x1None End If Next DoEvents If cstp = 1 Then Exit Do End If Loop Cells(10, 9) = Cells(r, c) Cells(10, 9).Interior.ColorIndex = 8 End Sub

  • EXCEL VBAについて

    EXCEL VBAについて教えてください やりたいことは以下の通りです。 ・全シートJ列1~100行目を検索しアルファベットが含まれるセルが存在すれば 上のセルをコピーする ここまで作ったのですが上手くいきません Sub VBAsample() Dim GYO As Long For GYO = 1 To 100 If Find([a-z], LookAt:=xlPart) Then Cells(GYO, 10).Value = Cells(GYO - 1, 10).Value End If Next GYO End Sub 添削をお願いします

  • エクセルマクロ 範囲内のTOP行位置等を知りたいです。

    エクセルマクロで以下の事がしたいのですが、行き詰ってしましました。 どなかたご教授願います。 事前に セルのA1:B3 に名前をつけておきます。 名前は"board"とします。 (1)選択したセルが"board"内に含まれるかどうかをマクロで判定したい。 (2)"board"範囲のセルに対して一つづつある処理をしたいのです。 (たとえば、色を変えるとか、データをSETするとか。) FOR文をふたつ組み合わせて 順番に処理しようとしているのですが、"board"のTOPの行 と 最終行、及び 同じくTOPの桁位置 と 最終桁 を取得するにはどうすればいいでしょうか? ROW1 = 7 ← この4つの変数を動的に取得したいのです。 ROW2 = 17 COL1 = 9 COL2 = 21 For I = ROW1 To ROW2 For K = COL1 To COL2 Cells(I, K).Select If Selection.Interior.ColorIndex = COLKUROX Then Selection.Interior.ColorIndex = COLKURO ElseIf Selection.Interior.ColorIndex = COLSIROX Then Selection.Interior.ColorIndex = COLSIRO ElseIf Selection.Interior.ColorIndex = COLWAKUX Then Selection.Interior.ColorIndex = COLWAKU End If Next Next  (3)これはマクロとは関係ないのですが・・・   "board"の名前を設定するときに間違って違うセル範囲につけてしまいました。 一旦つけた名前を削除したいのですが、やり方がわかりません。 以上 3 点 についてお願いします。 (1)は(2)を解決できれば、IF 文を使ってできそうなのですが、 Intersect を使ってできないでしょうか? Set myRange = Application.Intersect(??????, Range("board")) ↑ ?????のところに指定したセルを書けば、このマクロの結果がエラーになるかならないかで判定できないかな・・・・と。

  • ExcelのVBAで質問です。

    以下のようなシートがあります。 A列  B列  C列  D列  E列  F列  G列  H列 NO  名前  確認 日付1 日付2  確認 日付1 日付2 6行目からデータを入れる予定です。 C列には○印を入力します。 C列~E列までデータが入った行は、 F列~H列まで同じ処理をします。 (セルの背景色を変えます。) 以後同じことを列方向で繰り返します。 以下のようなVBAを組みましたが、 ○の個数を数える部分でエラーがでます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim staff As String Dim kakunin As String Dim date1 As Date Dim date2 As Date Dim i As Long Dim j As Long Dim cnt As Long '100件分ループ For i = 6 To 105 '○の数をカウント cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(i, 2), Cells(i, 256)), "○") 'jとは確認の列番号のこと j = 3 * cnt staff = Cells(i, 2) kakunin = Cells(i, j) date1 = Cells(i, j + 1) date2 = Cells(i, j + 2) 'スタッフ名が入力されたら If staff = "" Then Range(Cells(i, j), Cells(i, j + 50)).Interior.ColorIndex = 15 Else Cells(i, j).Interior.ColorIndex = xlNone '○が入力されたら If kakunin = "○" Then Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = xlNone Else Range(Cells(i, j + 1), Cells(i, j + 2)).Interior.ColorIndex = 15 End If If Cells(i, j + 1) <> "" And Cells(i, j + 2) <> "" Then Cells(i, j + 3).Interior.ColorIndex = xlNone End If End If Next i End Sub ご教授いただけたら、幸いです。 よろしくお願いいたします。

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • Excel  VBAのマクロについて

    以下のようなマクロを作りました。 P4に開始番号P6に終わりの番号があるのですが、P4=P6、つまり、一つだけのシートを作成する分には問題なく動きます。しかしP4に1、P6に5と範囲を増やすとエラーが出て動きません。どこをなおしたらよろしいでしょうか? Option Explicit Sub 一括() Dim I As Worksheet Dim SheetName As String Dim Prompt As String Dim Col As Integer Dim Cell As Range Dim Row As Long Dim hani As Long For hani = Range("P4").Value To Range("P6").Value Set I = ActiveSheet SheetName = Cells(hani + 4, "K").Value & "(" & Cells(hani + 4, "B") & ")" Prompt = SheetName & "が存在します。" Sheets("基本シート").Copy After:=Sheets("基本シート") On Error GoTo 100 ActiveSheet.Name = SheetName On Error GoTo 0 Range("X3") = I.Cells(hani + 4, "B") Range("E8") = I.Cells(hani + 4, "C") Range("A13") = I.Cells(hani + 4, "D") For Col = 0 To 8 Step 4 Set Cell = I.Cells(hani + 4, "D").Offset(, Col) If Cell > 0 Then Prompt = "該当する日付がありません。" & Cell.Address On Error GoTo 100 Row = WorksheetFunction.Match(Cell, [A:A], 0) On Error GoTo 0 Cells(Row, "E") = I.Cells(hani + 4, "E").Offset(, Col) Cells(Row, "H") = I.Cells(hani + 4, "F").Offset(, Col) If Col < 8 Then Cells(Row, "Y") = I.Cells(hani + 4, "G").Offset(, Col) End If End If Next Col Next hani End 100 If Err <> 1004 Then Error Err End End If MsgBox Prompt, vbCritical Application.DisplayAlerts = False ActiveSheet.Delete Application.DisplayAlerts = True Sheets(1).Select End Sub

専門家に質問してみよう