質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • VBA

    1777questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBAで連続してブックを保存、前ブックではなく元ブックから作成・保存したい

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 428

JoeJack

score 17

 実現したいこと

エクセルマクロブック(.xlsm)を元ブックにして複数サブフォルダ内画像を貼り付けてサブフォルダ名を付けて保存する複数ブックを作成したいが、前ブックの上書きの形式でブックが作成されてしまう(画像が上乗せされていくので前実行の画像が見えてしまう)。

ThisWorkbook.SaveCopyAs Filename:=picFolderPath2 & pic_split(2) & "xlsx" '参考, FileFormat:=xlOpenXMLWorkbook

 やってみたこと

saveAsメソッドではなく上記のようにsaveCopyAsメソッドを使う。
ただ、保存されますが開くことは出来ず(ファイル形式、ファイル拡張子が正しくないmsgboxが立ち上がる)、上書きされているのか確認出来ません。
"xlsx"を元ブックと同じ"xlsm"に換えるとエクセルアイコンが白紙の「名前.xlsm」ファイルになり開けません。

何か良い方法はありませんか?
それともworkbookを新規に作成するところから始めないといけないでしょうか?

よろしくお願いします。

 追記

"xlsm"のドットが抜けていて".xlsm"で正常にコピー保存されました。但し、コピーの内容もsaveAsと変わらず上書きされています。そこで

Set a_sheet = Thisworkbook.Worksheets(1)

中略

ThisWorkbook.SaveCopyAs Filename:=picFolderPath2 & pic_split(2) & ".xlsm"
ThisWorkbook.SaveAs filename:=picFolderPath2 & pic_split(2), FileFormat:=xlOpenXMLWorkbook
Set FSO = CreateObject("Scripting.FileSystemObject")
Set folderObject = FSO.getfolder(picFolderPath2)
For Each new_wbs In FSO.getfolder(folderObject).Files
set new_wb = Workbooks.Open(new_wbs)
if new_wb.Name = pic_split(2) then   'ここはざっくりです、試す環境にないので'
Set a_sheet = new_wb.Worksheets(1)

中略

new_wb.save


こんな感じでテンプブックシートを直に開かずに一旦先に保存してから画像転記を実行したらよいのでは?
と考えました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

0

質問を良く理解していませんが、xlsmのシートをテンプレートにして新しくブックを作成、そのブックに画像を貼り付けて保存、という流れでしょうか。
こんな感じのコードでどうでしょうか。

Dim thisbook As Workbook
Dim newbook As Workbook

' xlsx形式で保存するときのメッセージ抑制
Application.DisplayAlerts = False

' 元のxlsmを保持
Set thisbook = ActiveWorkbook

' 全シートをコピーして新ブックを作る
thisbook.Worksheets.Copy

' アクティブブックが新ブックになっているので保持
Set newbook = ActiveWorkbook

' 新ブックを編集
'画像貼り付け

' 名前を付けて保存&閉じる
newbook.SaveAs picFolderPath2 & pic_split(2) & "xlsx", xlOpenXMLWorkbook
newbook.Close

' xlsx形式で保存するときのメッセージ回復
Application.DisplayAlerts = True

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/07 09:46

    返事が遅くなりました。
    ご回答のやり方が今まで考えて実行して解決した私のとのほぼ同じ
    でした。先に読んでいればよかったと残念に思っています。
    何はともあれ、ありがとうございます。

    キャンセル

0

SaveCopyAsで保存したブックにはマクロが入っているので、マクロなしブックの形式で保存するとダイアログが出ているんだと思います。
こちらのように、シートだけコピーするようにしては?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 10:33

    ご回答ありがとうございます。有益な情報ありがとうございます。あとで読んでみたいと思います。取り急ぎお礼いたします。

    キャンセル

0

テンプレート形式(マクロ付?)だと、開いた瞬間に別ファイルになるので、上書きになることがありません。
敢えて選択のなら上書きになりますが。
その辺も考慮して上手く使えればいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 10:32

    ご回答ありがとうございます。そう始めは考えていましたが、うまくいきません。初心者ですので兎にも角にも動くコードを書くしかありません。

    キャンセル

  • 2018/07/05 13:30

    ん。テンプレートならSaveAsで保存しちゃえばよくよくないですか?

    キャンセル

  • 2018/07/05 15:16

    テンプレートというのは拡張子が"xltx"のコピー用のファイルなんですね。テンプレート形式とはこの別ファイルのことではなく、テンプレートとして使っているからテンプレート形式だと勝手に判断しておりました。初心者ですのでご容赦を。帰ったら早速設定したいと思います。貴重なご意見ありがとうございます、助かります。

    キャンセル

0

まず、「xlsx」に[.]が付いてないですけど、pic_split(2)に付いてます?

次に、SaveCopyAsってコピーを保存するから、拡張子を変えるというのはどうかと。
むしろ、正しく開ける可能性の方が少ないでしょう。
(なぜ拡張子を戻しても開けないのかは不明ですが)

SaveCopyAs で xlsm にしないのは、恐らくマクロを残したくないからでしょうか?

そうなると、手順としては、
1.「SaveCopyAs」で xlsm として一旦保存
2.保存した xlsm を開き直して、SaveAs で xlsx として保存
3.保存した xlsm を削除
という流れになるのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/05 10:30 編集

    ご回答ありがとうございます。ドット付いていました、この質問を書く際に消えてしまったのかもしれません。ただ、"xlsm"のエラーはドットが抜けていたためでした。修正し正常に保存されましたが、問題解決には至りませんでした。追記で対策を考えましたが、セーブの段階でクリア出来るほうが簡単でいいので教示されました手順も書いてみたいと思います。

    キャンセル

  • 2018/07/05 10:48

    たぶんお分かりだとは思いますが念の為、
    「カンマ」=[,]
    「ドット」=[.]
    となります。
    ※余談ですが、CSV は カンマ セパレート バリュー の略で、カンマで区ったデータ形式、という意味です。(TSVはタブ区切りです)

    キャンセル

  • 2018/07/05 11:28

    あ、そうですww 今カンマ区切りの複数の整数に紐づけて転記するコードを調べていてカンマ頭になってまして・・・ありがとうございます。

    キャンセル

0

自己解決法:

①元ブックシートを新ブックにコピー
thisworkbook.Worksheets.Copy

②新ブックシートをアクティブして画像貼付け等作業実行

③新ブック、元ブック保存

後から考えるとなんと単純かと費やした時間を考えると空しくなるますが、
一応解決法が見つかりましたのでよかったです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1777questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。