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

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

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

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

Q&A

4回答

6869閲覧

テキストデータをVBAで週ごとに分けたい

asadafaga

総合スコア10

VBA

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

0グッド

1クリップ

投稿2016/01/19 16:22

2015/12/01,* cbdl,345
2015/12/02,Ubcmf Gspn DTW,2
2015/12/03,* gspou,375



こんなテキストデータが何行もありまして、それを週ごとにわけたいのですがどうしたらよいでしょうか

週ごとっていうのは上の例だと2015年12月1日は火曜なので
それから土曜の2015年12月5日までで一括りって感じでやりたいのですが、どうしたらいいんですかねぇ・・・

あと、データ内に日曜日は入ってないです。

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

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

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

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

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

ToruHokari

2016/02/21 21:31 編集

以下の点を確認したいです。 ■確認したいこと 1.日付は、存在する日付が必ず設定されていると考えてよろしいでしょうか。 2.「週ごと」の単位は、月曜日~日曜日でしょうか(日曜日はないとのことですが)  また祝日の考慮は特に必要ありませんでしょうか。 3.「わけたい」とは、テキストデータを分けたい(別テキストに出力する)  ということでしょうか。それともシートに吐き出したいということでしょうか。 4.「何行も」とはざっくりどのぐらいで考えたらよいでしょうか。 ■確認したい理由(それぞれの番号は「確認したいこと」の番号とリンクします) 1.ありえない日付が入るのであれば、その場合の対処策が必要です 2.「週ごと」の定義が一緒であれば、機械的に集計が可能ですが、   週ごとの定義が変わるのであれば、別途マスタ情報などが必要と考えます 3.出力先によって、書くコードが変わります 4.行数が1,000件程度であれば、あまり考慮する必要はありませんが、   1,000,000件もあるのであれば、例えばシートに貼り付けて処理をすると言った   やり方は、Excelのバージョンによっては選択肢からはずれます。   正確な数字は必要ありませんが、ざっくりとして規模感が分かると助かります。
guest

回答4

0

VBAを使わずとも

  • シートに読み込む
  • 列を追加する
  • WEEKNUM関数を使う

で簡単にその日が何週目なのか取得できます
Excelのバージョンが上がることに機能が増えていますので、お使いのバージョンのヘルプを確認してください

WEEKNUM 関数

説明
特定の日付が第何週目に当たるかを返します。 たとえば、1 月 1 日を含む週がその年の最初の週で、第 1 週になります。
この関数で使用されるシステムには、次の 2 種類があります。

  • システム 1 1 月 1 日を含む週がその年の最初の週であり、第 1 週です。
  • システム 2 その年の最初の木曜日を含む週がその年の最初の週であり、第 1 週です。

このシステムは、ヨーロッパ式週番号システムと呼ばれる、ISO 8601 に規定されている方式です。

書式

WEEKNUM(シリアル値,[週の基準])
WEEKNUM 関数の書式には、次の引数があります。

  • シリアル値:必ず指定します。 日付を指定します。 日付は、DATE 関数を使って入力するか、他の数式または他の関数の結果として指定します。 たとえば、2008 年 5 月 23 日を入力する場合は、DATE(2008,5,23) を使用します。 日付を文字列として入力した場合、エラーが発生することがあります。
  • 週の基準:省略可能です。 週の始まりを何曜日とするかを数値で指定します。 既定値は 1 です。

投稿2016/01/19 22:14

編集2016/01/19 22:18
dojikko

総合スコア3939

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

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

0

週の区切りを日曜にするか月曜日にするかわかりませんが
Weekday関数を使うと曜日が取れるので、
この『曜日』を見て処理するというのはどうでしょうか。

t = "2015/12/01,* cbdl,345 "
If Weekday(Split(t, ",")(0)) = "1" Then
MsgBox ("日曜日")
End If

参考:ページ
http://www.ab.auone-net.jp/~t.i/chapter8-4.html

投稿2016/01/19 16:30

Qoo

総合スコア1249

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

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

0

ざっくりとしたロジックが知りたいとお見受けしました。
以下のようなロジックになるかと思います。

■前提
・年をまたぐことがある
・「週ごと」は月曜日~日曜日
・別々のファイルに出力(ファイル名で何年の何週目が分かるようにする)

1.1行目の日付を取得
2.年のみを取得(年跨ぎを考慮して)
3.WorksheetFunction.Weeknumを使って、
その年の何週目かを判断
4.年と、3.で取得した何週目の組み合わせで出力テキストを決定
「年と、3.で取得した何週目の組み合わせ」のテキスト名がすでにあれば追記。
なければ、ファイルを作成してから追記

※WorksheetFunction.Weeknumは、引数で渡された日付の年の何週目かは分かりますが、
年の判別は返してくれません。
例:指定した日付 → 戻り値
2001/01/01 → 1
2016/01/01 → 1
※WorksheetFunction.Weeknumのなかで、週の開始をいつにするかの定義は指定ができそうです。

投稿2016/02/21 21:41

ToruHokari

総合スコア33

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

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

0

希望を満たす処理ができるだけなら下記のソースで動かせると思います。
ExcelのVB Editorに張り付けるなどしてください。

これを誰でも使えるマクロにしたい場合、フォルダ選択のコモンダイアログを使用したり、
区切りの曜日を選択可能にしたりなど、まだまだ改善可能です。

ご参考にどうぞ

lang

1Option Explicit 2 3Sub Main() 4 5 Dim intDelimiter_ofWeekday As VbDayOfWeek ' Weekday()の結果と比較 6 intDelimiter_ofWeekday = vbSunday ' 区切りの曜日指定 7 8 Dim strFolderPath As String 9 strFolderPath = "C:\folder\" ' 取得元フォルダ サンプル用 要変更 10 Dim strWriteFolderPath As String 11 strWriteFolderPath = "C:\folder2\" ' 書出先フォルダ サンプル用 要変更 12 13 Dim oFile As File 14 Dim oStream As TextStream 15 Dim strLine As String 16 17 Dim strColumns() As String 18 Dim dateTmp As Date 19 Dim dowWeekDay As VbDayOfWeek 20 Dim lastDay As Date 21 22 ' 選択フォルダを読み込む 23 Dim oFSO As FileSystemObject ' 要)参照設定 [Microsoft Scripting Runtime] 24 Set oFSO = New FileSystemObject 25 26 Dim oFolder As Folder 27 Set oFolder = oFSO.GetFolder(strFolderPath) 28 29 30 ' 書き出し用ファイル準備 31 Dim strFileName As String 32 strFileName = "start.csv" ' 最初の書き出しファイルのファイル名 33 34 Dim oWriteStream As TextStream 35 Set oWriteStream = oFSO.CreateTextFile(strWriteFolderPath & strFileName) 36 37 ' フォルダ内のファイルを取得する(拡張子限定) 38 For Each oFile In oFolder.Files 39 40 ' 拡張子確認 41 If UCase(Right(oFile.Name, 4)) = ".CSV" Then 42 ' CSVファイルの場合 43 44 ' ファイルを開く 45 Set oStream = oFile.OpenAsTextStream(ForReading) 46 47 48 ' ファイルを終端まで読み込む(一行毎) 49 While oStream.AtEndOfStream = False 50 strLine = oStream.ReadLine 51 52 ' 各行をカンマ区切り→配列格納 53 strColumns() = Split(strLine, ",") 54 55 ' 区切りの行までデータを蓄積 56 On Error Resume Next ' 行データの1項目目が日付じゃない場合エラーとなるのを検知 57 dateTmp = CDate(strColumns(0)) 58 59 ' 読み取りデータが日付かどうか 60 If Err.Number = 0 Then 61 62 ' 日付の場合 63 dowWeekDay = Weekday(dateTmp) 64 65 ' 日付項目の曜日を確認 66 If (dowWeekDay = intDelimiter_ofWeekday And dateTmp <> lastDay) Or _ 67 (lastDay < intDelimiter_ofWeekday And intDelimiter_ofWeekday < dowWeekDay) Then 68 69 ' 週の区切りの曜日の場合 And 前行の曜日と異なる場合 70 ' または前データの日付と現データの日付の間に区切り曜日が挟まれている場合 71 72 ' ファイル出力(保存場所指定済み?) 73 ' 前週までのデータをクローズ 74 oWriteStream.Close 75 ' 次の週のデータを準備 76 strFileName = Format(dateTmp, "yyyymmdd") & ".csv" 77 Set oWriteStream = oFSO.CreateTextFile(strWriteFolderPath & strFileName) 78 79 End If 80 81 ' 蓄積データを書き出し 82 oWriteStream.WriteLine strLine 83 84 ' 比較用に前行データとして保持 85 lastDay = dateTmp 86 87 Else 88 ' 日付じゃなかった場合 89 ' データ蓄積 or データ無視(書き出さない) 90 If True Then 91 ' 書き出す場合 92 oWriteStream.WriteLine strLine 93 Else 94 ' 書き出さない場合 95 ' 処理なし 96 End If 97 End If 98 Wend 99 100 ' ファイルクローズ 101 oStream.Close 102 oWriteStream.Close 103 104 End If 105 106 Next 107 108 ' 終了処理 109 MsgBox "終了しました", vbOKOnly, "ファイル週単位分割" 110 111End Sub 112

投稿2016/02/19 11:27

Aeona

総合スコア396

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問