- ベストアンサー
エクセル2003 VBAでフォルダ内にファイル格納
- エクセル2003を使用してVBAでフォルダ内にファイルを格納する方法を教えてください。
- すでに作成してある特定のフォルダにテキストファイルを格納することは可能でしょうか。
- フォルダには複数のファイルを格納する予定ですが、ファイル名はすべて「index.html」と統一します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
フォルダを変化させるには > デスクトップ>zenkoku>kanagawa>kanagawa01>kanagawa01A これの「どこが」「どのセルに」対応して「変化するか」考えてください。 デスクトップ>zenkoku>[列D]>[列E]>[列F]でしょ? これを組み込めばよい。 20社まとめる件は、あらかじめワークシートをソートしておけば良い。 ※でも「20社にまとめる」は[列D]都道府県も考慮する必要があるのかな? ※これ以上の後出しは知りませんよ Sub HTMLファイル出力改() ' http://okwave.jp/qa/q8787726.htmlの質問本文から改造 ' ※PC引っ張り出してキーボード入力しましたが、EXCELが無いので無試験 Dim myPath As String Dim i As Long Dim strPath as string 'HTML出力ファイルのパス dim nFile as long 'ファイルハンドル dim nCount as long '20社判定 ’環境変数からデスクトップフォルダへのパスを定義する myPath = Environ("USERPROFILE") & "\Desktop\Zenkoku\" ’20社単位で処理できるよう、ソートする Range("A:F").Sort Key1:=Range("E2"), Key2:=Range("F2"), _ Header:=xlYes, MatchCase:=False, Orientation:=xlTopToBottom nCount = 0 For i = 2 To Range("F1").End(xlDown).Row ' ブレーク判定1:前行と現在行を比較する ' 処理が必要なのは「初回」または「20社単位名が変わる」 ' ※初回は見出し行≠データ1行目であること ' 20社の場合 If Range("E" & i - 1).Text <> Range("E" & i ).Text Then ' 1社の場合 ''''If Range("E" & i - 1).Text & "|" & Range("F" & i - 1).Text <> Range("E" & i ) & "|" & Range("F" & i ).Text Then 'ファイルハンドルの空きを取得 nFile = freefile() '-出力パスの作成--ここから--------------------------------- ’20社の場合 strPath = myPath & Range("E" & i).Text & "\" & Range("F" & i).Text ’ 1社の場合 ''''strPath = myPath & Range("E" & i).Text & "\" & Range("F" & i).Text "\" & Range("G" & i).Text '-出力パスの作成--ここまで--------------------------------- ' 出力ファイルを開く Open strPath & "\index.html" For Output As #nFile '-20社共通部分1出力--ここから--------------------------------- Print #nFile, "<!DOCTYPE html>" & vbNewLine _ & "<html lang=""en"">" & vbNewLine _ & "<body>" & vbNewLine _ & "<div class=""span3"" id=""sidebar"">" & vbNewLine '-20社共通部分1出力--ここまで--------------------------------- nCount = 0 End If '-20社個別部分出力--ここから--------------------------------- Print #nFile, vbNewLine _ & "<div class=""widget"">" & vbNewLine _ & "<h4 class=""widgetTitle"">" & Range("A" & i) & "</h4>" & vbNewLine _ & "<ul><li>" & Range("B" & i) & "</li>" & vbNewLine _ & "<li>" & Range("F" & i) & "</li></ul></div>" & vbNewLine '-20社個別部分出力--ここまで--------------------------------- ’20社単位の出力件数をインクリメント nCount = nCount + 1 ' ブレーク判定2:現在行と次行を比較する ' 処理が必要なのは「次行は20社単位名が変わる」または「先ほどの出力が20社目」 ' ※データ最終行の次行は空白等であること ' 20社の場合 If Range("E" & i).Text <> Range("E" & i - 1).Text or nCount = 20 Then ’ 1社の場合 ''''If Range("E" & i).Text & "|" & Range("F" & i).Text <> Range("E" & i + 1) & "|" & Range("F" & i + 1).Text Then '-20社共通部分2出力--ここから--------------------------------- Print #nFile, "</div>" & vbNewLine & "</body>" & vbNewLine & "</html>" ' 出力ファイルを閉じる Close #nFile nCount = 0 '-20社共通部分2出力--ここまで--------------------------------- End If Next i End Sub
その他の回答 (4)
- bin-chan
- ベストアンサー率33% (1403/4213)
#3を再び訂正 共通部分の前半出力判定条件に不都合あり ' ブレーク判定1:前行と現在行を比較する ' 処理が必要なのは「初回」または「20社単位名が変わる」 ' つまりカウンタが0の時、なので条件を追加。 ' ※初回は見出し行≠データ1行目であること ' 20社の場合 If nCount = 0 or Range("E" & i - 1).Text <> Range("E" & i ).Text Then ' 1社の場合 ''''If nCount = 0 or Range("E" & i - 1).Text & "|" & Range("F" & i - 1).Text <> Range("E" & i ) & "|" & Range("F" & i ).Text Then
- bin-chan
- ベストアンサー率33% (1403/4213)
#3の訂正 '-20社個別部分出力--ここまで--------------------------------- の直前は電話番号なので Range(”F” & i) ではなくて、Range(”C” & i)が正しい
- bin-chan
- ベストアンサー率33% (1403/4213)
過去の質問から察するに 「例示の表データからHTMLファイルを生成し、特定のフォルダヘ格納したい。 HTMLのサンプルは、行9を変換した場合」 が抜けてますね 以前の回答で、データ行を総なめするループがありましたよね。 あれを利用して ・HTMLを格納するフォルダとファイル名を取得し、SEQファイルとしてOPEN ・HTMLに埋め込みたいデータをセル参照に置き換えて出力(Print) ・”を出力するときは””と2回重ねる必要あり OPEN~CLOSEを20社/1社にするのは、ループを分けて 2回の儿ープにしたほうが簡単。 Forループの添字iを、2から始めずに1からにして、セル参照のところで +1しておけば、そのままカウンタでしたね
- lupin-333333
- ベストアンサー率31% (294/933)
やりたい事が、いまいち不明です。 なぜHTML文のファイルの中身が必要なのか? 何せ、「エクセル2003 VBAでフォルダ内にファイル格納」となっている、 この2つが、つながらない。VBA文の中にHTMLを埋め込む??????? ファイル移動なら、BATでもできるし、VBS、JSでも可能? 何したいんですかね?
お礼
回答ありがとうございます。 >VBA文の中にHTMLを埋め込む??????? はい。埋め込みたいたのです。
お礼
回答ありがとうございます。 例示の表データからHTMLファイルを生成し、特定のフォルダヘ格納したい。 HTMLのサンプルは、画像の行9を変換した場合 そのとおりです。 大まかな流れを記載いただいているのですが、知識がほとんどありません。 SEQファイルとしてOPEN・・・・ OPEN~CLOSEを20社/1社にするのは、ループを分けて・・・ Forループの添字iを、2から始めずに1からにして・・・ お手上げ状態です。ネットで調べてやってみようとは思っているのですが。 あまり自信がありません。