| ■No92540 (佐藤 さん) に返信 > 表題の件、
質問内容を見る限りでは、分類は [.NET 全般] ではなく、[VBScript] なのでは? とりあえず VBScript 前提で回答します。
> とあるファイルに入っているxlsmファイルを、 ファイルにファイルが入っている…?
「とあるフォルダに入っている .xlsm ファイル」の間違いでしょうか。 あるいは、「.zip ファイル内に入っている .xlsm ファイル」のような意味?
とりあえず『とある .xlsm ファイル』と読み替えて回答します。
> 全てxlsxファイルに変換したいです。 .xlsm は「Excel マクロ有効ブック」 .xlsx は「Excel ブック」と呼ばれますが、 後者には VBA コードや Excel 4.0 マクロシートを含めることができません。
.xlsb であれば含められます。
> 76エラーが出ます。
実行時エラー 76 は、「パスが見つかりません。」の意味ですね。 どの行で発生しているかは確認済みでしょうか? 指定したフルパスが間違っていないか、再確認してみてください。
また、ファイルアクセスである以上、76 以外のエラーとなる可能性もあります。
たとえば Excel で "Book1.xlsm" を開く場合、同じ場所に 隠しファイル "~$Book1.xlsm" が同時に生成されることになりますが、 列挙タイミングによっては、これも For Each で拾われてしまう可能性があり、 これを Excel 本体で開こうとすると、不正形式エラー(1004 など)となりえます。 そのほか、 ・アクセス権が無い ・該当ファイルが別のプログラム(Excelとか)で開かれていた ・セキュリティソフトによる監査で FileSystemObject の処理が阻害された などの可能性もあります。On Error Resume Next を併用して判定しましょう。
> ex.Application.DisplayAlerts = False これは ex.DisplayAlerts = False だけで構いません。 Application プロパティは Application オブジェクトを返すので、 ex.Application.Application.Application.Application.Application.DisplayAlerts = False などとも書けますが、明らかに冗長ですよね。
> ex.Visible = False プログラムが完成するまでは True にしておいた方が確認しやすいですよ。
> Set bk = ex.Workbooks.Open(gf & "\" & f.Name) 上記は Set bk = ex.Workbooks.Open(so.BuildPath(gf.Path, f.Name)) とすべきです。
スクリプトの配置先によっては、gf がルートフォルダとなる可能性が あるわけですが、もしも gf が "D:\" フォルダーを参照していた場合、 前者は "D:\\Book1.xlsm" 後者は "D:\Book1.xlsm" というパスになるという違いがあります。 \\ と連ねても動いてしまうケースもありますが、正しい指定では無いですね。
> bk.SaveAs gf &"\"&so.GetBaseName(f.Name) &".xlsx", 51 こちらのパス指定も、 bk.SaveAs so.BuildPath(gf.Path, so.GetBaseName(f.Name) & ".xlsx"), 51 が良いでしょう。 最後の引数の 51 は .xlsx 指定の意味ですね。
Const xlExcel12 = 50 '.xlsb(Excel バイナリブック) Const xlOpenXMLWorkbook = 51 '.xlsx(Excel ブック) Const xlOpenXMLWorkbookMacroEnabled = 52 '.xlsm(Excel マクロ有効ブック) Const xlOpenXMLTemplateMacroEnabled = 53 '.xlsm(Excel マクロ有効テンプレート) Const xlOpenXMLTemplate = 54 '.xltx(Excel テンプレート) |