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

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

ただいまの
回答率

88.93%

VBA ファイル自動選択

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,262

King_of_Flies

score 314

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

Private Sub CommandButton1_Click()

'~省略~

    Dim pd As Date

    ' 前日を求める
    pd = Now - 1
    While Weekday(pd) = 1 Or Weekday(pd) = 7 Or holiday(pd)
        pd = pd - 1
    Wend

    ' 前日ファイル名
    s2File = Year(pd)
    s2File = s2File & Right("0" & Month(pd), 2)
    s2File = s2File & Right("0" & Day(pd), 2)

'~省略~

End Sub

' 祝日判定
Function holiday(d As Date)
    Dim holidays As Variant
    Dim ds As Date
    ds = Year(d) & "-" & Month(d) & "-" & Day(d)
    holidays = Array( _
        CDate("2017-01-01"), _
        CDate("2017-01-02"), _
        CDate("2017-01-09"), _
        CDate("2017-02-11"), _
        CDate("2017-03-20"), _
        CDate("2017-04-29"), _
        CDate("2017-05-03"), _
        CDate("2017-05-04"), _
        CDate("2017-05-05"), _
        CDate("2017-07-17"), _
        CDate("2017-08-11"), _
        CDate("2017-09-18"), _
        CDate("2017-09-23"), _
        CDate("2017-10-09"), _
        CDate("2017-11-03"), _
        CDate("2017-11-23"), _
        CDate("2017-12-23"))
    If UBound(Filter(holidays, ds)) <> -1 Then
        holiday = True
    Else
        holiday = False
    End If
End Function

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/23 09:26

    また日によってComitt処理のファイルが増加する。

    って感じですね
    その場合は日付の昇順です

    キャンセル

  • 2017/05/23 09:31

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

    キャンセル

  • 2017/05/23 09:34

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

    キャンセル

0

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

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

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

AddinBox\(祝日マクロ\-1\)

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る