データベースプログラムを作成し、他のパソコンにインストールしました。
が、「オブジェクト変数またはWithブロック変数が設定されていません。」とエラーメッセージがでて強制終了されてしまいます。
どのパソコンで実行してもこのエラーが出てしまいます。このプログラムは、他のインストールしたいパソコンとほとんど同じ環境の中に居ます。
何が原因と考えられるでしょうか??

A 回答 (1件)

ここは、VisualBasicですが、Accessのことでしょうか?



ViualBasicなら、必要な DLL/OCXがセットアップされていないのだろうと思います。

Accessなら、VisualBasicEditorで参照設定が違うのだと思われます。
    • good
    • 0

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

このQ&Aと関連する良く見られている質問

Q「オブジェクト変数または With ブロック変数が設定されていません。」の修正方法が分かりません

 いつも勉強させていただいております.どうぞよろしくお願いいたします.
 とんちんかんな質問でしたらもうしわけございません.

 多分オブジェクト定義あたりの問題だと思うのですが,
.NETでエクセルのオートシェイプ文字をいじる際,
Dim objShape As Object
Dim objSelection As Object
For i = 1 To WB.Worksheets(N_s).Shapes.count
objShape = WB.Worksheets(N_s).Shapes(i)
If objShape.Type = 6 Then
objSelection = objShape.Select()
For Each tbox In objShape.Ungroup()
If TypeName(tbox) = "TextBox" Then
tbox.Text = Replace(tbox.Text, OldStr, NewStr)
End If
Next
objSelection.ShapeRange.Regroup() '←ここでエラーが出ます
Else
End If
Next

ずっと調べておりますと,同じような質問があり,解決しているようなのですが,
理解できませんでした...
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=29246&forum=7

 objSelection As Objectで宣言しているからOK.というわけでは
ないのでしょうか??
 とんちんかんな質問かもしれませんが,なんでもアドバイスいただけれると
うれしいです.どうぞよろしくお願いいたします.

 いつも勉強させていただいております.どうぞよろしくお願いいたします.
 とんちんかんな質問でしたらもうしわけございません.

 多分オブジェクト定義あたりの問題だと思うのですが,
.NETでエクセルのオートシェイプ文字をいじる際,
Dim objShape As Object
Dim objSelection As Object
For i = 1 To WB.Worksheets(N_s).Shapes.count
objShape = WB.Worksheets(N_s).Shapes(i)
If objShape.Type = 6 Then
objSelection = objShape.Select()
...続きを読む

Aベストアンサー

#1 redfox63さんの回答について
.NETなので、Setステートメントは必要ないです。

MSDNで調べてみただけですが、ShapeオブジェクトのSelectメソッドは「Subプロシージャ」なので戻り値はないようです。
なので、objSelectionに何も値が入っていないのではないかと。
MSDNでは、Shape.UngroupメソッドでShapeRageを返しているので、
> objSelection = objShape.Select()
> For Each tbox In objShape.Ungroup()
この2行が次のようになるのではないかと推測。
objShape.Select()
objSelection = objShape.Ungroup() 'objSelectionにShapeRangeが入る
For Each tbox In objSelection

こうしておいて、再グループ化するときは、
> objSelection.ShapeRange.Regroup()
ではなく
objSelection.Regroup()
とすればよいような気がします。

ご提示されたコードとMSDNを見ただけの推測回答ですが、ご参考になれば。

#1 redfox63さんの回答について
.NETなので、Setステートメントは必要ないです。

MSDNで調べてみただけですが、ShapeオブジェクトのSelectメソッドは「Subプロシージャ」なので戻り値はないようです。
なので、objSelectionに何も値が入っていないのではないかと。
MSDNでは、Shape.UngroupメソッドでShapeRageを返しているので、
> objSelection = objShape.Select()
> For Each tbox In objShape.Ungroup()
この2行が次のようになるのではないかと推測。
objShape.Select()
objSelection = objShape...続きを読む

Qオブジェクト変数またはWithブロック変数が設定されていません

はじめまして質問させていただきます。

Webページからコピー&ペーストしたものを必要な情報だけ
抜き出すものを作成中です。
1ページ目は成功していますが
2ページ目の objIE.Navigate url の行で
実行時エラー'91' オブジェクト変数またはwithブロック変数が設定されていません。とでてしまします。
解決策をご教授お願いします。
Dim objIE As Object
Dim url As String
Dim tai As String
Dim aku As String
Dim uot As String
Dim i As Integer
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
x = 1
For i = 1 To 20
url = Worksheets("データ").Range("E" & i)
objIE.Navigate url
Do
If objIE.Busy = False And objIE.readyState = 4 Then Exit Do
Loop
objIE.ExecWB 17, 0
objIE.ExecWB 12, 0
Sheets.Add
ActiveSheet.Name = "1"
Range("A1").Select
ActiveSheet.PasteSpecial Format:="テキスト"
objIE.Quit: Set objIE = Nothing
tai = Worksheets("1").Range("A13")
aku = Worksheets("1").Range("A63")
uot = Worksheets("1").Range("A64")
Worksheets("データ").Select
Range("A" & i) = tai
Range("B" & i) = aku
Range("C" & i) = uot
Application.DisplayAlerts = False
Worksheets("1").Delete
Application.DisplayAlerts = True
Next i

はじめまして質問させていただきます。

Webページからコピー&ペーストしたものを必要な情報だけ
抜き出すものを作成中です。
1ページ目は成功していますが
2ページ目の objIE.Navigate url の行で
実行時エラー'91' オブジェクト変数またはwithブロック変数が設定されていません。とでてしまします。
解決策をご教授お願いします。
Dim objIE As Object
Dim url As String
Dim tai As String
Dim aku As String
Dim uot As String
Dim i As Integer
Set objIE = C...続きを読む

Aベストアンサー

> Set objIE = Nothing

これが何を意味するかが解れば解決かも。

Q複数該当の検索処理でエラーになる(オブジェクト変数または With ブロック変数が設定されていません)

ある複数のチーム単位の名簿をに毎月作成してします。チーム異動のあった人は旧チームファイルを探してあるデータを抽出したいです。
以下のようなコードで異動者がわかるコメントを検索し該当者のある限り処理を続けたいのですが、該当データが複数ある場合、1つ目だけ該当して、2件目以降を検索する結果セルには該当があってもなくてもNothingが返ってきてしまいます。

Workbooks.Open Filename:="000" & intNendo & strHanki,UpdateLinks:=0
Range("A1").Select
With Range("A1:A37")
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
If Not 結果セル Is Nothing Then
最初アドレス = 結果セル.Address
Do
strIdousyaName = Cells(結果セル.Row, 5).Value
For intteamName2 = 2 To LastTeam
Windows(strBookname).Activate
Sheets("名簿").Select
TeamName2 = Cells(intteamName2, 2).Value
'異動先チーム名簿は飛ばす
If TeamName2 <> TeamName1 Then
Workbooks.Open Filename:=mypath & "チーム名簿\" & TeamName2 & "000" & intNendo & strHanki, UpdateLinks:=0
With Worksheets(1).Range("A6:A37")
Set Status = .Find(What:=strIdousyaName, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
'異動者の名前があればoooをセットする
If Not Status Is Nothing Then
strStatusRow = Range(Status.Address).Row
Dataooo1 = Cells(strStatusRow, 26).Value
strFileCloseFLG = "1"
Else
With Worksheets(1).Range("E6:E37")
Set Status = .Find(What:=strIdousyaName, LookIn:=xlValues, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False)
'異動者の名前がある&Dataがゼロの時 oooをセットする
If Not Status Is Nothing Then
If Cells(strStatusRow, 35).Value = 0 Then
strStatusRow = Range(Status.Address).Row
Dataooo1 = Cells(strStatusRow, 26).Value
strFileCloseFLG = "1"
End If
End If
End With
End If
End With
'該当があったら ループから抜ける
If strFileCloseFLG = "1" Then
ActiveWindow.Close
Windows(TeamName1 & "000" & intNendo & strHanki & ".xls").Activate
Cells(結果セル.Row, 44) = Dataooo1
Exit For
End If
Else
End If
Next intteamName2
Set 結果セル = .FindNext(結果セル)   ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
Loop While Not 結果セル Is Nothing And 結果セル.Address <> 最初アドレス   ←(2)ここでエラーがでます
End If
End With

(1)次の該当があってもなくても結果セルはnothingです。以前テストしていたときは、該当セルがある場合のみ正常に値が返ってきていたのですが。。(特にコードをかえた記憶もありません)
(2)では「オブジェクト変数または With ブロック変数が設定されていません(Error 91)」とでます。
<質問>
・次の検索がうまくヒットするにはどうすればよいでしょうか?
・もし(1)で該当セルがある場合のみ値がかえるようになれば
 (2)を『Loop While Not 結果セル Is Nothing』にしかえてエラーを回避しても問題ないでしょうか?

見よう見真似のコーディングで
とてもみにくいかと思いますが、期限が迫っていてとても困っています。どうかよろしくお願いします。

ある複数のチーム単位の名簿をに毎月作成してします。チーム異動のあった人は旧チームファイルを探してあるデータを抽出したいです。
以下のようなコードで異動者がわかるコメントを検索し該当者のある限り処理を続けたいのですが、該当データが複数ある場合、1つ目だけ該当して、2件目以降を検索する結果セルには該当があってもなくてもNothingが返ってきてしまいます。

Workbooks.Open Filename:="000" & intNendo & strHanki,UpdateLinks:=0
Range("A1").Select
With Range("A1:A37")
...続きを読む

Aベストアンサー

はずしてるかもしれませんが・・・

最初の
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
以後に、別の.Findしてるので、最後の
Set 結果セル = .FindNext(結果セル) ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
の検索条件が変わってしまっているのだと思います。
という訳で、最初に範囲を取得してしまうか、.Find以外の方法でチェックするといいと思います。
一番簡単な回避方法は(あまりお勧めではありませんが)、
Set 結果セル = .FindNext(結果セル)
の前に、最初の検索と同じ条件のダミーの検索を入れる方法です。
Set dmy = .Find("異動者", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
を入れると、たぶん回避できると思います。

p.s.
このプログラムが最初の"異動者"を探したシートのモジュール部にあるならいいのですが、標準モジュールにある場合は・・・
ダミーの検索の前にActiveSheetを設定する必要があるかもしれません

はずしてるかもしれませんが・・・

最初の
Set 結果セル = .Find("異動者", LookIn:=xlValues, LookAt :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
以後に、別の.Findしてるので、最後の
Set 結果セル = .FindNext(結果セル) ←(1)次の検索該当セルが存在しても結果セルにNothingが返ってきてしまいます
の検索条件が変わってしまっているのだと思います。
という訳で、最初に範囲を取得してしまうか、.Find以外の方法でチェックするといいと思います。
一番簡...続きを読む

QVBSエラー"オブジェクト型の変数は定義されていません"について

以下のコードは、あるルートフォルダにトップページ"TOP.html"をつくり(または上書きし)、各階層のフォルダの中に存在する拡張子がabc(仮称)のファイルと同じ名前のhtmlファイルを、abcファイルと同じフォルダに同じ数だけつくり(または上書きし)、トップページにその作成したすべてのhtmlファイルへのリンクを表示させる、という構想で作成中のVBSなのですが(具体的な数値等は"****"としました)、これを実行すると「●(マル)」と書いた55行目のところでエラー「オブジェクト型の変数は定義されていません」となってしまいます。このエラーをどのように対処すればよいかを教えていただければと思います。
私はExcelのVBAは多少の経験がありますが、VBScriptを書いたのはこれが初めてで、HTMLも未経験です。14・15行目の呼び出し方はこれでいいのかどうかも不安です。よろしくお願いします。

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set CurFolder = fso.GetFolder(".")
Call CreatePages1(CurFolder, "*.abc", files)

Set outFileStream = Nothing
Set CurFolder = Nothing
Set fso = Nothing

'サブフォルダへの処理
Public Sub SearchSubFolder1(ByVal folder)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set folder2 = fso.GetFolder(folder.Path)
For Each folder2 In folder.SubFolders
Call CreatePages1(folder2, searchPattern, files)
'再帰呼び出し
Call SearchSubFolder1(folder2)
Next
Set fso = Nothing
End Sub

'htmlファイル作成
Public Sub CreatePages1(ByVal folder, ByVal searchPattern, ByRef files)
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

'トップページを途中まで作成する。
Set outFileStream = fso.CreateTextFile(folder.Path & "\TOP.html", True)
outFileStream.WriteLine "<HTML>"
outFileStream.WriteLine "<HEAD>"
outFileStream.WriteLine "<TITLE>Viewer</TITLE>"
outFileStream.WriteLine "</HEAD>"
outFileStream.WriteLine "<BODY>"

'各htmlファイルを作成する。
For Each fs In folder.Files
Set outFileStream = fso.CreateTextFile(folder.Path & "\" & Left(fs.Name, Len(fs.Name) - Len(Ext)-1) & ".html", True)
outFileStream.WriteLine "<HTML>"
outFileStream.WriteLine "<HEAD>"
outFileStream.WriteLine "<TITLE>Browser</TITLE>"
outFileStream.WriteLine "</HEAD>"
outFileStream.WriteLine "<BODY>"
outFileStream.WriteLine "<OBJECT ID=""Browser1"" WIDTH=**** HEIGHT=**** CLASSID=""CLSID:****"">"
outFileStream.WriteLine "<PARAM NAME=""_Version"" VALUE=""*****"">"
outFileStream.WriteLine "<PARAM NAME=""_ExtentX"" VALUE=""*****"">"
outFileStream.WriteLine "<PARAM NAME=""_ExtentY"" VALUE=""*****"">"
outFileStream.WriteLine "<PARAM NAME=""_StockProps"" VALUE=""*****"">"
outFileStream.WriteLine "<PARAM NAME=""FileName"" VALUE=""" & folder.Path & "\" & fs.Name & """>"
outFileStream.WriteLine "</OBJECT>"
outFileStream.WriteLine "</BODY>"
outFileStream.WriteLine "</HTML>"
outFileStream.Close()

'トップページの続きを作成する。
Ext = fso.GetExtensionName(fs.Name)
If LCase(Ext) = "html" Then
●(マル) outFileStream.WriteLine "<a href=""" & folder.Path & "\" & fs.Name & """>" & Left(fs.Name, Len(fs.Name) - Len(Ext)-1) & "</a><br>"
End If
Next
outFileStream.WriteLine "</BODY>"
outFileStream.WriteLine "</HTML>"
outFileStream.Close()

'サブフォルダへの処理。
Set fp = fso.GetFolder(folder.Path)
Call SearchSubFolder1(fp)

End Sub

以下のコードは、あるルートフォルダにトップページ"TOP.html"をつくり(または上書きし)、各階層のフォルダの中に存在する拡張子がabc(仮称)のファイルと同じ名前のhtmlファイルを、abcファイルと同じフォルダに同じ数だけつくり(または上書きし)、トップページにその作成したすべてのhtmlファイルへのリンクを表示させる、という構想で作成中のVBSなのですが(具体的な数値等は"****"としました)、これを実行すると「●(マル)」と書いた55行目のところでエラー「オブジェクト型の変数は定義されていません」...続きを読む

Aベストアンサー

試してませんが、ざっと見たところ、、、
50行目で outFileStream を Close() しちゃってませんか?
というか outFileStream が途中で別のファイルを参照しちゃってますよね。

Public Sub Createpages1 では 26行目で outFileStream で Top.html を参照させてますが、34行目から始まる For Each 内でそのほかの html ファイルを参照させちゃってますよね。
だからもし仮に 54行目の If の条件によって 55行目の処理が一度もなされないまま For Each ~ Next が完全に終了し、続いて 58行目から outFileStream (開発者の希望では Top.html を参照していてほしいのだろう) に書き込もうとしていますが、この時すでに outFileStream は For Each 内で別のファイルを参照して Close した後なので、ここでも同様のエラーが出るだろうと思います。

解決策ですが、For Each 内の outFileStream を別の名前の変数にするべきでしょう。

あと、Createpages1 の引数 folder と files は FileSystemObject の Folder オブジェクトと Files プロパティーと同じ名前なので別の名前にしたほうがいいと思います。
私なら
Public Sub CreatePages1(ByVal aFolder, ByVal aSearchPattern, ByRef aFiles)
みたいに引数名の頭に a を付けます。

あとは、、、変数の宣言を必ず行うようにしてます。
そのためファイルの先頭に Option Explicit を付けるようにしています。
これでタイプミスによる変数の自動作成を防げます。

Public Sub CreatePages1(ByVal aFolder, ByVal aSearchPattern, ByRef aFiles)
 Dim fso ' FileSystemObject オブジェクト
 Set fso = CreateObject(略)
 Dim topHtmlTS ' Top.html を参照する TextStream オブジェクト
 Set topHtmlTS = fso.略

 途中略

 Dim fileItem ' File オブジェクト
 For Each fs In aFolder.Files
  Dim otherHtmlTS ' 各 HTML を参照する TextStream オブジェクト
  Set otherHtmlTS = fso.略
  略
  otherHtmlTS.Close()

  If LCase(Ext) = "html" Then
   topHtmlTS.WriteLine 略
  End If
 Next
 topHtmlTS.WriteLine 略
 topHtmlTS.Close

 Dim currentFolder ' 現在のフォルダーを参照する Folder オブジェクト
 Set currentFolder = fso.GetFolder(aFolder.Path)
 Call SearchSubFolder1(currentFolder)
End Sub

あと、VBScript のデバッグは難しいものがあるので、私は最初に Excel の VBEditor 等でソースを書いてステップ実行のデバッグを行ったりしてます。
その際、コードの開始部分も Sub Start() みたいなプロシージャに入れ込んで作ります。(VBScript と VBA の違い)
デバッグが終わったらテキスト ファイルにコピペして、処理開始部分をプロシージャを取っ払って云々の作業をして終了。

後は有料のソフトになりますが VbsEdit というソフトもステップ実行のデバッグができます。
お金を払わなければ起動時にダイアログが出たり、デバッグ時に嫌がらせをされるぐらいで、基本的なことはすべてできます。
インテリセンスも付いているので便利です。
私も無料のまま使ってます。

試してませんが、ざっと見たところ、、、
50行目で outFileStream を Close() しちゃってませんか?
というか outFileStream が途中で別のファイルを参照しちゃってますよね。

Public Sub Createpages1 では 26行目で outFileStream で Top.html を参照させてますが、34行目から始まる For Each 内でそのほかの html ファイルを参照させちゃってますよね。
だからもし仮に 54行目の If の条件によって 55行目の処理が一度もなされないまま For Each ~ Next が完全に終了し、続いて 58行目から outFileStrea...続きを読む

QVBSエラー"オブジェクト型の変数は定義されていません"について(2)

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

こんばんは。よろしくお願いします。
CreatePages1は、あるルートフォルダ(rtFolder)にトップページ"index.html"をつくり(または上書きし)、そのルートフォルダの中にひとつだけあるフォルダ(sbFolder)以下のすべての階層のすべてのフォルダの中に存在する、拡張子がabc(仮称)のファイルと同じ名前のhtmlファイルを、abcファイルと同じフォルダに同じ数だけつくり(または上書きし)、トップページ"index.html"にその作成したすべてのhtmlファイルへのリンクを表示させる、という構想で作成中のVBSなのですが、こ...続きを読む

Aベストアンサー

やりたい事がわからない。
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

やりたい事がわからない。
index.html はどのフォルダーに作りたいのでしょうか。
一番上のフォルダーに 1個だけなのか、各フォルダーなのか。

Sub CreatePages1(rtFolder) の中で、rtFolder フォルダーに index.html を作ってますよね。
んでサブフォルダーの処理の中でも CreatePages1 プロシージャーを呼び出してますよね。
てことは各フォルダーの中に index.html を作りたいってこと?

私なりにテレパシーを使ってみました。
1. あるフォルダーをルート フォルダーとする。
2. ルート フォルダー...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報