- ベストアンサー
excelマクロ、任意セルの値で名前を付けて任意のフォルダに保存
マクロの初心者ですが、どうか教えてください。 テンプレートブックを名前を付けて保存するマクロで 苦戦しております。 ・ダイアログを必ず開く ・その時の保存先はz:\あああ ・ブック名はアクティブシートの任意のセルA1 --------------------------------------------- Application.Dialogs(xlDialogSaveAs).Show _ Arg1:=Range("A1").Value ここまではたどり着けたのですが、ダイアログが 当初のテンプレートブックの保存場所が開いてしまいます。 どうぞよろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ふぅむ・・・ なんか説明がマズイようで、申し訳ない まず、保存の部分は値さえ取れればOKとしまして、ダイアログにデフォルトセットされる部分についてのみです デフォルトのフォルダを "z:\■■受注書" とします(セルZ1にセットしてある) デフォルトファイル名を "いいい.xls" とします(セルA1にセットしてある/ "いいい"のみでもOK) MySavePath = Application.GetSaveAsFilename(Range("Z1").Value & "\" & Range("A1").Value, "Excel ファイル (*.xls), *.xls") GetSaveAsFilenameに入れる値は、最初 "z:\■■受注書\いいい.xls" と言う事になります 本来保存したいところではないので、勘違いしますが、あくまでダイアログのデフォルトにセットする引数なので、問題ありません 上手く行かないようでしたら これを試して下さい MySavePath = Application.GetSaveAsFilename("z:\■■受注書\いいい", "Excel ファイル (*.xls), *.xls") どこを Range("A1").Value と置き換えるかは・・・ まぁ見たままです 文字の連結には『&』を使います Range("A1").Value = hogehoge としたのは、値がセットされていない事を考慮してです デフォルトセットする値を取得するセルに、すでにフォルダ名やファイル名がセットされているのであれば、不要な部分です コメントにして下さい これで上手く行くと良いですがねぇ
その他の回答 (5)
- pulsa
- ベストアンサー率57% (34/59)
まず一個訂正です If MySavePath <> False Then ’× If MySavePath <> "False" Then’○ キャンセルを選択した際に返るのは文字の"False" Dim MySavePath As String としたので当然と言えば当然ですが、うっかり写しミスです すいません さて、補足の件です >ダイアログは指定したフォルダ z:\あああ で開くのですが、ダイアログのファイル名記入欄が空白 また >セルA1にz:\あああ\と記入されてしまいます との事なので ここ Range("A1").Value = "z:\あああ"'ホントは… ↓こうなってませんか? Range("A1").Value = "z:\あああ\" 最後『\』 あるいは、セルA1の値がすでに "z:\あああ\" だとか? No.3に書いた通り、『\』で閉めると、指定はフォルダ扱いとなるので、ファイル名は指定されていない事になります ダイアログにデフォルトセットするフォルダが『z:\あああ』なら、その先にファイル名を記入する必要があります (z:\あああ に あああ.xls として保存するのをデフォルトセットするなら "z:\あああ\あああ") フォルダ名とファイル名がわからなくなるなら、拡張子(.xls)まで、記入してしまっても問題ありません こんな具合 Range("A1").Value = "z:\あああ\あああ.xls" ダメなってそんな^^; たぶん、ちょっと勘違いしてるだけ("\"関連)だと思いますが、まぁ後に見る人の為って事でクドさは目をつぶって下さい
補足
すみません。うまく行きませんでした。 もう一度私のやりたいことを整理させていただきます。 ・セルA1の値をファイル名にして (A1が いいい ならば、ファイル名は いいい.xls と自動取得) ・任意の場所に (z:\あああ) ・ダイアログで確認しながら保存をしたい (z:\あああ の中にさらに細かく分かれたフォルダが あるのでそこを目視確認しながら) こういうことなのですが、お互い意図してるところは 同じでしょうか? ---------------------------------------- Range("Z1").Value = "z:\■■受注書" 'Range("Z1").Value = "z:\■■受注書" ---------------------------------------- この2パターンで実験したのですが、 上段の場合: セルA1に z:\■■受注書 と記載されてしまう。 下段の場合: ファイル名はセルA1の いいい.xls でダイアログに 反映されるのですが、今度はフォルダ z:\■■受注書 が 開かず、カレントフォルダが開く。 こんな感じになっております。何度もすみませんが よろしくお願いいたします。
- pulsa
- ベストアンサー率57% (34/59)
>ただ、名前付け保存ダイアログを開いて、「キャンセル」 ボタンを押すと、「False」が表示されます。 これを出さなくするには、何を付け足せばいいでしょうか? キャンセルを押したときの、MsgBoxの動作を言っているのかな? 元々コレは確認用なので、動作が確認できれば不要な物です コメントにしてしまえばOKでしょう そのまま見たいなら、If文の中に入れればいいと思うけど、それすら判らないのかな…? >>データシートをBefore After を指定せずにコピー >データシートだけの乗った新規Bookを今回のコードを使って保存 これはどうやるのでしょうか? Copyのヘルプをご覧下さい シートに対してこのメソッドを行った場合、新規Bookが作成され、そこにコピーしたシートが一つ入っている状態になります コレを保存すれば、マクロが乗っていないファイルの出来上がり♪ 手動でシートのタブ右クリ→移動またはコピー→新しいブック とやる動作をマクロ的にやったのと変わらないので、マクロの記憶を取ってみればすぐわかると思います シートコピー~名前を付けて保存 までを、マクロの記憶を取りながらやってみて下さい どこに今回のヤツを実装するかは、相当アレじゃない限りすぐわかると思います
補足
お返事、遅くなってすみません。 一個前にいただいた回答に「出来ました!」と書きましたが 勘違いでした。うまくいっておりませんでした。 ダイアログは指定したフォルダ z:\あああ で開くのですが、 ダイアログのファイル名記入欄が空白で表示されます。また、 セルA1にz:\あああ\と記入されてしまいます。 ダメな私でもわかるようにご説明いただければ幸甚でございます。
- pulsa
- ベストアンサー率57% (34/59)
示されたコードのデフォルトフォルダが上手くセットできないのは、通常の名前を付けて保存という動作は、保存された事のあるファイルは、その保存先がデフォルトになる と言う、エクセルの仕様です 試しに、『保存先フォルダの違うエクセルファイル』を複数開いて、名前を付けて保存(保存はしなくて良い)を見てもらえば分かると思う (そのファイルごとのデフォルトフォルダね) あとは、新規Bookを名前を付けて保存するときは、マイドキュメントがデフォルトだけど、一旦別なフォルダに保存すると、次からはそこがデフォルトセットされることからも、分かるね 代わりにGetSaveAsFilenameを使っては如何でしょ? これは、『ユーザが「名前を付けて保存」のような操作』を行う要領で、フルパスのファイル名を設定してもらう為のダイアログを表示します 実際には保存されませんので、受け取ったフルパスで、別途マクロ的に保存(SaveAsメソッド)する必要がありますが、通常の名前を付けて保存と違って、デフォルトの表示フォルダを任意に指定できます コードだとこんなです Dim MySavePath As String Range("A1").Value = "z:\あああ"'ホントは要らないだろうけどMsgBoxとの対比用 MySavePath = Application.GetSaveAsFilename(Range("A1").Value, "Excel ファイル (*.xls), *.xls") MsgBox MySavePath If MySavePath <> False Then ThisWorkbook.SaveAs MySavePath 'テンプレBookが違うならそのBookを指定 End If (XP/Excel2003) 因みにファイル名を指定しないときは"\"で閉めるとフォルダだけ指定できる また、指定したフォルダが存在しないときはマイドキュメントがデフォルトセットされる ネットだとこの辺かな~? http://www.big.or.jp/~seto/vbaref/vbaref14.htm あと、余計なお世話かも知れないけど、この仕様だと「マクロの乗ったファイルがどんどん増える」よ? データだけを保存するように、 データシートをBefore After を指定せずにコピー データシートだけの乗った新規Bookを今回のコードを使って保存 ってした方が良いかもね 上手く行かなかったら補足よろしく!
補足
ありがとうございます。うまく行きました!! ただ、名前付け保存ダイアログを開いて、「キャンセル」 ボタンを押すと、「False」が表示されます。 これを出さなくするには、何を付け足せばいいでしょうか? >この仕様だと「マクロの乗ったファイルがどんどん増える」よ? 今、会社のパソコン5台それぞれの「PERSONAL.XLS」にVBAを 書いて使おうとしてますが、 >データシートをBefore After を指定せずにコピー >データシートだけの乗った新規Bookを今回のコードを使って保存 これはどうやるのでしょうか?素人なのですみません。 もう少し詳細をお知らせいただけませんでしょうか。。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>ChDrive "Z" ChDrive "Z:\" です。
補足
すみません。 >ChDrive "Z:\" でやってみましたが、 やはりC:\ のテンプレートファイルが保存して ある場所が開いてしまいます。
- redfox63
- ベストアンサー率71% (1325/1856)
カレントフォルダーを変更してから ダイアログを表示してみましょう ChDir "z:\あああ" Application.Dialogs( xlDialogsSaveAs).Show _ Arg1:= Range("A1").Value といった具合です
補足
ありがとうございます。 これも実は試したのですが、どうしても c:\aaa が開いてしまいます。 ChDrive "Z" ChDir "z:\あああ" ↑ちなみにこれも試しましたが、うまく行きませんでした。
お礼
いろいろとありがとうございました。 おかげさまでうまく出来ました。
補足
やりました!うまく出来ました! わかりやすいご説明ありがとうございます。 今後これを見る人のためにもホント最後の質問なのですが、 セルZ1に z:\■■受注書 と記入しないでも、マクロコード内の記述で ダイアログを z:\■■受注書 フォルダで開くようには出来ますか? これが出来れば、そのマクロ+今回のApplication.GetSaveAsFilenameで、同じ結果になるかと思います。 何度もつきあわせてごめんなさい。よろしくお願いします。