プロが教えるわが家の防犯対策術!

こんばんは。よろしくお願いします。
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

A 回答 (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
    • good
    • 0
この回答へのお礼

お察しの通りです!
説明が雑で、お手間をとらせましてすみません。
いただいたコードを頼りに、明日また頑張ってみます。
ありがとうございます!

お礼日時:2010/02/11 16:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!