業務効率化

VBA:UFでカレンダーから日時選択、転記

UFからカレンダーで日付選択しその他、テキストボックスを指定ファイルに転記するマクロです。日付取得とともに何らかの値を転記する際に応用できます。

記事の内容

・挙動

・コード

・ポイント機能

・挙動

下記のような記録表を想定し、日付と内容を最終行に転記したいとします。最終行には最終行というキーワードがあり、そのセルの上に値があるかどうかで、列追加、転記が適切に実施されます。

最終行の上に値あり=行追加の必要がある

今UFでは日付と内容のテキストボックスが配置され、入力値が配列に入れられ、指定行に転記されます。日付はカレンダーから選択できます。

複数選択すると黄色表示されます。選択日時は同じ月日の場合等のロジックを元に年月日に変換され、がボックスに転記されます。

同じ月の連日の場合は年/月/日-日と変換される

最終行の上に値がある場合、上の書式コピーし行を追加します。

値が入っていれば最終行(4行)の書式をコピーし行追加する
UFに入力した値が入力される

また、記録表で日付が記載ない場合であっても、同じ行上に値があればそれは最終行として判断し、上記の新しい行が追加されます。

・コード

・ポイント機能

・カレンダー表示と日付変換

・最終行の条件分岐

カレンダー表示と日付変換

カレンダーはマクロによりその月のカレンダーが日土を左右に配置し、表示されます。土日は色付きであり、選択すると強調されるようになっています。

OKを押すと選択した日付は対象月、ReflectSelectedDates関数で日により日付が変換されます。ロジックとしては選択した日時を昇順で表示し、同じ月の場合にはまとめて表示するなど調整されます。

下記は同月の連続付き、同月のとび日、異なる月を選択した場合の値です。yyyymmddで表示されます。

同月の連続付きは横棒と表示
同月のとび日はコンマで区切る
異なる月の場合は全部が表示

最終行の条件分岐

今回の記録表では、最終行に「最終行」というkeywordがあることを想定し、判定しています。記録表の最終行が分かるkeywordがあればそれに置換え、無ければendメソッドで取得してください。

Findメソッドで固定した箇所から該当する行を取得します。

取得した最終行があれば、その行の上:値が記載されている最終行にて値が記載されているかを判定します。記載ある場合、「最終行文字」変数に値を入れます。

これは日付列が空欄でも、他の列部分が記載されていたらそれは最終行と判定するためです。

つまり下記のような場合も最終行に値が入っているとして判定し、行を追加します。

上記では列indexを4回判定(4列分まで空欄あるか判定)していますが、記録表の列長さに応じて変更してください。今回は2列ですが、そのまま列を多少追加できるようにしています。

内容列に値があるため、列追加判定

最終行取得後は、上記判定結果に応じて新しい列を追加等します。「最終行文字」変数に値がある場合、列を追加し、無ければそのまま転記します。

追加時はすでに記載された行のフォーマットの未コピーするため、Pastespecial xlPasteFormatsを指定しています。

EntireRowプロパティは指定Rangeの全体行を操作でき、ブックで行を選択してコピーするような動作ができます。

-業務効率化