C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.92541 の関連記事表示

<< 0 >>
■92541  Re[1]: xlsmファイルをxlsxファイルに変換したい
□投稿者/ 魔界の仮面弁士 -(2019/10/03(Thu) 14:08:18)
    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 テンプレート)
記事No.92540 のレス /過去ログ160より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -