住所録を分類(大中小の3つ)して、それぞれの名前でファイルを作成しています。
旧)中分類のファイル名で「chu」フォルダ内にHTMLファイルを作成
小分類のファイル名で「sho」フォルダ内にHTMLファイルを作成
これを以下のように改変したいと思っております。
新)大分類の名前のフォルダを作成して、
そのフォルダの中に該当する分だけの「中分類のファイル」を作成
同じフォルダの中に該当する分だけの「小分類のファイル」を作成
当方まったくの初心者なので、手も足も出ませんでした。
どうかご教授よろしくお願いいたします。
Sub 中分類HTMLソース()
Dim fso As Object 'ファイルシステムオブジェクト
Dim strPath As String '削除対象ファイル
Set fso = CreateObject("Scripting.FileSystemObject")
strPath = Environ("USERPROFILE") & "\Desktop\chu\*.*"
fso.DeleteFile strPath, True
Set fso = Nothing
'ファイルの削除(読み取り専用の場合も削除)
Dim myPath As String
Dim i As Long
myPath = Environ("USERPROFILE") & "\Desktop\chu\"
Range("A:I").Sort Key1:=Range("H2"), Header:=xlYes, MatchCase:=False, _
Orientation:=xlTopToBottom
For i = 2 To Range("H1").End(xlDown).Row
If Range("H" & i).Text <> Range("H" & i - 1).Text Then
Open myPath & Range("H" & i).Text & ".html" For Output As #1
Print #1, "<!DOCTYPE html>" & vbNewLine _
& "<html lang=""en"">" & vbNewLine _
& "<body>" & vbNewLine _
& "<div class=""span3"" id=""sidebar"">" & vbNewLine
End If
Print #1, "<div class=""widget"">" & vbNewLine _
& "<h4 class=""widgetTitle"">" & Range("A" & i).Text & "</h4>" & vbNewLine _
& "<ul><li>" & Range("B" & i).Text & "</li>" & vbNewLine _
& "<li><a href=""/sho/" & Range("I" & i).Text & ".html"">連絡先・地図はこちら</a></li></ul></div>" & vbNewLine
If Range("H" & i).Text <> Range("H" & i + 1).Text Then
Print #1, "</div>" & vbNewLine & "</body>" & vbNewLine & "</html>"
Close #1
End If
Next
End Sub
Sub 小分類HTMLソース()
Dim fso As Object 'ファイルシステムオブジェクト
Dim strPath As String '削除対象ファイル
Set fso = CreateObject("Scripting.FileSystemObject")
strPath = Environ("USERPROFILE") & "\Desktop\sho\*.*"
fso.DeleteFile strPath, True
Set fso = Nothing
'ファイルの削除(読み取り専用の場合も削除)
Dim myPath As String
Dim i As Long
myPath = Environ("USERPROFILE") & "\Desktop\sho\"
Range("A:I").Sort Key1:=Range("I2"), Header:=xlYes, MatchCase:=False, _
Orientation:=xlTopToBottom
For i = 2 To Range("I1").End(xlDown).Row
If Range("I" & i).Text <> Range("I" & i - 1).Text Then
Open myPath & Range("I" & i).Text & ".html" For Output As #1
Print #1, "<!DOCTYPE html>" & vbNewLine _
& "<html lang=""en"">" & vbNewLine _
& "<body>" & vbNewLine _
& "<div class=""span3"" id=""sidebar"">" & vbNewLine
End If
Print #1, "<div class=""widget"">" & vbNewLine _
& "<h4 class=""widgetTitle"">" & Range("A" & i).Text & "</h4>" & vbNewLine _
& "<ul><li>" & Range("B" & i).Text & "</li>" & vbNewLine _
& "<li>" & Range("C" & i).Text & "</li>" & vbNewLine _
& "<li>" & Range("D" & i).Text & "</li>" & vbNewLine _
& "<li>" & Range("E" & i).Text & "</li></ul></div>" & vbNewLine
If Range("I" & i).Text <> Range("I" & i + 1).Text Then
Print #1, "</div>" & vbNewLine & "</body>" & vbNewLine & "</html>"
Close #1
End If
Next
End Sub
No.3ベストアンサー
- 回答日時:
'ADOのレコードセットを使用
Sub testMain()
Dim myCon As New ADODB.Connection
Dim FileName As String
Dim rs1 As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim rs3 As New ADODB.Recordset
Dim conStr As String
Dim strSQL1 As String
Dim strSQL2 As String
Dim strSQL3 As String
Dim dic1 As Object
Dim dic2 As Object
Dim buf1 As Variant
Dim buf2 As Variant
Dim i As Long
Dim j As Long
Dim fso As Object
Dim strPath As String
Set dic1 = CreateObject("Scripting.Dictionary")
Set dic2 = CreateObject("Scripting.Dictionary")
strSQL1 = "SELECT 大分類 FROM [Sheet1$] GROUP BY 大分類"
strSQL2 = "SELECT * FROM [Sheet1$]"
strSQL3 = "SELECT * FROM [Sheet1$]"
'カレントフォルダのパス
strPath = ThisWorkbook.Path
'接続先のExcelファイル(質問の場合は現在のファイル)
FileName = ThisWorkbook.FullName
conStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Extended Properties=Excel 8.0;" & _
"Data Source=" & FileName
'接続
myCon.Open conStr
'レコードセットを開く
rs1.Open strSQL1, myCon, adOpenStatic, adLockReadOnly
rs2.Open strSQL2, myCon, adOpenStatic, adLockReadOnly
rs3.Open strSQL2, myCon, adOpenStatic, adLockReadOnly
If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
If Not IsNull(rs1!大分類) Then
'フォルダ作成
Call cmdMkDir(rs1!大分類)
'中分類の取得
If rs2.RecordCount > 0 Then
rs2.MoveFirst
Do Until rs2.EOF
'大分類と同じ分類の中分類を検索
If rs2!大分類 = rs1!大分類 Then
If Not IsNull(rs2!中分類) Then
buf1 = rs2!中分類
If Not dic1.exists(buf1) Then
'検索済みの中分類をDictionaryに格納
dic1.Add buf1, buf1
'中分類ファイルの作成
Call cmdMakeChuFile(strPath & "\" & rs1!大分類, buf1)
'小分類の取得
rs3.MoveFirst
Do Until rs3.EOF
'大分類および中分類が同じ小分離の検索
If rs2!大分類 = rs3!大分類 And buf1 = rs3!中分類 Then
If Not IsNull(rs3!小分類) Then
buf2 = rs3!小分類
If Not dic2.exists(buf2) Then
'検索済みの小分類をDictionaryに格納
dic2.Add buf2, buf2
'小分類ファイルの作成
Call cmdMakeShoFile(strPath & "\" & rs1!大分類, buf2)
End If
End If
End If
'変数とDictionaryの初期化
buf2 = ""
dic2.RemoveAll
'次のレコードに移動
rs3.MoveNext
Loop
End If
End If
End If
'次のレコードに移動
rs2.MoveNext
Loop
End If
'変数とDictionaryの初期化
buf1 = ""
dic1.RemoveAll
End If
'次のレコードに移動
rs1.MoveNext
Loop
End If
'後始末 (オブジェクトの破棄が主)
rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
rs3.Close: Set rs3 = Nothing
myCon.Close: Set myCon = Nothing
Set dic1 = Nothing
Set dic2 = Nothing
End Sub
Sub cmdMkDir(ByVal strDir As String)
Dim obj As Object
Dim strPath As String
Dim strFolder As String
Set obj = CreateObject("Scripting.FileSystemObject")
strPath = ThisWorkbook.Path
strFolder = obj.BuildPath(strPath, strDir)
obj.CreateFolder strFolder
Set obj = Nothing
End Sub
Sub cmdMakeChuFile(ByVal strPath As String, ByVal strFileName As String)
Dim strFile As String
strFile = strPath & "\" & strFileName & ".html"
Open strFile For Output As #1
Print #1, "<html>"
Print #1, "中分類ファイル" & "-------" & strPath & "-------" & strFileName
Print #1, "</html>"
Close #1
End Sub
Sub cmdMakeShoFile(ByVal strPath As String, ByVal strFileName As String)
Dim strFile As String
strFile = strPath & "\" & strFileName & ".html"
Open strFile For Output As #1
Print #1, "<html>"
Print #1, "小分類ファイル" & "-------" & strPath & "-------" & strFileName
Print #1, "</html>"
Close #1
End Sub
No.2
- 回答日時:
>新しくはどのような名前のファイルと中身になるのか
の、中身が補足になかったので、単にフォルダと
空のファイルという感じで、回答します。
コードが長いので、説明とコードを分けて
掲載します。
四つのプロシージャを使っています。
testMain、cmdMkDir、cmdMakeChuFile、cmdMakeShoFile
です。
testMainを実行します。一つにすると長くなるのと、
cmdMakeChuFile、cmdMakeShoFile
は、実際にhtmlファイルを作成するプロシージャ
ですので、分離しておいたほうが編集がしやすく
なるのでこのようにしています。
cmdMkDir
は、フォルダ作成のプロシージャで、ここでは
大分類のフォルダを作成するために使用します。
各プロシージャの説明、特にtestMainについては
長くなるので、コードにコメントを入れています。
[説明] testMainについて。
testMainはADOを使用していますので、コード表でADOに
チェックが入っているか確認してください。参照設定で、
Microsoft ActiveX Data Objects xx Library
となっています。xxはバージョンによってちがいますが、
2.1のような数字です。
testMainは、ADOとDictionaryを使ってデータをSheetから抜き出して
います。つまり、Sheetのデータの集まりをデータベースの
テーブルに見立ててデータの検索、抽出をしています。
コードはほとんどデータベースの操作をVBAでしているので、
一般的なExcelのコードとは違和感があるかもしれません。
本来ならばDictionaryは使わなくても済むのですが、
ExcelのバージョンやOSなどの使用環境によって使えない
機能があるので、あえてDictionaryを使います。
[説明] cmdMakeChuFile、cmdMakeShoFile について。
この二つは、testMainで検索して抽出した該当するフォルダの
場所とファイル名(この場合は、該当する中分類名)を
受け取って、必要なhtmlファイルを作成するものです。
中分類と小分類のファイルの内容が同じならば、一つ
でもいいのですが、一応わけておきました。
なお、各htmlに表示する内容が不明なので、パスと
ファイル名を表示しておきました。
SheetからのデータはADOを使って能率よく取り出せるのですが、
どのようなデータを表示するのかがわかれば、と思います。
そのあたりはどうでしょう。
[説明] cmdMkDir について。
cmdMkDirはtestMainで名寄せをした大分類の各データを
受け取って大分類のフォルダを作成しています。
必要ならば、中分類のフォルダも各大分類のフォルダ
に作成することもこのプロシージャを使用すれば
できます。
[説明] testMainの処理の流れ
"SELECT 大分類 FROM [Sheet1$] GROUP BY 大分類"
というSQL文で名寄せした大分類をもとに、フォルダを
作成し、
"SELECT * FROM [Sheet1$]"
というSQL文で取得したSheetのデータを検索し、
同じ大分類をもつ中分類を抽出し、中分類ファイル
を作成し、同じ大分類、中分類をもつ小分類を
"SELECT * FROM [Sheet1$]"
というSQL文で取得したSheetのデータを検索し
小分類ファイルを作成します。
これが、処理の流れの概要です。
No.1
- 回答日時:
会社名 住所 大分類 中分類 小分類
A病院 北海道札幌市 hokkaido hokkaido1 hokkaido1A
B大学病院 北海道旭川市 hokkaido hokkaido2 hokkaido2B
C大学病院 東京都文京区 tokyo tokyo1 tokyo1A
D市立病院 東京都清瀬市 tokyo tokyo2 tokyo2A
E道立病院 北海道函館市 hokkaido hokkaido3 hokkaido3C
F大学病院 東京都目黒区 tokyo tokyo3 tokyo3C
質問より少しフィールドを省略していますが、
たとえば上記のようなデータがシートにあるとして、
具体的には、どのようなデータが入ったファイルを
作成しようとしているのでしょうか?
>新)大分類の名前のフォルダを作成して、
> そのフォルダの中に該当する分だけの「中分類のファイル」を作成
> 同じフォルダの中に該当する分だけの「小分類のファイル」を作成
大分類のフォルダ以外のファイルの中身が分かりづらいのですが。
VBAの中分類HTMLソース()では、
Sapporo.html Asahikawa.html Tokyo.html Kiyose.html
というファイルが出来て、会社名、住所などがそれぞれに列記されていましたが、
新しくはどのような名前のファイルと中身になるのかが分かりづらいので、
そのあたりを差し支えない程度に詳しく。
たとえば、地図サイトの住所検索のようなものなのか、そのあたりも含めて。
ご回答ありがとうございます。説明不足で申し訳ございません。
記載いただいた例のデータの場合
hokkaidoのフォルダを作成してその中に
hokkaido01.html
hokkaido02.html
hokkaido03.html
hokkaido1A.html
hokkaido2B.html
hokkaido3C.html の6つのファイル
tokyoのフォルダを作成してその中に
tokyo1.html
tokyo2.html
tokyo3.html
tokyo1A.html
tokyo2A.html
tokyo3C.html の6つのファイル
を入れるようにしたいと思っています。
いまのVBAでは、予め作成しておいたフォルダに
作成したファイルを格納していくようになっています。
これを住所欄をもとにして
hokkaidoとかaomoriのフォルダを作り、
その中にhokkaido01.htmlとhokkaido1A.htmlのファイルを
入れるようにしたいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) InputBoxでキャンセルボタンを押したらファイル自体を閉じたい 3 2022/07/23 17:52
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTMLからフォルダを開きたい
-
iPadの標準ブラウザでローカルH...
-
Flashのパブリッシュについて
-
htmlファイルの中にhtmlファイ...
-
メールに添付されたhtmlファイ...
-
社内で利用するWebサイトを立ち...
-
htmlの中にexcelが埋め込むには...
-
スタイルシートの外部ファイル...
-
、URL化させるにはどうしたらい...
-
ホームページでファイルをダウ...
-
<!DOCTYPE html>あってますか?...
-
<!DOCTYPE html>あってますか?...
-
form action="#"
-
<!DOCTYPE html>あってますか?↑
-
java_run.batがダウンロードで...
-
Excelで、社外秘(閲覧のみ)と...
-
セイヨウタンポポとカントウタ...
-
Webサイトから、txtファイルを...
-
googleドライブで、PDFファイル...
-
複数のindex.htmlが存在するホ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLからフォルダを開きたい
-
iPadの標準ブラウザでローカルH...
-
HTMLで別PCのフォルダを開く
-
htmlの中にexcelが埋め込むには...
-
社内で利用するWebサイトを立ち...
-
htmlの謎
-
、URL化させるにはどうしたらい...
-
<a href=…></a>で表示されない。
-
メールに添付されたhtmlファイ...
-
input type="file"のmaxlength...
-
コマンドプロンプトでパラメー...
-
HTMLの<a href="xxx.html">~</...
-
html からリンクされていないフ...
-
編集HTMLファイルを別のフォル...
-
VB6でHTMLファイルを起動するに...
-
htmlにtextファイルを表示させ...
-
JSPの中にhtmlファイルを埋め込...
-
HTMLで画像を表示させたいです
-
テンプレートファイルでCSS...
-
C# ローカルにあるhtmlの相対...
おすすめ情報