今日のデータを入力するセルへ [コンピューター]
勤務管理表とか、毎日データを入力して欲しい表があったとして、表を開いたら、今日のデータを入力する行へ飛ぶエクセルのVBAマクロを考えました。
まず、アルゴリズムを考えます。
1.表(ワークシート)を開いたら、マクロを自動起動する。
2.今日のデータを入力する行を探す。
3.見つかったら、その行へ飛ぶ。
と、これだけなのですが、実際作ってみると、案外難しかったです。
1.表(ワークシート)を開いたら、マクロを自動起動する。
VBAのウィンドウを開き、ThisWorkbookで「Workbook」「Open」をプルダウンメニューから選び、次のコードを打ち込む。
Private Sub Workbook_Open()
Call JumpToday ' 今日へ飛べ
End Sub
表(ワークシート)を開いたとき、JumpTodayマクロが自動起動します。
2.今日のデータを入力する行を探す。
3.見つかったら、その行へ飛ぶ。
今日の日付は、Date関数で入手します。今日の日付を検索するため、Find関数を使います。
2014/8/31の記事で紹介した勤務管理表ではA列に「日」を表示していました。
http://cheese999.blog.so-net.ne.jp/2014-08-31
今日を「年月日」で判定したいので、「年月日」を表示する列をA列の左に追加し、新しいA列とします。
A列には直接「年月日」の値を入力せず、B列を参照する式を入力します。A列、B列、C列に入力している式、値、書式は次のとおりです。
Find関数の引数は、Find(What:=Date, LookIn:=xlValues)とします。What引数とLookIn引数の組合せにより、
日付がうまく検索できない場合もあるようです。詳しくは、Office TANAKAの「日付を検索する」の記事を参考にして下さい。
http://officetanaka.net/excel/vba/tips/tips131d.htm
なお、年月日(A列)の書式は、「*2012/3/14」とします。理由は、上記の、Office TANAKAの記事の解説を参考にして下さい。
書式が「2012/3/14」だと、うまく検索できません。
年月日のセル範囲に「年月日」の名前を付け、A列は非表示にしておきます。
VBAに標準モジュールを追加し、そこにJumpTodayマクロを記入します。
01:Sub JumpToday()
02: ' 機能:今日の日付へ飛ぶ
03: ' 【変数】
04: Dim FoundCell1 As Range
05: Application.ScreenUpdating = False ' 画面更新停止
06: Columns("A").Hidden = False ' A列を再表示
07: ' 今日の日付を探す
08: Set FoundCell1 = Range("年月日").Find(What:=Date, LookIn:=xlValues)
09: If FoundCell1 Is Nothing Then
10: MsgBox "今日(" & Date & ")の日付が見つかりません。"
11: Else
12: Application.Goto FoundCell1.Offset(0, 3), True ' 今日の出社時刻のセルを選択
13: ActiveWindow.SmallScroll Up:=1, ToLeft:=2 ' 1つ上、2つ左にスクロール
14: End If
15: Columns("A").Hidden = True ' A列を非表示
16: Application.ScreenUpdating = True ' 画面更新再開
17:End Sub
6行目:年月日を記入したA列を再表示します。
8行目:Find関数で今日の日付を検索します。今日の日付が見つかったら、その位置をFoundCell1に格納します。
12行目:Goto関数で、FoundCell1の3セル右の出社時刻に移動し、左上に表示されるようにスクロールします。
13行目:そのままでは、日(B列)、曜(C列)が見えませんし、前日のデータも見たいので、SmallScroll関数で1つ上、2つ左にスクロールします。
15行目:最後にA列を非表示にして終了です。
(おまけ)
今日の日付を強調するため、条件付き書式を追加しています。
数式:=B2=TODAY() 【今日】★今回、追加
数式:=WEEKDAY(B2)=1 【日曜】
数式:=WEEKDAY(B2)=7 【土曜】
なお、土日を判定する数式としては、
=TEXT(B2,"aaa")="日" 【日曜】
=TEXT(B2,"aaa")="土" 【土曜】
でも、いけます。
まず、アルゴリズムを考えます。
1.表(ワークシート)を開いたら、マクロを自動起動する。
2.今日のデータを入力する行を探す。
3.見つかったら、その行へ飛ぶ。
と、これだけなのですが、実際作ってみると、案外難しかったです。
1.表(ワークシート)を開いたら、マクロを自動起動する。
VBAのウィンドウを開き、ThisWorkbookで「Workbook」「Open」をプルダウンメニューから選び、次のコードを打ち込む。
Private Sub Workbook_Open()
Call JumpToday ' 今日へ飛べ
End Sub
表(ワークシート)を開いたとき、JumpTodayマクロが自動起動します。
2.今日のデータを入力する行を探す。
3.見つかったら、その行へ飛ぶ。
今日の日付は、Date関数で入手します。今日の日付を検索するため、Find関数を使います。
2014/8/31の記事で紹介した勤務管理表ではA列に「日」を表示していました。
http://cheese999.blog.so-net.ne.jp/2014-08-31
今日を「年月日」で判定したいので、「年月日」を表示する列をA列の左に追加し、新しいA列とします。
A列には直接「年月日」の値を入力せず、B列を参照する式を入力します。A列、B列、C列に入力している式、値、書式は次のとおりです。
A列 | B列 | C列 | |
書式 | *2012/3/14 | d | aaa |
行番号 | A列 | B列 | C列 |
2 | =B2 | 2014/9/1 | =B2 |
3 | =B3 | =DATE(YEAR(B2),MONTH(B2),DAY(B2)+1) | =B3 |
| | | | | | | |
32 | =B32 | =DATE(YEAR(B31),MONTH(B31),DAY(B31)+1) | =B32 |
Find関数の引数は、Find(What:=Date, LookIn:=xlValues)とします。What引数とLookIn引数の組合せにより、
日付がうまく検索できない場合もあるようです。詳しくは、Office TANAKAの「日付を検索する」の記事を参考にして下さい。
http://officetanaka.net/excel/vba/tips/tips131d.htm
なお、年月日(A列)の書式は、「*2012/3/14」とします。理由は、上記の、Office TANAKAの記事の解説を参考にして下さい。
書式が「2012/3/14」だと、うまく検索できません。
年月日のセル範囲に「年月日」の名前を付け、A列は非表示にしておきます。
VBAに標準モジュールを追加し、そこにJumpTodayマクロを記入します。
01:Sub JumpToday()
02: ' 機能:今日の日付へ飛ぶ
03: ' 【変数】
04: Dim FoundCell1 As Range
05: Application.ScreenUpdating = False ' 画面更新停止
06: Columns("A").Hidden = False ' A列を再表示
07: ' 今日の日付を探す
08: Set FoundCell1 = Range("年月日").Find(What:=Date, LookIn:=xlValues)
09: If FoundCell1 Is Nothing Then
10: MsgBox "今日(" & Date & ")の日付が見つかりません。"
11: Else
12: Application.Goto FoundCell1.Offset(0, 3), True ' 今日の出社時刻のセルを選択
13: ActiveWindow.SmallScroll Up:=1, ToLeft:=2 ' 1つ上、2つ左にスクロール
14: End If
15: Columns("A").Hidden = True ' A列を非表示
16: Application.ScreenUpdating = True ' 画面更新再開
17:End Sub
6行目:年月日を記入したA列を再表示します。
8行目:Find関数で今日の日付を検索します。今日の日付が見つかったら、その位置をFoundCell1に格納します。
12行目:Goto関数で、FoundCell1の3セル右の出社時刻に移動し、左上に表示されるようにスクロールします。
13行目:そのままでは、日(B列)、曜(C列)が見えませんし、前日のデータも見たいので、SmallScroll関数で1つ上、2つ左にスクロールします。
15行目:最後にA列を非表示にして終了です。
(おまけ)
今日の日付を強調するため、条件付き書式を追加しています。
数式:=B2=TODAY() 【今日】★今回、追加
数式:=WEEKDAY(B2)=1 【日曜】
数式:=WEEKDAY(B2)=7 【土曜】
なお、土日を判定する数式としては、
=TEXT(B2,"aaa")="日" 【日曜】
=TEXT(B2,"aaa")="土" 【土曜】
でも、いけます。
「ヤバイぜ!」 ありがとうございます。[__猫]
今日の年月日を検索するために列を追加しなくても、実現できることが分かりました。次回、記事にします。
by cheese999 (2014-09-24 22:54)