質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2141閲覧

VBA ファイル自動選択

King_of_Flies

総合スコア382

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/05/22 06:33

編集2017/05/22 07:05

前回の続きで質問させていただきます。

https://teratail.com/questions/77155

こちらの質問で大きな問題を解消し、問題はほぼクリア致しました。
一応、業務ロジックを説明しますと、
このツールを使用した日時作業は、
昼、夕方の二回で行われ、
昼は前日の18:00~当日の12:00までに作成されたファイルの選択。
夕方は当日の12:00~18:00までに作成されたファイルの選択となっています。
ただここで、一つアクションを加えたい。

そのアクションというのが、前日が休日だった場合のファイル選択です。
土曜、日曜もファイルが作成されていて、
休み明けの最初の昼にこのツールを使用した際のファイル選択は、
先週の金の18:00~当日の12:00までに作成されたファイルの選択を行いたいです。

つまり3日前までに遡ってデータ取得を行います。
これだけであるのであれば、
Dim threeDaysBefore = Now - 3などをして、
三日前、二日前、一日前のそれぞれのファイル名を生成すればよいのですが、
例えば、祝日後のファイル選択は二日しか遡る必要は無いし、
祝日、土日と続いた場合は4日遡る必要があります。

そういった場合のロジックとして
国民カレンダー上、赤日になっている日付分だけを遡り、
ファイル名を生成して、ファイル選択することは可能でしょうか。

よろしくお願いします。

追記
自分で編集したコードは最終的に下記のようになりました。

夕方

Private Sub CommandButton1_Click() Dim befIdx As Long ' リストボックスクリア lstConcat.Clear '1a+mmddのファイル名を生成 Dim s1File As String s1File = "1a" s1File = s1File & Right("0" & Month(Now), 2) s1File = s1File & Right("0" & Day(Now), 2) 'yyyymmdd-1のファイル名を生成 Dim s2File As String s2File = Year(Now) s2File = s2File & Right("0" & Month(Now), 2) s2File = s2File & Right("0" & Day(Now), 2) s2File = s2File & "-1" '命名ルールで-1 -2があるので-1だけという処理を追加してるだけです。 ' ファイル名に1a+mmddと付くファイルとyyyymmdd-1の付くファイルを選択し、移動 For befIdx = 0 To lstBefore.ListCount - 1 If InStr(lstBefore.List(befIdx), s1File) > 0 Then lstConcat.AddItem lstBefore.List(befIdx) End If If InStr(lstBefore.List(befIdx), s2File) > 0 Then lstConcat.AddItem lstBefore.List(befIdx) End If Next End Sub

Private Sub CommandButton3_Click() Dim befIdx As Long ' リストボックスクリア lstConcat.Clear '今日のシステム日時を格納 Dim today As Date today = Now '昨日のシステム日時を格納 Dim yesterday As Date yesterday = Now - 1 '1a+mmddのファイル名を生成 Dim s1File As String s1File = "1a" s1File = s1File & Right("0" & Month(today), 2) s1File = s1File & Right("0" & Day(today), 2) '1a+mmdd(-1d)のファイル名を生成(-1dは前日の意 Dim s2File As String s2File = "1a" s2File = s2File & Right("0" & Month(yesterday), 2) s2File = s2File & Right("0" & Day(yesterday), 2) 'yyyymmdd-1のファイル名を生成 Dim s3File As String s3File = Year(today) s3File = s3File & Right("0" & Month(today), 2) s3File = s3File & Right("0" & Day(today), 2) s3File = s3File & "-1" 'yyyymmdd(-1d)のファイル名を生成 Dim s4File As String s4File = s4File & Year(yesterday) s4File = s4File & Right("0" & Month(yesterday), 2) s4File = s4File & Right("0" & Day(yesterday), 2) s4File = s4File & "-1" ' ファイル名に1a+mmddと付く当日及び前日のファイルとyyyymmdd-1の付くファイルを選択し、移動 For befIdx = 0 To lstBefore.ListCount - 1 If InStr(lstBefore.List(befIdx), s1File) > 0 Then lstConcat.AddItem lstBefore.List(befIdx) End If If InStr(lstBefore.List(befIdx), s2File) > 0 Then lstConcat.AddItem lstBefore.List(befIdx) End If If InStr(lstBefore.List(befIdx), s3File) > 0 Then lstConcat.AddItem lstBefore.List(befIdx) End If If InStr(lstBefore.List(befIdx), s4File) > 0 Then lstConcat.AddItem lstBefore.List(befIdx) End If Next End Sub

追記2
どうやら祝日判定には新たにプラグイン的なものを使用しないといけないみたいですね^^;
ちょっと難しそうなので
土日のみで解決したいと思います

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

一応前回の回答者ですので、回答してみます。
土日の判定はWeekday関数で良いのですが、問題は祝日の判定ですね。
標準関数には持ってないので、自作するしかないです。
とりあえずは自作関数内に祝日データを持つ形で実装してみました。
自動で取得したいとなると過去質問にもあるように、どこかのサイトからデータを取得してこないといけなくなり、実装はそれなりに大変です。
もしくはアドインが可能であれば、daiveさん回答の方法が良いかもしれません。
毎年のメンテナンスが苦ではないなら、下記のように手入力でも十分です。
逆にこの方が祝日以外の特別な日も設定できるので、そういうメリットもあります。

VBA

1Private Sub CommandButton1_Click() 2 3'~省略~ 4 5 Dim pd As Date 6 7 ' 前日を求める 8 pd = Now - 1 9 While Weekday(pd) = 1 Or Weekday(pd) = 7 Or holiday(pd) 10 pd = pd - 1 11 Wend 12 13 ' 前日ファイル名 14 s2File = Year(pd) 15 s2File = s2File & Right("0" & Month(pd), 2) 16 s2File = s2File & Right("0" & Day(pd), 2) 17 18'~省略~ 19 20End Sub 21 22' 祝日判定 23Function holiday(d As Date) 24 Dim holidays As Variant 25 Dim ds As Date 26 ds = Year(d) & "-" & Month(d) & "-" & Day(d) 27 holidays = Array( _ 28 CDate("2017-01-01"), _ 29 CDate("2017-01-02"), _ 30 CDate("2017-01-09"), _ 31 CDate("2017-02-11"), _ 32 CDate("2017-03-20"), _ 33 CDate("2017-04-29"), _ 34 CDate("2017-05-03"), _ 35 CDate("2017-05-04"), _ 36 CDate("2017-05-05"), _ 37 CDate("2017-07-17"), _ 38 CDate("2017-08-11"), _ 39 CDate("2017-09-18"), _ 40 CDate("2017-09-23"), _ 41 CDate("2017-10-09"), _ 42 CDate("2017-11-03"), _ 43 CDate("2017-11-23"), _ 44 CDate("2017-12-23")) 45 If UBound(Filter(holidays, ds)) <> -1 Then 46 holiday = True 47 Else 48 holiday = False 49 End If 50End Function 51

投稿2017/05/22 07:12

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

King_of_Flies

2017/05/23 00:06

お疲れ様です。 先日はありがとうございました。 ちょっと要望の追加なのですがConcatListに移動したファイルのソートをしたいと考えているのですが、 名前順とかではなく、完全にバラバラです。 こういった場合のソートっていうのは可能ですか?
ttyp03

2017/05/23 00:08

規則性やルールがないとプログラムでソートさせるのは無理です。 何かそういうのはありますか?
King_of_Flies

2017/05/23 00:25

現在のConcatList Comitt処理時間測定2017/0523-1.pdf 【CIWEB】Statspack_log file sync 平均待機時間_1a0523-1.pdf 【CIWEB】Statspack_log file sync 平均待機時間_1a0523-2.pdf 【CIWEB】Statspack_sql_slapse_1a0523.pdf 【CIWEB】Statspack解析結果_1a0523.pdf ソート後の想定 【CIWEB】Statspack解析結果_1a0523.pdf 【CIWEB】Statspack_log file sync 平均待機時間_1a0523-1.pdf 【CIWEB】Statspack_log file sync 平均待機時間_1a0523-2.pdf 【CIWEB】Statspack_sql_slapse_1a0523.pdf Comitt処理時間測定2017/0523-1.pdf
King_of_Flies

2017/05/23 00:26

また日によってComitt処理のファイルが増加する。 って感じですね その場合は日付の昇順です
ttyp03

2017/05/23 00:31

想定されるソート結果があるということは、何かしらルールがあるわけですよね。 【CIWEB】Statspack解析結果、が先頭 【CIWEB】Statspack_log file sync 平均待機時間、が次 【CIWEB】Statspack_sql_slapse、がその次 Comitt処理時間測定、がその次 あとは同一分類内で、_以降で昇順にソート、など。 そういう決まりを明確にすればソートは可能です。
King_of_Flies

2017/05/23 00:34

そうですね、ルールはありました。
guest

0

曜日の取得は、WeekDay関数で可能です。ただし、祝日の判断は、簡単ではないです。
方法としては、下記のか2つの方法のどちらかになります。

  • 祝日の日付のリストをシートに入力しておいてそれを参照する
  • 祝日を判断するユーザー定義関数を自作する

幸いなことに、祝日を判断する関数を下記で公開してくれてます。

AddinBox(祝日マクロ-1)

これを使って、ループで前日を土日か祝日かを判定して、平日までさかのぼる処理をかけばいいでしょう。

ただ、コードを見るとコマンドボタンで処理を実行しているようですか、クリックを忘れたり、なんらかのエラーで実行に失敗することをあると思いますので、取得した最終のファイル名をどこかに保存しておいて、次の処理のときに、保存しておいた最終ファイル名の次から取得するというロジックにした方がいいように思います。

投稿2017/05/22 07:18

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問