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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

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

Q&A

解決済

4回答

10046閲覧

vba デスクトップ上 セルの値をファイル名にして保存

omotti

総合スコア14

VBA

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

0グッド

0クリップ

投稿2018/02/15 08:44

前提・実現したいこと

「保存」ボタンをクリックすると、自動で該当セルの日付が名前になり、
保存前のブックは削除するようにしたいです。(該当のコードにはまだ作っていません。)

ブックは常にデスクトップに置いてあります。
自分以外の人も各PCで使用するので、パスを固定できません。

ネットを参考に、以下のコードを作りましたがエラーになります。

全く違うやり方でも構いません。
宜しくお願い致します。

発生している問題・エラーメッセージ

実行時エラー 1004 ファイル’C:¥~’(パスとファイル名)にアクセスできません。 次のいずれかの理由が考えられます。 ファイル名またはパスが存在しません。 ファイルが他のプログラムによって使用されています。 保存しようとしているブックと同じ名前のブックが現在開かれています。

該当のソースコード

Sub 保存() Dim Path As String, WSH As Variant Set WSH = CreateObject("WScript.Shell") Path = WSH.SpecialFolders("Desktop") & "\" ThisWorkbook.SaveAs Path & Format(Worksheets("入金").Range("A6"), "yyyy/m/d") & ".xlsm" Set WSH = Nothing End Sub

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ファイル名の作成

ファイル名に使用する文字の問題については他の方々からも指摘がある通りです。
/などの禁則文字を使用しなければ保存できるようになると思います。

また、フォルダ名の取得方法についてExcelVBAerさんからもアドバイスがありますが、後に元ファイルを削除する予定があるのならブックからパスを取得した方が確実だと思います。

例えばC:\Work\test.xlsmの場合、
・WorkBook.Name ⇒ブック名(test.xlsm)
・WorkBook.Path ⇒パス名(C:\Work)
・WorkBook.FullFileName ⇒フルパス名(C:\Work\test.xlsm)
といった具合に取得できます。

新ファイルのフルパスは「元ファイルのパス名」と「セル値から作成したファイル名」を組み合わせて作り出すことになります。
これは自分でがんばって作りあげてもいいのですが、FileSystemObjectのBuildPathを利用した方が確実です。
パスの最後に\がついているか?など気にせずにフルパスを作成できます。

元ファイルの削除

元ファイルの削除についてですが、SaveAsで別名保存できた場合、開いているブックも元ブックから新ブックに変更され、この時点で元ブックは解放された状態となっています。
この状態ならsaziさんご紹介のサイトのように「読み取り専用」に変更しなくてもKillすることができると思います。

開いているブックを別名保存せずに削除したい場合は「読み取り専用」にすることで削除できますが、ブックが開かれて見えているのに実態のファイルは存在しなくなっているという、いかにも気持ちの悪い状態になりますのでオススメはしません。

サンプル

Sub Sample() 'ファイル操作用にFileSystemObjectを作成 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") 'ブックの格納 Dim wbOld As Workbook 'ブック(元) Set wbOld = ThisWorkbook '元ブックからパスを取得 Dim strPath As String strPath = wbOld.Path 'ファイル名 Dim strOldFile As String 'ファイル名(元) Dim strNewFile As String 'ファイル名(新) '元ファイル名はブックから取得 strOldFile = wbOld.Name '新ファイル名はセル値から作成 strNewFile = Format(wbOld.Worksheets("入金").Cells(6, "A"), "yyyymmdd") & ".xlsm" Dim strOldFullPath As String 'フルパス(元) Dim strNewFullPath As String 'フルパス(新) strOldFullPath = wbOld.FullName '元ブックからフルパスを取得 strNewFullPath = fso.BuildPath(strPath, strNewFile) '新ファイルのフルパスはパスとセル値から作成 '新旧ファイル名の確認 'MsgBox strOldFullPath & vbCr & "↓" & vbcr & strNewFullPath '※新旧同一ファイル名になる場合はここらで中断させた方がいいです。 '元ブックを新ブック名で別名保存 wbOld.SaveAs strNewFullPath '元ブックを削除 Kill strOldFullPath End Sub

参考になれば幸いです。

投稿2018/02/16 06:24

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2018/02/16 06:29

無事解決されていたようで、なによりです。 本回答も予備知識としてご参考ください。
omotti

2018/02/16 07:04

ご丁寧にありがとうございます。 アドバイスを元に考えた結果、Application.Dialogs(xlDialogSaveAs).Show Arg1:= ~ を使い、いったん保存画面を出すことで落ち着きましたが、 jawaさんのコードでも作ってみて使い比べてみます。 ありがとうございました。
guest

0

"yyyy/m/d" → "yyyymmdd"

補足ながら、デスクトップのパスを下記で取得してますが、
WSH.SpecialFolders("Desktop")
たまたまデスクトップに置いてあるだけで、
本来の意味が「自ブックがある階層」という事でしたら、
ThisWorkBook.Path で取得できます。

投稿2018/02/16 03:22

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omotti

2018/02/16 05:44

ありがとうございます。 その通りですね。難しく考えてしまっていました。
guest

0

ファイル名は他の方も言われているように、スラッシュ「/」は問題だと思います。

それ以外に同じ日に開いて保存したらどうします?
その場合は自分自身を更新することになるし、保存前を消すなんてことはできないですよね。

それらを条件により対応したとして、保存前のファイルというのは、開いている自身のブックだと思いますので、以下参考に。
[Excel][VBA]自分自身(エクセルファイル)を削除するマクロ

でも消しちゃうと怖いし、どこかにバックアップの方が良いかと思いますけど。

投稿2018/02/15 09:12

編集2018/02/15 09:17
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omotti

2018/02/16 05:54

ありがとうございます。 同じ日付の場合は上書きで保存します。 変更前のファイルは不要なので、削除して問題ありません。
guest

0

ベストアンサー

Workbook.Close メソッド (Excel) - MSDN

↑これでできるんじゃないすか?

後、ファイル名に「/」は使えないはずなので日付のフォーマットは再考の必要があります。

投稿2018/02/15 08:53

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omotti

2018/02/16 05:39

ありがとうございます。 無事動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問