Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
xlsmをxlsx(マクロ無し)で名前を付けて保存
投稿日時: 18/04/21 16:01:32
投稿者: maruco33

またまたお世話になります。
作業を終えたxlsm(マクロ有効ブック)を
以下のように、マクロ無しで保存するというコードを作成しました。
 
実行するとダイアログボックスには、
ファイル名「テスト.xlsx」
ファイルの種類「xlsxファイル」として表示され、OKをクリックすると
エラーもなく保存されるのですが、一旦エクセルを閉じて、保存されたファイルを見てみると
拡張子は.xlsmのままで、マクロも存在したままです。
 
sub Nname()
 
Dim Fname As String, Sj As Variant
 
Fname = "テスト"
Sj = Application.GetSaveAsFilename(Fname, "xlsxファイル,*.xlsx")
 
If Sj <> "False" Then
    ActiveWorkbook.SaveAs Filename:=Fname
    
End If
End Sub
 
エラー表示が出るわけでもないので、なにがどう悪いのか見当もつきません。
 
どうぞご教授ください。よろしくお願いいたします。

回答
投稿日時: 18/04/21 16:31:22
投稿者: もこな2

マクロの記録を使って、ファイルを保存してみるとヒントになることがわかるかもですね。
 
得られたコードの「FileFormat」という引数に注目してみてはどうでしょうか?

回答
投稿日時: 18/04/21 18:15:47
投稿者: WinArrow
投稿者のウェブサイトに移動

>Sj = Application.GetSaveAsFilename(Fname, "xlsxファイル,*.xlsx")
ここで取得した変数:sjを使って、保存するのではないでしょうか?
sjにはフルパスが入っている・・・だから
>ActiveWorkbook.SaveAs Filename:=Fname
は、おかしい。
 
FileFormatの指定もあるけど・・・

回答
投稿日時: 18/04/21 18:51:19
投稿者: もこな2

あぁほんとだ・・・

引用:
ActiveWorkbook.SaveAs Filename:=Fname
はおかしいですね。
 
直したら「xlsx」はデフォルトでしょうから、FileFormatは省略してもいけるかも。
 
ちょっと気になるのは、xlsxで保存したら、そのブックのマクロは保存されないことに
なりますけど、そもそも実行したいマクロのコードは別ブックに記述しているんでしょうか?

回答
投稿日時: 18/04/22 11:45:05
投稿者: sy

もこな2 さんの引用:
直したら「xlsx」はデフォルトでしょうから、FileFormatは省略してもいけるかも。
無理と思います。
 
maruco33 さんの引用:
作業を終えたxlsm(マクロ有効ブック)を
とあるので、xlsmがデフォルトになってますから、FileFormatの指定が無いとエラーになると思います。
 
ActiveWorkbook.SaveAs Filename:=Fname
は私もおかしいと思います。
 
何の為に
Sj = Application.GetSaveAsFilename(Fname, "xlsxファイル,*.xlsx")
として、Sj にフルパスを取得してるか考えてみて下さい。

回答
投稿日時: 18/04/22 11:47:38
投稿者: sy

もこな2 さんの引用:
ちょっと気になるのは、xlsxで保存したら、そのブックのマクロは保存されないことに
なりますけど、そもそも実行したいマクロのコードは別ブックに記述しているんでしょうか?

SaveAs(名前を付けて保存)なので、元のxlsmブックはそのままと思いますよ。

回答
投稿日時: 18/04/22 13:22:10
投稿者: WinArrow
投稿者のウェブサイトに移動

参考コード
  
Sub test()
     With ThisWorkbook
         .Save  '@
         Application.DisplayAlerts = False 'A
         .SaveAs Filename:=Replace(.FullName, "xlsm", "xlsx"), FileFormat:=xlOpenXMLWorkbook 'A
         Application.DisplayAlerts = True 'C
     End With
 End Sub
   
 @:作業結果をxlsmブックに保存・・・Bでxlsxブックには、作業結果が保存されるが
  xlsmブックにも保存する必要があれば、実行する
  B実行後、xlsmには上書き保存できなくなります。
  
A:拡張子をxlsxに変更するためのアナウンスを非表示にする
B:xlsxブックに保存する
C:Aを基に戻す
  
 あくまでも参考ということで
xlsxファイル名のところは、ダイアログで取得するならば、
カスタマイズしてください。

回答
投稿日時: 18/04/22 14:39:01
投稿者: もこな2

sy さんの引用:
xlsmがデフォルトになってますから、FileFormatの指定が無いとエラーになると思います。
あれっ、デフォルトの保存形式ってシステム依存じゃないですっけ?
ブックに依存だったら、確かに要りそうですね。失礼しました。
 
sy さんの引用:
SaveAs(名前を付けて保存)なので、元のxlsmブックはそのままと思いますよ。
上手い表現が思いつかないんですが、その作業したブックにマクロがあってそれを使って作業したなら次からはそのマクロが無い状態になるので、それでいいのか気になっていて、自分ならマクロ付きブックから”別途”マクロを除いたブックを作りたいだけなら、SaveCopyAsメソッドを使うような気がします。
ただ、そういうことを気にする心配がない(テンプレートみたいなものから結果だけ出力するようなもの?)なら考える必要もないのでどっちなのかなと・・・・

回答
投稿日時: 18/04/22 15:25:43
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
あれっ、デフォルトの保存形式ってシステム依存じゃないですっけ?
ブックに依存だったら、確かに要りそうですね。失礼しました。
 

 
ブック依存に限りません。
 
新しいブック(Book1のような拡張子なし)を保存するときは、Excelバージョン依存
既存のブックを名前を付けて保存するときは、ブック依存
のようです。

回答
投稿日時: 18/04/22 17:34:42
投稿者: sy

もこな2 さんの引用:
あれっ、デフォルトの保存形式ってシステム依存じゃないですっけ?
こちらが参考になれば。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/workbook-saveas-method-excel
引用:既存のファイルでは、指定された最後のファイル形式が既定のファイル形式です。新しいファイルでは、現在使用されている Excel のバージョンでのファイル形式が既定のファイル形式です。
と言う事ですので、保存されたブックではそのブックのファイル形式がデフォルトになるとあります。
新規でまだ一度も保存されていないファイルは、EXCELのファイル→オプション→保存で設定する既定の拡張子になるみたいですね。
 
もこな2 さんの引用:
自分ならマクロ付きブックから”別途”マクロを除いたブックを作りたいだけなら、SaveCopyAsメソッドを使うような気がします。
すいません。私はSaveCopyAsを実務で使った事が無いので、殆ど何も知らないんですけど、SaveCopyAsって拡張子を変更しても使用できるんですか?
今試してみたら、出来たコピーブックは「ファイル拡張子が一致しない」とエラーメッセージが出て開く事ができません。
 

回答
投稿日時: 18/04/22 17:57:57
投稿者: WinArrow
投稿者のウェブサイトに移動

>SaveCopyAsって拡張子を変更しても使用できるんですか?
 
いいえ、できないと思います。

回答
投稿日時: 18/04/22 18:25:38
投稿者: sy

WinArrow さんの引用:
いいえ、できないと思います。
やっぱり出来ないんですね。
現状VBAで拡張子を変更(ファイルフォーマットの変更を要するもの)して複製するのはSaveAs以外の方法は無いと言う認識で良さそうですね。
(APIを使えば出来るかは分かりませんが?)
ありがとうございます。

回答
投稿日時: 18/04/22 18:43:09
投稿者: もこな2

sy さんの引用:
WinArrow さんの引用:
いいえ、できないと思います。
やっぱり出来ないんですね。
現状VBAで拡張子を変更(ファイルフォーマットの変更を要するもの)して複製するのはSaveAs以外の方法は無いと言う認識で良さそうですね。
(APIを使えば出来るかは分かりませんが?)
ありがとうございます。

そっか〜度々失礼しました。(お休みモードでテストしてないのバレバレですね)
もしxlsmとxlsxの両方を保存したければ、やはりSaveAsメソッドで、Filename、FileFormatまできちんと指定した上で保存するのが手っ取り早いってことですね。

回答
投稿日時: 18/04/22 20:23:51
投稿者: WinArrow
投稿者のウェブサイトに移動

sy さんの引用:
WinArrow さんの引用:
いいえ、できないと思います。
やっぱり出来ないんですね。
現状VBAで拡張子を変更(ファイルフォーマットの変更を要するもの)して複製するのはSaveAs以外の方法は無いと言う認識で良さそうですね。
(APIを使えば出来るかは分かりませんが?)
ありがとうございます。

 
私の 18/04/22 13:22:10 のレスが参考になりませんか?

回答
投稿日時: 18/04/22 21:27:46
投稿者: sy

WinArrow さんの引用:
私の 18/04/22 13:22:10 のレスが参考になりませんか?
?
すいません。ちょっと上記の意味が分かりませんでした。
 
上記のレスでも拡張子変換はSaveAsしか使ってないので、
引用:
現状VBAで拡張子を変更(ファイルフォーマットの変更を要するもの)して複製するのはSaveAs以外の方法は無いと言う認識で良さそうですね。
と言う事の肯定と言う意味でしょうか?

回答
投稿日時: 18/04/22 21:51:30
投稿者: WinArrow
投稿者のウェブサイトに移動

sy さんの引用:
WinArrow さんの引用:
私の 18/04/22 13:22:10 のレスが参考になりませんか?
?
すいません。ちょっと上記の意味が分かりませんでした。
 
上記のレスでも拡張子変換はSaveAsしか使ってないので、
引用:
現状VBAで拡張子を変更(ファイルフォーマットの変更を要するもの)して複製するのはSaveAs以外の方法は無いと言う認識で良さそうですね。
と言う事の肯定と言う意味でしょうか?

 
いいえ、
SaveAsメソッドで、Fileformatを指定すればできるということです。
その時、マクロを削除した状態で、ファイルを保存してもよいか?
という警告が表示されます。その警告を無視するために
Application.DisplayArertを表示しないように制御しています。

回答
投稿日時: 18/04/22 22:55:05
投稿者: sy

WinArrow さんの引用:
SaveAsメソッドで、Fileformatを指定すればできるということです。

あっいえ、私のレスで
SaveAs以外の方法は無い
と言ってるように、SaveAsで出来る事は初めから存じています。
 
SaveCopyAsは使った事が無かったので、「SaveAs以外にも出来る方法があるの?」と一瞬思っただけです。
 
その後、WinArrowさんの「18/04/22 17:57:57」のレスでやっぱりSaveAs以外では出来ないと言うことを再認識できたと言う事です。

回答
投稿日時: 18/04/23 17:12:16
投稿者: WinArrow
投稿者のウェブサイトに移動

syさん
  
 >API云々
なんて文章のところで勘違いしていました。
  
大変失礼しました。

回答
投稿日時: 18/04/25 10:23:51
投稿者: WinArrow
投稿者のウェブサイトに移動

>SaveCopyAsについて
 
SaveCopyASは、クローンを作成するのには便利なメソッドです。
 
SaveAsとの操作上の大きな違い
 
SaveAsでは、
Windows(ActiveWorkBook.Name).Captionが、保存後の名前になってしまいます。
勿論、xlsmをxlsxで保存した後では、マクロも消えてしまいます。
テスト時など、事前に上書き保存しておかないと、後で「あれっ?」ってことになりかねない。
 
SaveCopyAsは
Windows(ActiveWorkBook.Name).Captionは変更されません。
また、便利かどうかはわかりませんが、
既存のファイル名と同じ名前を指定した場合、
「上書き保存してもよいか?」メッセージが表示されません。
 

投稿日時: 18/05/02 16:11:35
投稿者: maruco33

最初の質問から返答が遅れてしまい申し訳ありません。
私のほうでGetSaveAsFilenameとSaveAsメソッドを混同していたようです。
 
いろいろな方々からの回答やの参考コードによってなんとか解決できそうです。
 
一つの作業をするだけで、こんなにもいろいろな方々の回答を得られるとは思いませんでした
同時に私の知識の少なさに情けなさを感じました。
もっと精進いたします。これをもって一旦解決としたいと思います。
ありがとうございました。