Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1381 / 13644 ツリー ←次へ | 前へ→

【74769】ダイアログをキャンセルした後の処理 3891 13/9/12(木) 15:10 質問[未読]
【74775】Re:ダイアログをキャンセルした後の処理 γ 13/9/12(木) 20:53 発言[未読]
【74778】Re:ダイアログをキャンセルした後の処理 γ 13/9/13(金) 6:57 発言[未読]
【74777】Re:ダイアログをキャンセルした後の処理 ichinose@ 13/9/13(金) 6:46 発言[未読]
【74779】Re:ダイアログをキャンセルした後の処理 3891 13/9/13(金) 9:13 お礼[未読]
【74780】Re:ダイアログをキャンセルした後の処理 13/9/13(金) 9:45 回答[未読]
【74799】Re:ダイアログをキャンセルした後の処理 3891 13/9/16(月) 16:34 お礼[未読]

【74769】ダイアログをキャンセルした後の処理
質問  3891  - 13/9/12(木) 15:10 -

引用なし
パスワード
   また、質問させてください。

ダイアログを開いて、名前をつけて保存させます
ファイル名は、初期値のまま保存する場合も、変更する場合もあります

書式1
Target = "初期値"
Application.Dialogs(xlDialogSaveAs).Show arg1:=Target

とやっていたのですが、ダイアログをキャンセルしたときにも、
OKと同じ処理に走ってしまうので、分岐させたいのですが、
このやり方だと、キャンセルという戻り値が取れません。

書式2
Dim BlnRtn As Boolean
BlnRtn = Application.Dialogs(xlDialogPrint).Show
という記述を見つけたのですが、この書式だと、 arg1:=Target の部分が
VBEにコンパイルエラーと返されてしまいます。

書式3
Dim BlnRtn As Variant
BlnRtn= IIf(Application.Dialogs(xlDialogSaveAs).Show(ARG1:=Target), "保存", "キャンセル")

と、true/falseを見させようとすると、今度は、戻り値として、
保存したファイル名を受け取ることが出来ません
このため、ファイル名を初期値から変更したときに、その名前を得ることができません。


煩雑な処理をすれば、できない処理では無いと思うのですが、
割と、普通の処理なので、スマートなやり方があるに違いないと思い、
質問させていただきました。

よろしくお願いいたします

【74775】Re:ダイアログをキャンセルした後の処理
発言  γ  - 13/9/12(木) 20:53 -

引用なし
パスワード
   すみません、よくわからないのですが、
Sub test()
  Dim s As String
  Dim v
  s = "初期値"
  v = Application.Dialogs(xlDialogSaveAs).Show(arg1:=s)
  Stop
End Sub
で返り値を確認されたらいかがでしょうか。

保存したファイル名を返すという仕様になっているのでしょうか?
お気持ちはわかりますが、仕様できめられた以外のことを望んでも、
なかなか難しいと思いますよ。

【74777】Re:ダイアログをキャンセルした後の処理
発言  ichinose@  - 13/9/13(金) 6:46 -

引用なし
パスワード
   おはようございます。


>書式3
>Dim BlnRtn As Variant
>BlnRtn= IIf(Application.Dialogs(xlDialogSaveAs).Show(ARG1:=Target), "保存", "キャンセル")
>
>と、true/falseを見させようとすると、今度は、戻り値として、
>保存したファイル名を受け取ることが出来ません
>このため、ファイル名を初期値から変更したときに、その名前を得ることができません。

Application.Dialogs(xlDialogSaveAs).Showによって、保存されるブックは、
ActiveWorkBookですよね!!

でしたら、ActiveWorkBookを調べれば、保存ファイル名は、取得できます。


Sub svsample()
  Dim ans As Variant
  Dim bknm As String
  bknm = "sample"
  Application.EnableEvents = False
  ans = Application.Dialogs(xlDialogSaveWorkbook).Show(bknm)
  Application.EnableEvents = True
  If ans Then
    MsgBox ActiveWorkbook.FullName & " 保存しました"
  End If
End Sub


他にも
Application.GetSaveAsFilenameメソッドを使って、保存ファイルパスだけを
取得して、プログラムで保存するという方法もありますね!!
Sub svsample2()
  Dim ans As Variant
  Dim bknm As String
  bknm = "sample"
  ans = Application.GetSaveAsFilename(bknm, "Excelブック (*.xlsx),*.xlsx,Excelマクロ有効ブック(*.xlsm),*.xlsm")
  If TypeName(ans) <> "Boolean" Then
    MsgBox ans & " 保存する名前です"
    ActiveWorkbook.SaveAs ans
  End If
End Sub
(2007以上の場合)

【74778】Re:ダイアログをキャンセルした後の処理
発言  γ  - 13/9/13(金) 6:57 -

引用なし
パスワード
   > このため、ファイル名を初期値から変更したときに、その名前を得ることができません。
> 煩雑な処理をすれば、できない処理では無いと思うのですが、
> 割と、普通の処理なので、スマートなやり方があるに違いないと思い、
> 質問させていただきました。

返り値は、保存を実行したかどうか(True,False)でしょう。
保存後のファイル名を知りたければ、
ActiveWorkBook.Nameとすればいいだけではないですか?

Trueが返っていて、
ActiveWorkBook.Nameが初期値と異なっていれば、
変更して保存したと判断できます。

# 重複しますが、昨日メモして置いたものを載せておきます。

【74779】Re:ダイアログをキャンセルした後の処理
お礼  3891  - 13/9/13(金) 9:13 -

引用なし
パスワード
   γさん、ichinose@さん、ありがとうございます

まず、ファイル名の件ですが、ActiveWorkbook.Name で、取得できます。
というか、元々、そう処理をさせていたのに、
弄っているうちに、その一文を消してしまったようで、勘違いしていました。


本題です

v = Application.Dialogs(xlDialogSaveAs).Show(arg1:=s)
ans = Application.Dialogs(xlDialogSaveWorkbook).Show(bknm)

これらの文中で、showの後を、括弧で括っていますが、
これが正しい書式でしょうか。
このような書き方は、知らなかったです。

  私が使っている参考書が、”excel97”のせいかも知れないですが(笑)

多分、括弧を使うだけで、うまく処理できると思います。
今日は別の件をやらなければならないので、後で確認します。


ありがとうございました

【74780】Re:ダイアログをキャンセルした後の処理
回答    - 13/9/13(金) 9:45 -

引用なし
パスワード
   こんにちは。

>  私が使っている参考書が、”excel97”のせいかも知れないですが(笑)

”excel97”に釣られて出てきました。つい先日まで使っていました。


値を返すときは、引数を(カッコ)でくくる必要があります。
下記test2では、カッコがないとコンパイルエラーになります。
”excel97”でも同じです。バージョンは関係ありません。

ただ、書籍について言えば、もし使うなら、いま使っているエクセルに
対応した書籍が良いです。


Sub test1()
  MsgBox "適当なメッセージ"
End Sub

Sub test2()
  Dim ans As Long
  ans = MsgBox("適当なメッセージ")
End Sub


▼3891 さん:
>γさん、ichinose@さん、ありがとうございます
>
>まず、ファイル名の件ですが、ActiveWorkbook.Name で、取得できます。
>というか、元々、そう処理をさせていたのに、
>弄っているうちに、その一文を消してしまったようで、勘違いしていました。
>
>
>本題です
>
>v = Application.Dialogs(xlDialogSaveAs).Show(arg1:=s)
>ans = Application.Dialogs(xlDialogSaveWorkbook).Show(bknm)
>
>これらの文中で、showの後を、括弧で括っていますが、
>これが正しい書式でしょうか。
>このような書き方は、知らなかったです。
>
>  私が使っている参考書が、”excel97”のせいかも知れないですが(笑)
>
>多分、括弧を使うだけで、うまく処理できると思います。
>今日は別の件をやらなければならないので、後で確認します。
>
>
>ありがとうございました

【74799】Re:ダイアログをキャンセルした後の処理
お礼  3891  - 13/9/16(月) 16:34 -

引用なし
パスワード
   ▼佳 さん:
遅くなりました

>値を返すときは、引数を(カッコ)でくくる必要があります。
>下記test2では、カッコがないとコンパイルエラーになります。
>”excel97”でも同じです。バージョンは関係ありません。

なるほど、ご丁寧にありがとうございました。


>ただ、書籍について言えば、もし使うなら、いま使っているエクセルに
>対応した書籍が良いです。

そうなんですが、端末によって、使っているバージョンが違うので、
どこにあわせることも出来ないんです。

まあ、webで検索すれば、大抵は事がすみますし、
マクロを組むのも、めったに無いので、ま、いっか、と、あきらめが入っています。


また、皆さんに教えていただいた方法で、旨く処理できましたことを報告しておきます。

ありがとうございました

1381 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free