- ベストアンサー
EXCEL VBA初心者によるメッセージボックスの使用について
- EXCEL VBA初心者がメッセージボックス vbYesNoCancelの使い方について質問しています。具体的には、はいの場合は通常使うプリンタで印刷し、いいえの場合はファイル名を指定して保存したいとしています。また、キャンセルの場合はマクロの実行をキャンセルするだけです。
- 質問者はWindows XPとEXCEL 2003を使用しており、具体的なコードを提示しました。しかし、ファイルを保存する場合の処理についてはわからないとしています。
- 質問の結論として、質問者はEXCEL VBA初心者であり、メッセージボックス vbYesNoCancelの使い方について困っていることが分かります。具体的な処理を知りたいとしています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
先の補足しておいたのはこういうことです。 ついでにワタシに質問されたワケじゃありませんが。 sub macro1() dim s as string select case msgbox("message", vbyesnocancel) case vbyes worksheets("Agreement(1)").printout case vbno worksheets("Agreement(1)").copy ’追加箇所 s = application.getsaveasfilename(activesheet.name) ’変更箇所 if s <>false then activeworkbook.saveas filename:=s end if end select end sub
その他の回答 (5)
- Cor_moriyan
- ベストアンサー率41% (92/221)
まず訂正です。スミマセン。 コピー元のシートは Sheets("Agreement(1)") ですね。 Case vbYes の箇所と同じシートに対して .Copy を実行する事で、新たなブックにシートがコピーされます。 それと。 すみません、keithinさんの回答も絡む内容です。気を悪くされないでくださいm(_ _)m GetSaveAsFilename の戻り値は Variant なので(Help参照)、戻り値を入れる変数は Varinat型 で定義して下さい。String型でも正常に動いちゃうのですが(^^; 厳密にしておいた方が良いと思います。 それと、ActiveSheet,ActiveWorkbook,Select,Selection 等は極力使わない方が良いです。 なぜかと言うと、VBA(マクロ)が動いている際中に、使用者が意図しない操作をした場合「現在アクティブになっている(選択されている)シート・ブック」が変更されてしまう可能性があるからです。 そのため、私のソースでは .Copy をした直後に ActiveWorkbook のオブジェクトを取得し、出来るだけ間隔を置かないようにしています。また、いきなり Sheet("Agreement(1)") と書くと、これも ActiveWorkbook.Sheet~ を意味しています。自分のブック内のシートなら ThisWorkbook.Sheet~ と明示した方が良いでしょう。 Sheets("Agreement(1)").Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 上記を明示的に表すと ThisWorkbook.Worksheets("Agreement(1)").PrintOut Copies:=1, Collate:=True となります。こうしておけば、Select~PrintOutまでの間に使用者が何かしてしまうような心配はありません。まぁ、ほんの一瞬の事ですが(^^; ExcelVBAは自由度もあって簡単に作れる分、しっかりと作らないと他の人が使ったとき等、思わぬエラー,事象が発生します。 頑張って下さいね。 長々と失礼しました。(余計な事でしたら申し訳ありません)
お礼
回答ありがとうございます。 私には、かなりハイレベルです。 がんばってみます。
- Cor_moriyan
- ベストアンサー率41% (92/221)
ごめんなさい。 > Sheet1.Copy ThisWorkbook.Worksheets("AAA").Copy に変更して下さい。
- Cor_moriyan
- ベストアンサー率41% (92/221)
補足を読みました(^^) 1) 出力先フォルダを指定(FileDialog) 2) シート"AAA"を「新たなブック」にコピー 3) コピーして作成された「新たなブック」を、ファイル名"AAA"で保存 って事で良いでしょうか? そうなると....VBA初心者ではチョット難しいですよ(^^; 作成例をあげておきます。トライしてみて下さい。 Dim varPATH As Variant Dim wb As Workbook <省略> Case vbNo '保存先指定 varPATH = Application.GetSaveAsFilename("AAA.xls", "Excelファイル,*.xls") If varPATH = False Then MsgBox "キャンセルします" Else Application.ScreenUpdating = False '画面表示を抑止 Sheet1.Copy '新たなブックにコピー Set wb = ActiveWorkbook 'コピーで作られたブックを取得 wb.Close SaveChanges:=True, Filename:=varPATH '指定されたファイル名で保存して閉じる Application.ScreenUpdating = True '画面抑止の解除 End If
- keithin
- ベストアンサー率66% (5278/7941)
作成例: sub macro1() dim s as string select case msgbox("message", vbyesnocancel) case vbyes worksheets("Agreement(1)").printout case vbno s = application.getsaveasfilename() if s <>false then activeworkbook.saveas filename:=s else 'do nothing end if case else 'do nothing end select end sub #補足 ’do nothingのルートは,実際のマクロでは分岐ルートを起こす必要もありません #補足 「名前を付けて保存」ルートでは,そこから更にキャンセルするの選択肢が発生します。 その際にどう処理を流すか(そこで止める・一つ前に処理を戻す・キャンセルさせないetc)は,また考えて工夫してみてください。
お礼
回答ありがとうございます。 レベルが高すぎてさっぱりですが、がんばって考えます!!
- Cor_moriyan
- ベストアンサー率41% (92/221)
> ファイル名を指定して保存 は、今使っているブックを保存する。と言う事で良いでしょうか? 「保存先は、使用する人が指定」と言う事なので、以下の様な動作が必要になります。 1) ファイルダイアログボックスを表示して、出力先フォルダを指定させる。 2) 1で指定されたフォルダ名に、ファイル名「AAA」を付加する。 3) 「ファイル名を付けて保存」する。 Dim objFD As FileDialog <省略> Case vbNo Set objFD = Application.FileDialog(msoFileDialogFolderPicker) If objFD.Show Then ThisWorkbook.SaveAs Filename:=objFD.SelectedItems(1) & "\AAA" Else MsgBox "キャンセルします" End If こんな感じでしょうか。かなり簡略してますが。 FileDialogには表題(Title)を設定したり出来ますので、詳しくはヘルプを参照してください。
お礼
ありがとうございました。
補足
回答ありがとうございます。 保存の手順を少し変えたいのですが・・・ 保存方法を シート(Seat AAA)をコピー ダイアログボックスを表示させたときに 名前を"AAA"を表示させたいです。 <中略> Case vbNo Worksheets("Agreement(1)").Copy Application.Dialogs(xlDialogSaveWorkbook).Show Case Else Exit Sub ダイアログボックスにあらかじめファイル名を表示させたいです。 シート名をファイル名でも大丈夫です。
お礼
ありがとうございます!! 私の思うとおりにできました!!