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
============================================================
お礼
kkkkkmさん、回答ありがとうございます。 おかげさまで下記コード上手く処理できました。 (各DIMは、別途記入済みです。) これで以前からセルに手動で入力していたMP3の曲の長さ(再生時間)を 自動で入力出来そうです。 ---------------------------------------------- 'Sub Mp3サイズ読み込み() TargetMP3 = Application.GetOpenFilename("MP3ファイル,*.mp3") MsgBox TargetMP3 Set FSO = CreateObject("Scripting.FileSystemObject") Set SHell = CreateObject("Shell.Application") Set Folder = SHell.Namespace(FSO.GetFile(TargetMP3).ParentFolder.Path) Target = FSO.GetFile(TargetMP3).Name Cells(20, "A") = Folder.GetDetailsOf(Folder.ParseName(Target), 27) Set Folder = Nothing Set SHell = Nothing Set FSO = Nothing End Sub