こんばんは。よろしくお願いします。
CreatePages1は、あるルートフォルダ(rtFolder)にトップページ"index.html"をつくり(または上書きし)、そのルートフォルダの中にひとつだけあるフォルダ(sbFolder)以下のすべての階層のすべてのフォルダの中に存在する、拡張子がabc(仮称)のファイルと同じ名前のhtmlファイルを、abcファイルと同じフォルダに同じ数だけつくり(または上書きし)、トップページ"index.html"にその作成したすべてのhtmlファイルへのリンクを表示させる、という構想で作成中のVBSなのですが、これを実行すると「●(マル)」と書いた20行目のところでエラー「オブジェクト型の変数は定義されていません」となってしまいます。その前のEchoの結果は望みどおりになっていると思います。このエラーをどのように対処すればよいかを教えていただければと思います。
注)rtFolderにabcファイルはありません。
私はExcelのVBAは多少の経験がありますが、VBScriptを書いたのはこれが初めてで、HTMLも未経験です。
aSearchPatternに"*.abc"を代入したのに、▲(さんかく)と書いた行で拡張子"abc"を指定してしまっているのは、こうしないと全てのファイルについてhtmlファイルが作成されそうだったからです。よろしければ、このことも含めてご回答よろしくお願いします。
Option Explicit
Public fso, CurFolder, indexPageTS, otherPageTS, rtFolder, sbFolder, sbFolder2, _
dataFolder, aSearchPattern, aFiles, FileItem, currentFolder, Ext
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set CurFolder = fso.GetFolder(".")
Call CreatePages1(CurFolder, "*.abc", aFiles)
Set CurFolder = Nothing
Set fso = Nothing
'サブフォルダへの処理
Public Sub SearchSubFolder1(ByVal sbFolder)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
For Each sbFolder2 In sbFolder.SubFolders
WScript.Echo sbFolder
WScript.Echo sbFolder2
●(マル) If sbFolder2 <> "" Then
Call CreatePages1(sbfolder2, aSearchPattern, aFiles)
'再帰呼び出し
If sbFolder2 <> "" Then
Call SearchSubFolder1(sbFolder2)
End If
End If
Next
'オブジェクトの開放。
Set sbFolder2 = Nothing
Set fso = Nothing
End Sub
'htmlファイル作成
Public Sub CreatePages1(ByVal rtFolder, ByVal aSearchPattern, ByRef aFiles)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
'トップページを途中まで作成する。
Set indexPageTS = fso.CreateTextFile(rtFolder.Path & "\index.html", True)
indexPageTS.WriteLine "<HTML>"
(中略)
'データフォルダに各htmlファイルを作成する。
For Each dataFolder In rtFolder.SubFolders
If dataFolder <> "" Then
For Each FileItem In dataFolder.Files
If FileItem <> "" Then
Ext = fso.GetExtensionName(FileItem.Name)
▲(さんかく)If LCase(Ext) = "abc" Then
Set otherPageTS = fso.CreateTextFile(dataFolder.Path & "\" & Left(FileItem.Name, Len(FileItem.Name) - Len(Ext)-1) & ".html", True)
otherPageTS.WriteLine "<HTML>"
(中略)
otherPageTS.WriteLine "</HTML>"
otherPageTS.Close()
'トップページに各リンクを作成する。
Ext = fso.GetExtensionName(FileItem.Name)
If LCase(Ext) = "html" Then
indexPageTS.WriteLine "<a href=""" & rtFolder.Path & "\" & FileItem.Name & """>" & Left(FileItem.Name, Len(FileItem.Name) - Len(Ext)-1) & "</a><br>"
End If
End If
End If
Next
End If
Next
'トップページの続きを記述する。
indexPageTS.WriteLine "</BODY>"
indexPageTS.WriteLine "</HTML>"
indexPageTS.Close()
'データフォルダのサブフォルダへの処理。
For Each dataFolder In rtFolder.SubFolders
If dataFolder <> "" Then
Set currentFolder = fso.GetFolder(dataFolder.Path)
If currentFolder <> "" Then
Call SearchSubFolder1(currentFolder)
End If
End If
Next
'オブジェクトの開放。
Set currentFolder = Nothing
Set dataFolder = Nothing
Set indexPageTS = Nothing
Set otherPageTS = Nothing
Set fso = Nothing
End Sub
No.1ベストアンサー
- 回答日時:
やりたい事がわからない。
index.html はどのフォルダーに作りたいのでしょうか。
一番上のフォルダーに 1個だけなのか、各フォルダーなのか。
Sub CreatePages1(rtFolder) の中で、rtFolder フォルダーに index.html を作ってますよね。
んでサブフォルダーの処理の中でも CreatePages1 プロシージャーを呼び出してますよね。
てことは各フォルダーの中に index.html を作りたいってこと?
私なりにテレパシーを使ってみました。
1. あるフォルダーをルート フォルダーとする。
2. ルート フォルダーにはサブフォルダーしかない。
3. サブフォルダーは複数階層になっている。
4. 各サブフォルダー内には拡張子 abc のファイルが置いてある。
5. 全ての *.abc ファイルと同じ名前の html ファイルを *.abc ファイルと同じフォルダーに作る。
6. 作成した各 html ファイルへのリンクを、ルート フォルダーの index.html に記述する。
※ コードがインデントして見えるのは全角スペースを使ってます。
※ コピペする場合は半角スペースに置換してください。
Option Explicit
' fso と indexPageTS は全体で使用。
Public fso, indexPageTS
Call Start()
' --------
' index.html を作成し、ヘッダーを記述。
' サブフォルダーの処理を DataFolderProc プロシージャーに任せる。
' index.html を閉じる。
' --------
Sub Start()
Set fso = CreateObject("Scripting.FileSystemObject")
' ルート フォルダーを参照
Dim rootFolder
Set rootFolder = fso.GetFolder("D:\root")
' index.html を作成
Set indexPageTS = fso.CreateTextFile(fso.BuildPath(rootFolder.Path, "index.html"), True)
' index.html のヘッダーを記述
indexPageTS.WriteLine "<html><head><title>Viewer</title></head><body>"
' ルート フォルダー内のサブフォルダーを処理
Dim dataFolder
For Each dataFolder In rootFolder.SubFolders
' サブフォルダー内での処理はすべて DataFolderProc に任せる
Call DataFolderProc(dataFolder)
Next
' index.html を閉じる
indexPageTS.WriteLine "</body></html>"
indexPageTS.Close
Set indexPageTS = Nothing
Set fso = Nothing
End Sub
' --------
' 受け取ったフォルダー内のデーター ファイルから html ファイルを生成し、
' index.html にリンクを記述する。
' サブフォルダーがあれば再帰呼び出しで潜って処理する。
' --------
Sub DataFolderProc(aFolder)
' フォルダー内のデーター ファイルに対応した html を作り、index.html にリンクを記述
Dim dataFile
For Each dataFile In aFolder.Files
If LCase(fso.GetExtensionName(dataFile)) = "txt" Then
' データー用の html を作成して中身を記述
Dim dataPageName, dataPageTS
dataPageName = fso.GetBaseName(dataFile.Name) & ".html"
Set dataPageTS = aFolder.CreateTextFile(dataPageName, True)
dataPageTS.WriteLine "<html><head><title>データー ファイル</title></head><body>あれやこれや</body></html>"
dataPageTS.Close
' index.html にリンクを記述
indexPageTS.WriteLine "<a href='" & fso.BuildPath(aFolder.Path, dataPageName) & "'>" & dataPageName & "</a><br/>"
End If
Next
' サブフォルダーがあれば再帰呼び出しで処理する
Dim subFolder
For Each subFolder In aFolder.SubFolders
Call DataFolderProc(subFolder)
Next
End Sub
お察しの通りです!
説明が雑で、お手間をとらせましてすみません。
いただいたコードを頼りに、明日また頑張ってみます。
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- Visual Basic(VBA) FileSearch2007に変わる構文について 1 2022/12/16 16:57
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1つ下の階層のフォルダに相対...
-
拡張子htmlの表示について
-
HPを転送したのですが・・・。
-
ベーシック認証 CSSリンク
-
htaccessを利用してurl正規化
-
ひとつのドメインで複数サイト...
-
リンク先に日本語フォルダがあ...
-
webサイトの「index」を非表示...
-
リンクのindex.html省略
-
既存ウェブサイトをWordPressへ...
-
Excelで、社外秘(閲覧のみ)と...
-
ホームページでファイルをダウ...
-
HTMLからフォルダを開きたい
-
iPadの標準ブラウザでローカルH...
-
<!DOCTYPE html>あってますか?↑
-
form action="#"
-
一つのリンクに複数のURLを指定
-
インラインフレーム内のアンカ...
-
コマンドプロンプトでパラメー...
-
googleドライブで、PDFファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
1つ下の階層のフォルダに相対...
-
複数のindex.htmlを作ってもい...
-
htaccessを利用してurl正規化
-
リンク先に日本語フォルダがあ...
-
URLに「.html」の拡張子がなく...
-
.htmと.htmlの違い
-
フォルダ内の最初のファイル名...
-
XREA使用で作成したHTMLファイ...
-
サーバー内のフォルダにある写...
-
トップページ「/index.html」の...
-
フォルダにはダミーでもindex.h...
-
htmlでリンクに勝手にindex.htm...
-
URLの書き方
-
リンクのindex.html省略
-
index.htmlファイルはどこに?
-
Application.OnTimeで引数付き...
-
ホームを index.html から inde...
-
JSPと異なるディレクトリのファ...
-
HTMLの階層移動
-
Matlabでforやifを使わずに条件...
おすすめ情報