(4)その他の覚えると便利な日付・時刻関連マクロ例

[1]マクロ処理時間の測定例
特定の時間の周期でマクロを実行する場合や、作成したマクロの評価などで、マクロ処理時間を知りたい
ケースがあります。本サンプルはマクロ測定スタート箇所と測定終了箇所に2ステートメントを貼り付けて
使用します。
画面54 マクロ処理時間の測定例

Sub 日付3_1()
Dim cnt As Integer
 
Application.StatusBar = ""
#### 下記を測定スタート箇所に貼り付け####
timck = Timer
 
For cnt = 1 To 10
   Call demmyMacro
Next
 
####  下記を測定終了箇所に貼り付け ####
MsgBox "マクロ処理時間⇒ " & Timer - timck & "秒"
Application.StatusBar = "マクロ処理時間⇒ " & Timer - timck & "秒"
 
End Sub
-----------------------------------------------------------
Sub demmyMacro()
For j = 2 To 10
    Cells(2, j) = Int((55 - 1 + 1) * Rnd + 1)
    Cells(2, j).Interior.ColorIndex = Cells(2, j)
    Cells(4, 2) = "進捗→" & cnt & "(" & j & "/10)" & "/5"
    Call 時間延長1
Next
End Sub
 


[2]マクロ実行時間を延ばす例
マクロの実行時間を遅くして進行を目で見たいケースもあります。以下は指定した時間の間進行を止める
マクロ例です。
このサンプルマクロの呼び出しは「日付3_1」に入っているので、確認は「Call 時間延長1」を「Call 時間延長2」
または「Call 時間延長3」に変更して実行して下さい。
Sub 時間延長1()
    For t1 = 1 To 1000
        For t2 = 1 To 1000
        Next
    Next
End Sub
-----------------------------------------------------------
Sub 時間延長2()
timck = Timer + 1
   Do
        If Timer > timck Then
             Exit Do
        End If
    DoEvents
   Loop
End Sub
-----------------------------------------------------------
Sub 時間延長3()
 Application.Wait (Now + TimeValue("0:00:01"))
End Sub


[3]文字列日付を日付型に変換例
Webページから株価時系列データをダウンロードすると、日付を含む全データが文字列になっていました。
日付が文字列になっているとExcelの日付処理関数が使用できないなど不便なので、マクロで日付型に
変換しました。「日付3_2」は文字の置換え方式ですが、「日付3_3」のFor文の1行ずつ処理より、一瞬で
全行を変換できるので効率よい(実行例は画面55 参照)。

画面55文字列日付を日付型に変換例 


Sub 日付3_2()
Dim endr As Integer
    endr = Range("A1000").End(xlUp).Row
 
日付表示形式指定
Range(Cells(3, 1), Cells(endr, 1)).Select
    Selection.Replace What:="年", Replacement:="/", _
        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False
    Selection.Replace What:="月", Replacement:="/", _
        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False
    Selection.Replace What:="日", Replacement:="", _
        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False
    Range("A1").Select
End Sub
------------------------------------------------------
Sub 日付3_3()
Dim endr As Integer, i As Integer
    endr = Range("A1000").End(xlUp).Row
 
日付表示形式指定
Range(Cells(3, 1), Cells(endr, 1)).NumberFormatLocal = "yyyy/m/d;@"
For i = 3 To endr
    myhi = DateValue(Cells(i, 1).Value)
    Cells(i, 1).Value = myhi
Next
End Sub


[4]Findメソッドで日付を検索例
日付を検索する場合、Excelシートにはその日付があるのにヒットせず原因が判らず悩んだことのある
経験者は多くいると思います。

Findメソッド検索の場合は、日付チェックをシリアル値で行っており、セルデータが日付型になっていれば、
検索データも日付型であればセルの表示種類が異なっていてもシリアル値が同じであれば抽出します
(実行結果は画面56参照)。検索データも検索される側も日付型になっていれば殆んど問題はありません。

画面56 Findメソッドで日付を検索例

Sub 日付3_4()
Dim mydat As Date, mysel As Range, myrng As Range
Dim stadd As String, msg As String, rr As Integer
 
    Set mysel = ThisWorkbook.Worksheets("検索データ").Columns(1)
    mydat = "2011/12/7"
 
    With mysel
        Set myrng = .Find(mydat, , , xlWhole)
 
        If Not myrng Is Nothing Then
            stadd = myrng.Address
            Do
                rr = myrng.Row
                msg = msg & rr & "行  "
 
               Set myrng = .FindNext(myrng)
               If myrng.Address = stadd Then
                    Exit Do
               End If
            Loop
        End If
    End With
    MsgBox "[" & mydat & "]データは" & Chr(10) & msg
End Sub


[5]AutoFilterメソッドで日付を検索例
AutoFilterメソッドで日付を検索す場合は、セルの表示種類によりヒットしないケースがあるので注意が必要。


[5]-@日付種類を日本語暦で検索例
サンプルデータは画面56と同じデータですが、検索データ「平成23年12月7日」で実行の場合23行目の
「平成23年12月7日」がヒットし正常ですが、「2011/12/7」と「11/12/7」はヒットしません。こちらはシリアル
値でなく「表示されている文字」と完全一致のみが検索されます(実行例画面57参照)

画面57日付種類を日本語暦で検索例


Sub 日付3_5a()
ThisWorkbook.Worksheets("検索データ").Select
endr = Range("A1000").End(xlUp).Row
    Set mysel = Range(Cells(2, 1), Cells(endr, 6))
    mysel.AutoFilter Field:=1, Criteria1:="平成23年12月7日"
End Sub


[5]-A.日付をシリアル値で検索例
前例と同じ「平成23年12月7日」をシリアル値に直してフィルターを実行するとExcel2003では7行目の
「2011/12/7」のみヒットします(画面58参照)。
Excel2010では画面59のようにヒット無しです(無しが正しい結果です)。

AutoFilterメソッドで日付を検索する場合は、検索するデータも検索される側も同じ表示種類になっていないと
問題が発生するので注意してください。

画面58 日付をシリアル値で検索例(Excel2003)


画面59 日付をシリアル値で検索例(Excel2010)


Sub 日付3_5b()
ThisWorkbook.Worksheets("検索データ").Select
endr = Range("A1000").End(xlUp).Row
    Set mysel = Range(Cells(2, 1), Cells(endr, 6))
    mysel.AutoFilter Field:=1, Criteria1:=DateValue("平成23年12月7日")
End Sub


【参考183】変数へ代入した日付で検索する場合の注意点
AutoFilterメソッドを使用する場合は表示種類に注意する件を記述しましたが、検索データキーワードを
変数に代入して実行する場合も注意が必要です。(特に多数の方が使用するマクロを作っている者は、
使用者のPC設定が 自分と同じと決め付けると不具合が発生することがあります)

変数へ代入されたデータはウインドウズの「地域と言語のオプション」で設定した形式になっています。
したがって、セルの日付データを変数へ代入した時、セルへ表示中の形式と異なるケースもありますの
でこれも注意が必要です。
なお、Excelにも影響するウインドウズの設定方法は、[コントロールパネル]→「時計、言語、および地域」
→「日付、時刻または数値の形式の変更」→「形式」→[日付](短い形式)→(yyyy/mm/dd)→[OK]で
設定できます(この表示はWindows7のケースでバージョンにより表示が多少異なります)(画面60参照)

画面60 ウインドウの日付表示形式設定例


日付の形式設定を、VBEのイミディエイトウインドウで確認すると画面61となります。これはA7セルを
変数「dd」に代入して、?Ddで見ると、日付形式変更前は「2012/08/14」でしたが、ウインドウの日付形式を
「yyy/MM/dd(dddd)」に設定した後に再度変数「dd」に入れ確認すると「12/08/14(火)」となっています
(画面61参照)。なお、本例の場合実際に見えるシート上のセル表示は「8月14日」です。

 画面61 変数値の内容確認




【戻る】    【Top画面】   【HPへ】