• 締切済み

日付順にテキストを開いて書き込むエクセルマクロ

あるフォルダの中に「abc#1xyz_201308.txt」という形のテキストファイルがあり、 ボタンを押すと、直近1年分のファイルに対して中身のデータをシート3に書き込むような マクロを作りたいのですが、直近1年分のものに対して所定の操作を行うやり方が分かりません 例として、「C:\Users\Owner\Documents」に「abc#1xyz_201308.txt」の形のファイルが 1年以上分ある場合で教えていただけますか? (テキストは日付以外は同じ名前、つまりabc#1xyz_201307.txtやabc#1xyz_201306.txtが存在し それ以外の名前のものはこのフォルダにはありません。またフォルダ内には順番通り入っていませんが シートに書き込むのは古いものから順にしたいです)

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

> 直近1年分のファイル この意味を解っていなかったので、やり直しました。 例えば今なら、201209-201308の一年分のテキストファイルを拾い上げます。 期間を、月単位で前後に調整出来るように書いてます。 例えば   Const fAdjMonth = -1 と変更すると、今なら、201208-201307の一年分、になります。 設計、ガラッと変えました。わりと、教科書的な書き方のように思います。 A列に縦に並べまて出力するように書きましたけど、その後の処理も必要ならば、 恐らく手作業でも出来る内容だと思いますから、マクロの記録でも録って 書き足すようにしてください。 ' ' 標準モジュール専用 Sub Re8257248cj()   Const fFolderPath = "C:\Users\Owner\Documents"  ' 指定フォルダ名   Const fFileNamePattern = "abc#1xyz_000000.txt"  ' ファイル名パターン。年月に相当する部分に"000000"   Const fAdjMonth = 0  ' 期間を月単位で前後に調整する値   Dim sFileName As String  ' 各ファイル名。"年月"に相当する部分だけ順次置換   Dim sTempLine As String  ' テキストデータを各一行ずつ読み込む変数   Dim sMsg As String  ' 見つからないファイルがあった場合の告知用文字列   Dim nPosYYYYMM As Long  ' ファイル名の中で"年月"に相当する桁位置   Dim cnLines As Long  ' 出力する行位置、をカウントアップ   Dim nYear As Long  ' 開始年。1年前の西暦年   Dim nMonth As Long  ' 開始月。当月の月   Dim i As Long  ' ループ用   Dim nFree As Integer  ' 使用可能なファイル番号   ' ' アプリケーションの描画更新停止   Application.ScreenUpdating = False   ' ' シート3を選択。シート名要指定   Sheets("Sheet3").Select   ' ' A列の値を消去   Range("A:A").ClearContents   ' ' ファイル名パターンを(フォルダパスを加えて)フルネームに   sFileName = fFolderPath & "\" & fFileNamePattern   ' ' ファイル名の中で"年月"に相当する桁位置を取得   nPosYYYYMM = InStr(sFileName, "000000")   ' ' 開始年。1年前の西暦年   nYear = Year(Date) - 1   ' ' 開始月。当月の月(調整可)   nMonth = Month(Date) + fAdjMonth   ' ' Open ステートメントで使用可能なファイル番号   nFree = FreeFile   ' ' 開始月(前年同月)から終了月(昨月)までループ   For i = nMonth To nMonth + 11     ' ' ファイル名の中で"年月"に相当する部分を置換     Mid(sFileName, nPosYYYYMM) = Format(DateSerial(nYear, i, 1), "yyyymm")     ' ' ファイルが存在するか確認     If Dir(sFileName) <> "" Then  ' 存在するなら       ' ' ファイルを読み込み用に開く       Open sFileName For Input As #nFree       ' ファイルの最終行を読み終わるまでループ       Do While Not EOF(1)         ' ' 出力する行位置をカウントアップ         cnLines = cnLines + 1         ' ' テキストデータを一行ずつ変数に読み込む         Line Input #nFree, sTempLine         ' ' 読み込んだテキストデータを一行ずつセルに出力         Cells(cnLines, 1) = sTempLine       Loop       ' ' 開いたファイルを閉じる       Close #nFree     Else  ' 存在しないなら       ' ' 見つからないファイルがあった場合の告知用文字列       sMsg = sMsg & vbLf & sFileName     End If   Next i   ' ' アプリケーションの描画更新再開   Application.ScreenUpdating = True   If sMsg <> "" Then MsgBox Mid$(sMsg, 2) & vbLf & vbLf & "↑ 見つかりません。", vbInformation End Sub

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

' ' 標準モジュール専用 Sub Re8257248a()   Const fFolderPath = "C:\Users\Owner\Documents"  ' フォルダ名   Dim v As Variant  ' ループ用(値配列の要素)   Dim oFSO As Object  ' Scripting.FileSystemObject   Dim oFolder As Object  ' Scripting.Folder   Dim oFile As Object  ' Scripting.File   Dim oDtObj As Object  ' MSForms.DataObject   Dim sBuf As String  ' テキストデータを流し込む変数   Dim cn As Long  ' フォルダ内のテキストファイルの数  ' ' FSO(ファイルシステムオブジェクト)   Set oFSO = CreateObject("Scripting.FileSystemObject")  ' New Scripting.FileSystemObject  ' ' FSOで指定フォルダをFolderオブジェクトとして取得   Set oFolder = oFSO.GetFolder(fFolderPath)  ' ' シート3を選択。シート名要指定   Sheets("Sheet3").Select  ' ' A列の値を消去   Columns(1).ClearContents  ' ' 指定フォルダ内のFileオブジェクトすべてをループ   For Each oFile In oFolder.Files    ' ' テキストファイルならば     If oFile.Type = "テキスト ドキュメント" Then      ' ' テキストファイル数をカウントアップ       cn = cn + 1      ' ' A列cn行めのセルに、ファイル名を出力       Cells(cn, 1) = oFile.Name     End If   Next  ' ' ファイル名を出力したセル範囲   With Range("A1:A" & cn)    ' ' 昇順で並び替え     .Sort Key1:=.Cells(1), Order1:=xlAscending, Header:=xlNo    ' ' ファイル名を出力したセル範囲の値配列すべてをループ     For Each v In .Value      ' ' 指定フォルダから、ファイル名に応じたテキスト全文をバッファに流し込む       sBuf = sBuf & vbCrLf & oFolder.Files(CStr(v)).OpenAsTextStream.ReadAll     Next    ' ' セル範囲、消去     .ClearContents   End With  ' ' クリップボードに文字列を渡すためのデータオブジェクト   Set oDtObj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  ' New MSForms.DataObject  ' ' DataObject経由でクリップボードへテキスト出力   With oDtObj     .SetText Mid$(sBuf, 3)     .PutInClipboard   End With  ' ' クリップボードからセル範囲へ貼付け   Cells(1).PasteSpecial   Set oFSO = Nothing:  Set oFolder = Nothing:  Set oDtObj = Nothing End Sub

関連するQ&A

  • エクセルマクロで同じフォルダ内のテキストファイルをメモ帳で開く方法

    「マクロを記述したエクセルファイルと同じフォルダにある、 特定のファイル abc.txt を、メモ帳で開く」ということをしたいのですが、マクロの記述をご教授下さい。 フォルダ名を固定すると、 Shell "notepad C:\--\abc.txt", vbNormalFocus という形でできたのですが、 フォルダの名前は、固定ではなく、変わります。 ですので、フォルダ名が含まれると都合が悪くなってしまうんです。 エクセル2000、WINDOWS XP を利用しています。 どうぞよろしくお願いいたします。

  • コマンド(COPY)

    コマンドでCOPY文がわかりません。 やりたい事は、 ABCDのフォルダ内のファイルを名前を変更して別のフォルダにコピーをしたいのです。 例えば、 ABCDのフォルダに「2011年11月17日14時38分30秒.txt」があるとします。 これをXYZのフォルダに「ABC_2011年11月17日14時38分30秒.txt」と名前を変更してコピーをしたい。 ファイルですが、見てわかると思いますが年月日時分秒と言うファイル名です。 コピーする時はファイル名が不明と思って下さい。 「COPY C:\ABCD\*.* C:\XYZ\ABC_*.*」で行うと XYZには「ABC_年11月17日14時38分30秒.txt」と言うように頭(左側)のファイル名が上書きされてしまいます。 ファイルを移動したいので、欲を言うとCOPYでなくMOVE文がいいのですが。 誰かわかる方教えて下さい。 宜しくお願い致します。

  • Excelマクロ テキスト貼り付け

    テキストファイル(*.txt)を開き、A1に貼り付けるマクロを教えてください。 B列には計算式があるため、A列にテキストの内容を貼り付けたいです。 また、テキストのファイル名はランダムなため、 フォルダを開いて、テキストを開きたいのですが教えてください。

  • テキストボックスの中身をリセット(クリア)したい

    ファイル(*.txtのみ)を読み込んで、テキストボックスに中身を表示させておりますが、2回以上ファイルを読み込んだ時、テキストボックスに書かれた内容を消した上で、読み込んだファイルの中身を表示させるように変更できないでしょうか。また、テキストボックスに書かれた内容をクリアするボタンの作り方も知りたいです。 例、1.ABCと書かれたテキストの読み込み→ABC   とテキストボックスに表示される    2.XYZと書かれたテキストの読み込み→ABC XYZ とテキストボックスに表示される これを2.を読み込んだ時、ABCを表示せずにXYZと表示したい コードの一部 Private Sub Command1_Click() CommonDialog1.Filter = "テキスト(*.txt)|*.txt|すべて(*.*)|*.*" CommonDialog1.FilterIndex = 1 CommonDialog1.Flags = cdlONFileMustExist '既存ファイルのみ読み込み CommonDialog1.CancelError = True On Error Resume Next CommonDialog1.ShowOpen If (Err = 0) Then FileRead CommonDialog1.FileName End If On Error GoTo 0 End Sub

  • エクセル)ファイルを検索し、セルを参照

    Aフォルダ内に入っている複数のファイルがあります。 abc01xyz.xls abc02xyz.xls abc03xyz.xls それぞれのブックのシートX、セルA1にはファイル名にある数字と同じ数字が入っています。 ■質問 abc02xyz.xlsのセルB2に、abc(abc02xyz.xlsのシートX、セルA1の値-1)xyz.xls のシートY、セルB2の値をコピーしたいのですが、どんな関数を使えばよいのでしょうか、いろいろ本をめくったり、インターネットで調べたのですが、なかなか参考になるケースがなくて困っておりまして、どなたか詳しい方、ご指南いただけませんでしょうか・・・。 INDIRECT関数を使うのでしょうか

  • エクセルのマクロでテキストファイルを生成するには?

    いつもお世話になっております。 マクロで エクセルのSheet1上のA1:A5のデータをコピーして 『吐き出し.txt』というテキストファイルを生成したいのです。 どのようなマクロを書けばよいかご教示ください。 通常の「txt形式で保存」ですと、 データ内に「,」があるため、 テキストファイルだとデータの両端に「"」がついてしまうため 不具合が発生するのです。 なんとかなりませんでしょうか。 よろしくお願いいたします。

  • EXCELのVBマクロでテキストデータ印刷

    EXCELで編集出力したテキストデータをプリンタに印刷したいのですがどのようにプログラミングしたらいいでしょうか? 例えば、ABC.TXTというファイルをLPT1に接続しているプリンタに印刷したい場合、 DOSコマンドからだと print /d:LPT1 ABC.TXT で印刷されますが、これと同じ作業をEXCELから行いたいです。 よろしくお願いします。

  • Excel VBAでの固定長のテキストファイル読み込み

    こんにちは。 会社にてEXCELをちょろっとかじっていると言う理由から、あまり触ったことのないVBAを使って固定長のテキストファイルを読み込むプログラムを作るように言われてしまって困っています。 利用している固定長のテキストファイル中の各行の桁数は同一でなく、行によってまちまち。しかし、各行の始めの3ケタはヘッダになっています。 例) ABCTTTTTTTTTTTTTTTTKKKKKOOOOOOPPPPPPPPWWWWWWWWWWWWWWWWWWWWWWWSS XYZLLLLL <ABCとXYZがヘッダ。同じ文字が固定長で決まったあるデータ項目と考えて下さい> もちろん、1ファイルにはもっとたくさんの行がずらずら並んでおります。 中身自体は、ある伝票の内容なのですが、1ファイル中には複数の伝票内容(ヘッダABC~XYZで1伝票)が記されております。 なので、ヘッダで言うとABC,DEF,GHI...XYZとなってまたABC~が続く。 しかも、ある伝票では途中存在しないヘッダがあったり、同じヘッダが何回も繰り返されたりするものもあります。 (ABC,DEF,DEF,DEF,GHI..やABC,GHI,JKL..など) これをどうやってEXCELの各セルに貼り付けるかがどう頑張っても分かりません。どうすればよいのでしょうか?

  • diffコマンドにてテキスト出力

    こんばんは。教えてください! 以下のような2つのファイルがあるとします。 ・aaa.txt abc111 abc222 abc333 ・bbb.txt abc333 abc444 これを比較して、比較結果をテキスト出力したいです。 テキスト出力したい比較結果は (1)重複しているもの全てテキスト出力 (2)aaa.txtのみにあるものをテキスト出力 (3)bbb.txtのみにあるものをテキスト出力 また、(1)~(3)は別々のファイルに出力したいです。 diffコマンドで、 diff a.txt b.txt >> c.txt とすると、 1つのテキストファイル(c.txt)に (1)~(3)すべてが書かれてしまいます。 環境は、windows XPにてCygwinを使用しています。 diffコマンドでなくても構いません。 宜しくお願いします。

  • <OBJECT>に入れたテキストが表示されない

    こんにちは。 HTMLファイルを作成しているのですが、 <OBJECT>~</OBJECT>に埋め込んだテキストファイルが 表示されません。 フレーム【左|右】を使用していて、左にあるリンクをクリックすると、 右に abc.html が表示されてその中にxyz.txtを<OBJECT>タグで 埋め込んでいるという設定です。 ところが、何度クリックしても右側にはフォームの様な物が 表示されるだけで文面が表示されないのです。 (ただ、ソースからは文面が確認できます。) ちなみに、左のリンクを「新しいウィンドウで開く」で開くと、 一瞬abc.htmlが開くのですがすぐxyz.txtにリダイレクト(?)されてしまいます。 なぜ文面が表示されないのでしょう? どなたかご教示願います。 情報が不足していればご指摘ください。 よろしくお願いいたします。

    • ベストアンサー
    • HTML

専門家に質問してみよう