• ベストアンサー

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

以下のコードは、あるルートフォルダにトップページ"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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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

quicon9ue
質問者

お礼

いろいろ教えていただき、ありがとうございます。 非常に感謝しております。 明日また仕事の合間にじっくりやってみます。

その他の回答 (1)

回答No.1

エラーになっている原因ではないかもしれませんが、 outFileStream.WriteLine の前で outFileStream.Close としているのはマズイと思います。

関連するQ&A

  • VBS について

    以下のスクリプトは、あるフォルダ以下の(サブフォルダを含む)abcファイル(仮称)すべてについて同じ名前でhtmlファイルをつくると同時に、そこへリンクするメニューのページを上書きする、という構想で書いたものですが、実行すると2行目で ')'がありません というエラーが出てしまいました。(具体的な数値等は"****"としました) 私はExcelのVBAは多少の経験がありますが、VBScriptを書いたのはこれが初めてで、HTMLも未経験です。 "')'がない"というのはどういうことなのか、このエラーをどのように対処すればよいかを教えていただければと思います。よろしくお願いします。 Set fso = WScript.CreateObject("Scripting.FileSystemObject") Public Sub GetAllFiles(ByVal folder As String, ByVal searchPattern As String, ByRef files As ArrayList) 'folderにあるファイルを取得する。 Dim fs As String() = System.IO.Directory.GetFiles(folder, searchPattern) 'トップページを途中まで作成する。 Set outFileStream = fso.CreateTextFile(folder.Path & "\***", True) outFileStream.WriteLine "<HTML>" outFileStream.WriteLine "<HEAD>" outFileStream.WriteLine "<TITLE>****</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>***</TITLE>" outFileStream.WriteLine "</HEAD>" outFileStream.WriteLine "<BODY>" outFileStream.WriteLine "<OBJECT ID=""****"" 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() 'folderのサブフォルダを取得する。 Dim ds As String() = System.IO.Directory.GetDirectories(folder) 'サブフォルダへの処理も行う。 Dim d As String For Each d In ds GetAllFiles(d, searchPattern, files) Next d End Sub Set CurFolder = fso.GetFolder(".") GetAllFiles(CurFolder, "*.abc", files) Set outFileStream = Nothing Set CurFolder = Nothing Set fso = Nothing

  • VBSエラー"オブジェクト型の変数は定義されていません"について(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

  • htmlのボタンでVBSのプロシージャを起動

    こんばんは。まず、状況の説明と、やりたいことの箇条書きです。 1. あるフォルダー"root"をルートフォルダーとする。 2. ルートフォルダーにはフォルダ"abcdata"とindex.htmlとmystyle.cssがある。 3. フォルダ"abcdata"にはサブフォルダー1つしかない。 4. サブフォルダーは複数階層になっている。 5. 各サブフォルダー内には拡張子 abc のファイルが置いてある。 6. index.html上のボタン"refresh"をクリックすると、サブプロシージャー"Start"が働く。 7. サブプロシージャー"Start"は、全ての *.abc ファイルと同じ名前の html ファイルを *.abc ファイルと同じフォルダーに作り、作成した各 html ファイルへのリンクを、ルートフォルダーの index.html に記述する。 8. index.html におけるリンクの表示は、階層ごとにインデント適用する。 下記、引用のソースは、index.htmlを写したものです(具体的な数値等は伏せてあります)。そこにうめこまれた"refresh"ボタンを押すとサブプロシージャー"Start"を起動され、index.html自身が書きかわるようにしたいのですが、うまくいきません(IEの左下のところに「ページでエラーが発生しました」と出ます)。どうすればよいでしょうか。 私はExcelのVBAは少し経験がありますが、VBSを書いたのはこれが初めてです。HTMLやCSSはまったくの初心者です。ようやくフォントサイズの絶対指定ができた程度です。よろしくお願いします。 <HTML><HEAD><TITLE>Viewer</TITLE> <SCRIPT LANGUAGE="VBScript"> <!-- Sub Start(ByRef i) Set fso = CreateObject("Scripting.FileSystemObject") Set rootFolder = fso.GetFolder(".") 'index.htmlを作成 Set indexPageTS = fso.CreateTextFile(fso.BuildPath(rootFolder.Path, "index.html"), True) indexPageTS.WriteLine "<HTML>" (ヘッダーは省略:文字数節約のため) indexPageTS.WriteLine "<BODY text=""#000000"" link=""#0000FF"" alink=""teal"">" indexPageTS.WriteLine "<span style="width:100%; filter:DropShadow(color=#CCCCFF,direction=135)"><font color=""Navy""; size= 6pt>abcdata</font></span><br>" indexPageTS.WriteLine "<br>" indexPageTS.WriteLine "<input type=""button"" value=""reload"" onclick=""location.reload()"">" indexPageTS.WriteLine "<input type=""button"" name=""InputBtn"" onclick=""Start(1)"" value=""refresh"">" indexPageTS.WriteLine "<br>" '各サブフォルダーへの処理はDataFolderProcに任せる Set accessoryFolder = fso.GetFolder(".\abcdata") For Each dataFolder In accessoryFolder.SubFolders i = 1 Call DataFolderProc(dataFolder, i) Next indexPageTS.WriteLine "</p>" indexPageTS.WriteLine "</BODY>" indexPageTS.WriteLine "</HTML>" indexPageTS.Close() Set indexPageTS = Nothing Set fso = Nothing End Sub indexPageTS.WriteLine "<br>" Sub DataFolderProc(aFolder, n) For Each dataFile In aFolder.Files If LCase(fso.GetExtensionName(dataFile)) = "abc" Then linkName = fso.GetBaseName(dataFile.Name) dataPageName = fso.GetBaseName(dataFile.Name) & ".html" Set dataPageTS = aFolder.CreateTextFile(dataPageName, True) dataPageTS.WriteLine "<HTML>" '(中略:各htmlファイルへの記述がここに入る) dataPageTS.WriteLine "</HTML>" dataPageTS.Close() 'index.htmlに各リンクを張る indexPageTS.WriteLine "<p style=""text-indent:" & n & "em"><a target=""_blank"" href='" & fso.BuildPath(aFolder.Path, dataPageName) & "'>" & linkName & "</a>" End If Next 'サブフォルダーがあれば同様に処理する For Each subFolder In aFolder.SubFolders n = n + 1 Call DataFolderProc(subFolder, n) Next End Sub --> </SCRIPT> <LINK REL="stylesheet" TYPE="text/css" HREF="mystyle.css"> </HEAD> <BODY text="#000000" link="#0000FF" alink="teal"> <span style="width:100%; filter:DropShadow(color=#CCCCFF,direction=135)"><font color="Navy"; size= 6pt>abcdata</font></span><br> <br> <input type="button" value="reload" onclick="location.reload()"> <input type="button" name="InputBtn" onclick="Start(1)" value="refresh"> <br> <p style="text-indent:1em"><a target="_blank" href='C:\root\abcdata\a\abcde</a> '(中略:各リンク) </p></BODY></HTML>

    • ベストアンサー
    • HTML
  • エラー この変数は宣言されていません'WScript'

    こんばんは。HTMLやjavascriptは初心者ですが、よろしくお願いします。まず、こちらをご覧ください。 <HTML> <HEAD> <TITLE>Menu</TITLE> <SCRIPT LANGUAGE="VBScript"> <!-- Option Explicit Public fso, indexPageTS, i Sub Start(ByRef i) Dim rootFolder, rootPath Set fso = CreateObject("Scripting.FileSystemObject") Set rootFolder = fso.GetParentFolderName(WScript.ScriptFullName) alert rootFolder.Name Set indexPageTS = fso.CreateTextFile(fso.BuildPath(rootFolder.Path, "index.html"), True) このように、<HEAD>にサブプロシージャを記述しております。少し中略します。<BODY>に以下のボタンを置きます。 <input type="button" name="InputBtn" onclick="Start(1)" value="リンクの更新"> これを押すとエラーになってしまいました。 IEでは「ページでエラーが発生しました」、htaEditというソフトで実行すると表題に掲げたエラーが出ました。6行目の、 Set rootFolder = fso.GetParentFolderName(WScript.ScriptFullName) のところをfso.GetFolderで手書きのパスを指定したらうまくいっていたので、'WScript'の使い方がいけないのかなとも思いましたが、VBSファイルにして実行すると問題ありませんでした。 htmlページのボタンではWScript.ScriptFullNameは使えないのでしょうか? IEのヴァージョンは少し古めで、5か6ですが、問題ありますでしょうか? よろしくお願いします。

    • ベストアンサー
    • HTML
  • EXCEL2000 フォルダ内のファイルを検索

    EXCEL2000 フォルダ内のファイルを検索 お分かりになる方がいましたらお力添えの程よろしくお願いします。 任意のフォルダ内で任意のファイルサーチが出来るマクロを実行したいのですが、ファイルサーチの値を全角、半角、大文字、小文字区別なく行いたいのです。 例えば,セル2,2に、topと入力したら、topもtopもTOPもTOPも検索対象に引っかかり、セルに書き出して欲しいのです。 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ Sub ファイル一覧2() Dim vntF As Variant Dim objFS As FileSearch Dim objFSO As FileSystemObject Dim GYO As Long Dim cntFound As Long Set objFS = Application.FileSearch ' FileSearch Set objFSO = New FileSystemObject ' FSO Rows("5:65536").ClearContents Application.ScreenUpdating = False GYO = 4 With objFS .NewSearch .LookIn = Trim(Cells(1, 2).Value) ' Search開始フォルダ .Filename = Trim(Cells(2, 2).Value) ' 探索ファイル式 .SearchSubFolders = True ' サブフォルダも探索 ' 処理開始 If .Execute() <> 0 Then For Each vntF In .FoundFiles With objFSO.GetFile(vntF) GYO = GYO + 1 Cells(GYO, 1).Value = .Name Cells(GYO, 2).Value = .DateLastModified Cells(GYO, 3).Value = _ Left(.Path, Len(.Path) - Len(.Name) - 1) cntFound = cntFound + 1 End With Next vntF End If End With Set objFS = Nothing Set objFSO = Nothing ' 処理結果の表示 If cntFound = 0 Then MsgBox "見つかりません" Else MsgBox cntFound & "個見つかりました" End If End Sub

  • 同名でもエラーにならない理由

    Sub バックアップ作成() Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") FSO.CopyFile CurrentProject.FullName, "C:\test.mdb" Set FSO = Nothing End Sub このコードを実行すると、同じファイルがあってもエラーになりません。 Sub DiskOprate4() MkDir "C:\バックアップ" End Sub なら同名のフォルダがあればエラーになります。 ファイルはエラーにならないがフォルダならエラーになるのでしょうか? それともFSOというのを使うとエラーにならないのですか? よろしくお願いします。

  • VBSで、凝ったHTMLを出力する!

    いつも大変お世話になっております。 上手く説明できない点もあるかと思いますが、 よろしくお願い致します。 現在、色々とプログラムを組むことが多く、 毎回調べては書いて…の繰り返しのため 良く使うもの・便利だったものはメモ帳などに貼り付けて 保存してあります。 しかし、この状態では メモ帳が大量にあり探すのにとても苦労しますし、 内容もとても見づらいものになってしまいます。 現在、同フォルダにあるTXTファイルを自動的にHTMLに変換するVBSと 同フォルダにあるファイルのリンクを作成し、一覧をHTMLにするVBSを作りました。 少しずつ便利にはなってきていますが、 やはり見づらさという点では変わりありません。 そこで、やりたいこととしまして ・ジャンル別に分けたい。 (できればツリー状にして表示したい) ・2フレームで作成したい。(左側に目次、選択したものを右側に表示) 全自動でHTMLファイルを作成しようと思っているのですが、 さすがにむずかしいでしょうか? 例えば HTML化用ファイル   |   |--「HTMLファイルをここに作成」   |   --TEST     |      ------ブック     |    |___新規ブック.html     |    |     |    |___ブック名編集.html     |      ------シート     |    |___新規シート.html     |    |     |    |___シート編集.html     |    |     |    |___シート保護.html     |    |     |    |___シートコピー.html     |    |     |    |___シート削除.html     |         |         |          ------目次3     |      ------目次4     |      ------目次5 ----------------------------------------- 【理想】           |    TEST    |      |     |       ------ブック   |     |    |___新規ブック.html | クリックしたHTMLの内容表示     |    |    |     |    |___ブック名編集.html |     |     |      ------シート   |     |    |___新規シート.html |     |    |    |     |    |___シート編集.html |     |    |    |     |    |___シート保護.html |     |    |    |     |    |___シートコピー.html |     |    |    |     |    |___シート削除.html  |     |        |     |        |     |        |      ------目次3  |     |     |      ------目次4  |     |     |      ------目次5  | ↑↑ 折りたたむことも可能↑↑ 今は、同じフォルダ内にあるものを HTML化することはできています。 ------------------- Sub TEST2() Dim strScriptPath'自分の現在位置 strScriptPath = Replace(WScript.ScriptFullName,WScript.ScriptName,"")'フルネームから、スクリプトネームを削除! ' フォルダをオブジェクト取得 Set objFso = CreateObject("Scripting.FileSystemObject") Set objFolder = objFso.GetFolder(strScriptPath) Set HTMLOutPutData = objFso.CreateTextFile("ファイル一覧.html",True) HTMLOutPutData.WriteLine "<html>" HTMLOutPutData.WriteLine "<head>" HTMLOutPutData.WriteLine "<title></title>" HTMLOutPutData.WriteLine "</head>" HTMLOutPutData.WriteLine "<body>" HTMLOutPutData.WriteLine "<h1 align=""" &"center" &""">まとめ</h1>" HTMLOutPutData.WriteLine "<hr>" for each file in objFolder.Files If file.name<> "ファイル一覧.html" and file.name<> WScript.ScriptName and Right(file.name,4)<> ".vbs" Then HTMLOutPutData.WriteLine "<font size=""" &"5" &"""><a href=""" & file.Path & """>"& file.name & "</a></font><br>" End if Next HTMLOutPutData.WriteLine "</body>" HTMLOutPutData.WriteLine "</html>" End Sub ------------------ http://lll.s21.xrea.com/m/link/37.html Javascriptは特にやっていなかったのと、 HTMLも不慣れなため、簡単なものしかかけませんでした。 フォルダ内の状況をそのまま HTMLとして出力する方法があれば、 教えて下さい。 よろしくお願い致します。 以上、よろしくお願い致します。

  • FSOを使いサブフォルダのファイル操作

    同じ階層のサブフォルダにxlsm入るが入っており、VBAによりモジュールを解放しようと試みています。 まずは、FSOを使ってサブフォルダにアクセスしようとしましたが、下から6行目でエラー(424 オブジェクトが必要です)が出てしまい、解決できませんので、ご教示いただけないでしょうか? よろしくお願いします Sub DeleteMain() With Application.FileDialog(msoFileDialogFolderPicker) If Not .Show Then Exit Sub Call DeleteSub(folderPath:=.SelectedItems(1)) End With End Sub Sub DeleteSub(folderPath As String, Optional mycount As Long = 0) Dim fso As Object, myFolders As Object, myfile As Object Set fso = CreateObject("Scripting.FileSystemObject") Set myFolders = fso.GetFolder(folderPath).SubFolders For Each myfile In fso.GetFolder(folderPath).Files mycount = mycount + 1 ' Cells(mycount, 1) = myfile.Path Debug.Print myfile.Path Next For Each myFolders In fso.GetFolder(folder.Path).SubFolders Call DeleteSub(myFolder.Path, mycount) Next Set fso = Nothing Set myFolders = Nothing End Sub

  • テキストファイルをエクセルに移すマクロのことで?

    以前、複数のテキストファイルをエクセルに移すマクロを教えてもらったのですが、 以下マクロですと、フォルダのパスを指定しないといけません。 今回教えてもらいたいのは、フォルダのパスを指定しなくてもよい方法です。 どういう事かと言うと、仮にディスクトップにフォルダがあるとします。 そのフォルダの中には、マクロが入っているエクセルシートとテキストが入っているフォルダです。 つまり、そのフォルダ内だけで、処理をしたいと考えています。 また、フォルダ名は、その時によって異なります。 今までは、以下の方法を使っていたのですが、ちょっと使いにくいと感じています。 申し訳ありませんが、どなたか教えていただけないでしょうか? Sub Macro() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim FolderPath As String 'ここのアドレスをファイルが格納されているフォルダのパスに変えてください FolderPath = "C:\Users\・・・" Dim myFile As Object Dim i As Long i = 2 Dim myFolder As Object For Each myFolder In fso.GetFolder(FolderPath).SubFolders For Each myFile In fso.GetFolder(myFolder).Files Cells(i, 4).Value = myFolder Cells(i, 1).Value = myFile.Name Cells(i, 7).Value = fso.OpenTextFile(myFile.Path).ReadAll() i = i + 1 Next Next End Sub Private Sub CommandButton1_Click() End Sub

  • VBSでファイル移動する部分を足したい

    取り敢えずスクリプト的には動いている (不要部分とか書き換え途中のままで動作問題なくても間違っている部分が有ると思います  誤動作までは至らないので放置しているというだけです) のですがそのスクリプトに一部の通過ファイルを所定の位置に移動させたいと思います。 ソースの目的と理屈はTSファイルをBATからTSファイルをVBSに送りaviutilに処理させると言う物です。 最終的にTSファイルだけを移動させる形にしたいと言う感じです。 On Error Resume Next Set Args = WScript.Arguments Const ForReading = 1 '************TSファイル関連の設定************* ' テンポラリパス Const TMP_FOLDER = "E:\tsENC\mp4\" ' エンコードしたデータを出力するフォルダ(最後の文字は"\") Const OUTPUT_FOLDER = "E:\tsENC\mp4\" '*************ツール関連の所在************* ' 出力プラグイン番号(メニューの一番上が0) Const OUTPUT_PLUGIN = 0 ' 出力ファイルの拡張子 Const OUTPUT_EXT = ".mp4" ' BonTsDemuxのフルパス Const BonTsDemux_PATH = "E:\aviutil\aviutl99i8\BonTsDemux.exe" ' mmeのフルパス Const mme_PATH = "E:\aviutil\AVIUTIL\mme.exe" ' AviUtlのフルパス Const AVIUTL_PATH = "E:\aviutil\AVIUTIL\aviutl.exe" ' AviUtl Controlを置いてあるフォルダ(最後の文字は"\") Const AUC_FOLDER = "E:\aviutil\AVIUTIL\" ' = スクリプトと同じフォルダ Dim WHSHell, oExec, Fs Set WSHShell = WScript.CreateObject("WScript.Shell") Set Fs = CreateObject("Scripting.FileSystemObject") Function Auc(command, arg) Auc = WSHShell.Run("""" & AUC_FOLDER & "auc_" & command & ".exe"" " & arg, 2, True) End Function Dim i, tmp, tmpm2v, tmpwav, tmpgl, output, pid, hwnd ' AviUtlを起動 hwnd = Auc("exec", """" & AVIUTL_PATH & """") If hwnd = 0 Then Call WScript.Quit(-1) End if For i=0 to Args.Count - 1 tmp = TMP_FOLDER & Fs.GetBaseName(Args(i)) tmpm2v = tmp & ".m2v" tmpwav = tmp & ".wav" tmpgl = tmp & ".gl" output = OUTPUT_FOLDER & Fs.GetBaseName(Args(i)) & OUTPUT_EXT ' TSファイルを分割 Call WSHShell.Run("""" & BonTsDemux_PATH & """" & " -i """ & Args(i) & """ -o """ & tmp & """ -delay 167 -start -quit", 0, True) ' glファイルを作成 Call WSHShell.Run("""" & mme_PATH & """ -g -q """ & tmpm2v & """", 0, True) ' M2Vファイルを開く Call Auc("open", CStr(hwnd) & " """ & tmpm2v & """") Call WScript.Sleep(200) ' WAVファイルを開く Call Auc("audioadd", CStr(hwnd) & " """ & tmpwav & """") ' プロファイルを設定する Call Auc("setprof", CStr(hwnd) & " " & CStr(PROFILE)) Call WScript.Sleep(200) ' 出力プラグインから出力する Call Auc("plugbatch", CStr(hwnd) & " " & CStr(OUTPUT_PLUGIN) & " """ & output & """") Call WScript.Sleep(200) ' ファイルを閉じる Call Auc("close", CStr(hwnd)) ' テンポラリファイルを削除する Call Fs.Delete(tmpm2v) Call Fs.Delete(tmpwav) Call Fs.Delete(tmpgl) Next Dim Fname Dim Fname2 Dim FSO Set Fname = WScript.Arguments If Fname.Count = 0 Then WScript.Echo "ファイルをドラッグしてください。" WScript.Quit End If 'Set FSO = CreateObject("Scripting.FileSystemObject") Fname2 = FSO.GetFile(Fname(0)).Path FSO.MoveFile Fname2, move & FSO.GetFileName(Fname(0)) Set Fname = Nothing Set FSO = Nothing ' スクリプトで起動したAviUtlを終了する Call Auc("exit", CStr(hwnd))

専門家に質問してみよう