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

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

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

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

4回答

779閲覧

ファイル振り分けのロジック

hrksh

総合スコア13

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2019/03/26 11:43

###自動でテキストにTODOを書いて残しておきたいなあ
業務中にテキストファイルに今日あったことや備忘録として書き溜めて保存しています。
毎日作るのが面倒なのと、単にずっと書き溜めていくと、後から見るのが大変という理由で、
自動でそれらをさせたいなあと思い、軽い気持ちで始めました。

ところが振り分けをする際のロジックが意外と面倒でした。
自力で導き出したいのですが、
小1時間ほど悩み調べようか迷い、そして停止しました。

考え方のヒント等、教えていただけますか。。。
(別のコードでも大丈夫です。多分。)

###前提
・勤務日は 月曜日から金曜日 とします。この期間を 勤務日週 とします。
・勤務日週ごとにフォルダ分けする。
・勤務日毎 1ファイル 作成する。(タイムスケジューラでログイン時に実行させる。)
・ファイルは作成時、勤務日週ごとのフォルダに振り分けて格納する。
・休日出勤したらその日の分も作られる。(重要)
・土日とかをカウントとかはしたくない。
・数式的な解法でやってみたい。(アホだけど)

WindowsなのでVBSを使いました。なんか手軽だと思いました。

現在の状況

フォルダ内(直でいっぱいはいっている・・・) C:\Users\hoge\Desktop\Note 20190301_hoge.txt ,20190304_hoge.txt ,20190305_hoge.txt ... . . . 20190320_hoge.txt ,20190322_hoge.txt ,20190325_hoge.txt ,20190326_hoge.txt ...

###実現したいこと
以下のようにテキストファイルをファイルを振り分けたい
例えば今月の1日からフォルダ分けしてみる場合、以下の様な、振り分け方になると思います。

1.3月分フォルダを作成(月ごとにわける)

C:\Users\hoge\Desktop\Note\201903

2.3月分フォルダ以下に勤務日週ごとのフォルダを作成し、格納する。

1週目 (金曜日のみなので1ファイル分入るはず) C:\Users\hoge\Desktop\Note\201903\Week1  20190301_hoge.txt 2週目 (5ファイル分入るはず) C:\Users\hoge\Desktop\Note\201903\Week2  20190304_hoge.txt ,20190305_hoge.txt ,20190306_hoge.txt ... 3週目(5ファイル分入るはず) C:\Users\hoge\Desktop\Note\201903\Week3  勤務日分毎日ここにはいる 4週目(4ファイル分入るはず) C:\Users\hoge\Desktop\Note\201903\Week4  今月祝日はもちろんはいらない 5週目(今日分含んで2ファイル) C:\Users\hoge\Desktop\Note\201903\Week5  20190325_hoge.txt ,20190326_hoge.txt

###考えたこと・試したこと
とりあえず、思考停止してしまったコードです・・・

Option Explicit Public Sub main hoge() Dim today Dim wkFolderName '週ごとのフォルダ名 today = Date() 'とりあえず、これができればニッコリして寝れる '振り分け先のフォルダ名がここで取れれば良い ex) Week1, Week2, Week3 ... wkFolderName = getFuriwakeWeekName(today)   Call Msgbox("振り分け先は" & wkFolderName & "です。", vbInformation, "Todo振り分け先の確認") End Sub '引数は今日として分ける先のフォルダ名を判定する Private Function getFuriwakeWeekName(today) 'return any one of Week1, Week2, Week3, Week4, Week5 (Week6) ... Dim firstday '当月初めの日付 Dim weekday '曜日 firstday = DateSerial(Year(Date()), Month(Date()), 1) 'なんか、日曜日は1で始まるインデックスが返る関数があった。 '今月は金曜日(=5)から始まったらしい weekday = weekday(firstday) '月初が土であり、作成した場合、次週はweek2 '月初が日曜日であれば、次週はweek1 '月初がそれ以外であれば、次週はweek2 ' '返ってくるインデックス '日⇒土 '1 2 3 4 5 6 ' '月の始まりが金曜日 '1週目の1日目 'weekday = weekday(firstday) ⇒ 5?(金曜日) '今日が26日 '今日は5週目の2日目 'weekday = weekday(today) ⇒ 3?(火曜日) 'getFuriwakeWeekName = "Week" & CStr(  ) End Function

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

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

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

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

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

y_waiwai

2019/03/26 11:48

なにがわからないのでしょうか 聞きたいことをはっきりさせましょう
hrksh

2019/03/26 11:56

今日の日付はカレンダー上で第何週目か  を判定するロジックがわかりません。よろしくおねがいします。
ttyp03

2019/03/26 12:03

質問本文長々と書いて、聞きたいことはそれだけかい!w 色々と自分の境遇とか困ったことに至る背景とか語りたい気持ちはわかりますが、こういう場では端的に聞きたいことだけを書くほうが回答者としては理解がしやすいですし好感がもてますよ。
hrksh

2019/03/26 12:08

そうですね。次回きをつけます。
guest

回答4

0

一週間は7日なので、日数を7で割れば近い値がでますが、月初めはずれていますので、そこをどう計算するかですね。
とりあえずこんな感じでできると思いますのでお試しください。

VBScript

1' 月初めの曜日を求める 2fw = Weekday(Year(Now()) & "/" & Month(Now()) & "/01") 3' 本日日付を求めて月初めの曜日分ずらす 4d = Day(Now()) + fw - 1 5' 日数を7で割って切り上げた数が答え 6wscript.echo Round(d / 7 + 0.5, 0) & "週目"

投稿2019/03/26 12:36

ttyp03

総合スコア16998

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

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

hrksh

2019/03/26 12:49

ほえ~ なるほど。ありがとうございます。
guest

0

ベストアンサー

第何週かの算出法

・今月の1日は何曜日かを調べる
・そこから、今月のはじめての日曜は何日かを算出
・今日の日付からはじめての日曜の日の差分を取り、7で割れば第何週かわかる

というのでどうでしょう

投稿2019/03/26 12:00

y_waiwai

総合スコア87782

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

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

hrksh

2019/03/26 12:07

ありがとうございます。 こうした算出法はどうしてこうすればできると分かるんですか? こういうやり方を覚えるものなんでしょうか
guest

0

DateDiff 関数 (Visual Basic for Applications) | Microsoft Docs

上記の関数を使って、

vbscript

1Dim firstday 2firstday = DateSerial(Year(Date), Month(Date), 1) 3MsgBox Datediff("ww",firstday,Date)+1 & "週目"

投稿2019/03/26 13:57

編集2019/03/26 14:04
hatena19

総合スコア33740

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

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

hrksh

2019/03/26 14:30

ありがとうございます。 本来ならこうすべきですね。簡潔ですし。 あえて悩む必要も無かったですね〜
guest

0

2方回答を頂いたので、それを元に作りました。
やったあ・・・・・・

VBScript

1Option Explicit 2 3Public Sub hoge() 4 5 Dim today 6 Dim wkFolderName '週ごとのフォルダ名 7 today = Date() 8 'とりあえず、これができてニッコリした 9 '振り分け先のフォルダ名がここで取れれば良い ex) Week1, Week2, Week3 ... 10 wkFolderName = getFuriwakeWeekName(today) 11 wkFolderName = getFuriwakeWeekName2(today) 12 13 msgbox wkFolderName 14 15End Sub 16 17'引数は今日として分ける先のフォルダ名を判定する 18Private Function getFuriwakeWeekName(today) 19 'return any one of Week1, Week2, Week3, Week4, Week5 (Week6) ... 20 Dim firstday '当月初めの日付 21 Dim week '曜日 22 Dim difftoSunday '初めての日曜日までの差分 23 Dim days '日数 24 25 firstday = DateSerial(Year(today), Month(today), 1) 26 '今月は金曜日(=5)から始まった 27 week = weekday(firstday) 28 '日曜日まで何日あるのか調べる 29 difftoSunday = 6 - week + 1 30 '今月の日数を調べる 今月末日 - 今月初日 + 1 31 days = DateSerial(Year(today), Month(today) + 1, -1) - firstday + 1 32 '残りの日数を7で割り、第何週かを算出する 33 if difftosunday = 0 then 34 getFuriwakeWeekName = "Week" & CStr(days \ 7) 35 else 36 getFuriwakeWeekName = "Week" & CStr(days \ 7 + 1) 37 end if 38 39End Function 40 41Private Function getFuriwakeWeekName2(today) 42 'return any one of Week1, Week2, Week3, Week4, Week5 (Week6) ... 43 Dim firstday '当月初めの日付 44 Dim week '曜日 45 Dim slideDay 'ずらした曜日分の日にち 46 47 firstday = DateSerial(Year(today), Month(today), 1) 48 '今月は金曜日(=5)から始まった 49 week = weekday(firstday) 50 '曜日分ずらす 51 slideDay = DateSerial(Year(today), Month(today), Day(today) + week -1 ) 52 ggetFuriwakeWeekName2 = Round(d / 7 + 0.5, 0) & "Week" 53 54End Function 55 56call hoge

投稿2019/03/26 12:59

hrksh

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問