- ベストアンサー
VBAを使ってシートのコピーとMsgboxの無効化方法
- VBAを使用して、レポートを作成する際にフォームを利用し、新しいシートを作成していきます。しかし、実行されるメッセージボックスが邪魔になります。
- シートを新しいブックにコピーする際、不要なマクロもコピーされてしまいました。マクロは必要ないため、シートのみをコピーしたいと思っています。
- シートの作成やコピーについて検討しているうちに、具体的な方法がわからなくなってしまいました。また、メッセージボックスの邪魔な表示についても解決策が見つかりませんでした。どのように対処すれば良いでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
シートコピーはすっかりどっか行っちゃって、結局「どーでもいい」方に集中しちゃってますよね。 >全フォームに回避策(フラグを立てる)などする必要があります。 先の回答がまぁそのパターンなワケですが、他のフォームに手を入れたくないなら、これも回答の再掲になりますけど NewForm: Private Sub CommandButton1_Click() UserForm1.ComboBox1.Value = Me.ComboBox1.Value Call UserForm1.DATA_CHANGE'データ変更 Call UserForm1.Graph_Make'グラフ作成 Call UserForm1.Graph_Setting'グラフの目盛りなどの設定 UserForm2.ComboBox1.Value = Me.ComboBox1.Value Call UserForm2.DATA_EDIT Call UserForm2.Graph_MakeUser'グラフ作成 Call UserForm2.Graph_Setting'グラフの目盛りなどの設定 MsgBox Me.ComboBox1.Value & vbCrLf & "レポート出力が完了しました。" End Sub といった具合に、「迂回路」で処理するだけです。
その他の回答 (6)
- oka_me
- ベストアンサー率86% (26/30)
#2です。 MsgBoxの件の詳細拝見しました。 あまりスマートな方法ではないかもしれませんが、 もし自分が同じものを作成するとしたら、クリックイベント自体をを呼び出すのではなく Msgboxを除いたクリックイベントの「内容」を転記しますかね。。。 Private Sub CommandButton1_Click() 'NewFormクリックイベント UserForm1.ComboBox1.Value = Me.ComboBox1.Value Call DATA_CHANGE'データ変更 Call Graph_Make'グラフ作成 Call Graph_Setting'グラフの目盛りなどの設定 UserForm2.ComboBox1.Value = Me.ComboBox1.Value Call DATA_EDIT Call Graph_MakeUser'グラフ作成 Call Graph_Setting'グラフの目盛りなどの設定 ~・・・ 但し、元のフォームの処理内容が変更された時はNewFormの内容も同時に修正しないといけなくなりますが。。。
お礼
回答ありがとうございます。 内容を転記というのは、そのままフォームに書き込むのでしょうか? 膨大な量なため、 転記するのが難しい状況にあります。
- keithin
- ベストアンサー率66% (5278/7941)
こーいうことですかね。 標準モジュール: public flg as boolean sub macro1() userform1.show vbmodeless newform.show vbmodeless end sub NewFormのシート: private sub CommandButton1_Click() module1.flg = true userform1.commandbutton1_click module1.flg = false end sub UserForm1のシート: public sub CommandButton1_Click() if not module1.flg then msgbox "me origin" else ’msgbox "from newform" end if end sub #結局全部答えを聞かなきゃ納まらないんだから、最初っからそれぞれの質問に分けて投稿してほしいものです。 >UserForm1で出るようにしていたMsgboxや : >等必ず出てしまいます。 どういう段取りで(UserFormをイニシャライズした時?コマンドボタンをクリックしたとき??)msgboxを表示させているのか不明なので、「具体的にこのようなマクロにしましょう」とお話し出来るネタがありません。 >UserForm上のMsgboxを削除すればいいかと思うのですが、 >それでは、UserFormのみを実行したとき >Msgboxが表示されなくなってしまうので、困っています。 基本的な概念としては、次の二通りが考えられます。 1.「必要」な時にのみmsgboxを表示する 2.「不要」な時は迂回路を実行する あなたのマクロが何をしているのか不明、つまり、いつが必要でどういうときが不要なのか、さっぱりお答えできません。
補足
ユーザーフォーム:NewForm Private Sub CommandButton1_Click() UserForm1.ComboBox1.Value = Me.ComboBox1.Value Call UserForm1.CommandButton1_Click 'チャート作成! UserForm2.ComboBox1.Value = Me.ComboBox1.Value Call UserForm2.CommandButton1_Click 'チャート作成! MsgBox Me.ComboBox1.Value & vbCrLf & "レポート出力が完了しました。" End Sub '================================ ユーザーフォーム:UserForm1 Public Sub CommandButton1_Click() Call DATA_CHANGE'データ変更 Call Graph_Make'グラフ作成 Call Graph_Setting'グラフの目盛りなどの設定 Msgbox "完了しました。" End sub '================================ ユーザーフォーム:UserForm2 Public Sub CommandButton1_Click() Call DATA_EDIT MsgBox "修正処理が完了しました。" Call Graph_MakeUser'グラフ作成 Call Graph_Setting'グラフの目盛りなどの設定 Msgbox "完了しました。" End sub '================================ フォーム上にコンボボックスやコマンドボタンを配置し 実行するようにしています。 上記マクロを実行する際に、 UserForm1のMsgbox "完了しました" UserFOrm2のMsgbox "修正処理が完了しました" と "完了しました" の合計3回、メッセージボックスが表示されます。 これを回避するには全フォームに回避策(フラグを立てる) などする必要があります。 しかし、UserFormは10以上あり、手作業でやるには 面倒に感じたため、質問させて頂きました。 語彙力不足・説明力不足で本当に申し訳ありません。 "あったらいいな~"という内容でしたので、 無ければ無いでかまわない事でした。 なので、合わせて質問させて頂きました。
- hallo-2007
- ベストアンサー率41% (888/2115)
補足を拝見しましたが、なおさら意味が分からなくなりした。 >ブックごとコピーしてしまったために、マクロまでコピーされてしまいました。 >マクロは必要ありません。 これだけを手掛かりにですが、Office2007以上であれば 保存するときに .Xlsx マクロなしのタイプを選択して保存すれば マクロの部分は、全てなくなります。
お礼
回答ありがとうございました!
補足
Excelは2003です。
- keithin
- ベストアンサー率66% (5278/7941)
ヤリタイ事: 目的のシートだけ複写した新しいブックを作りたい sub macro1() worksheets(array("レベル","効果","ランク").copy end sub 以上です。 >フォームで実行されるメッセージボックス イミフメイです。 そのメッセージボックスを「あなたのマクロが表示させてる」のなら、単にそうしないだけですからそんな事を聞いてるんじゃありませんよね。 参考: マクロで実行するメッセージボックスとはこういう事を言います sub macro2() msgbox "メッセージです" end sub 一体全体「どのタイミングで」「どんな内容の」メッセージボックスが現れるのか、必要なら具体的に目に見えるように状況を補足して「別途」ご相談として投稿してみて下さい。
お礼
回答ありがとうございます。 簡単にシートをコピーすることができました。 助かります。
補足
例えば、 UserForm1 UserForm2 UserForm3 NewForm があるとします。 UserForm1~3までのコンボボックスに NewFormのコンボボックスの内容を入力し、 UserForm1~3のCommandbutton1_Clickのイベントを 実行するようにプログラムしました。 その場合、UserForm1で出るようにしていたMsgboxや UserForm2で出るようにしていたMsgbox等 必ず出てしまいます。 これを出ないようにするためには UserForm上のMsgboxを削除すればいいかと思うのですが、 それでは、UserFormのみを実行したとき Msgboxが表示されなくなってしまうので、困っています。
- oka_me
- ベストアンサー率86% (26/30)
VBAでシートのみコピーすることは可能です。 http://officetanaka.net/excel/vba/sheet/sheet05.htm 新規作成時のシートが不要なのであれば、コピー後に削除する方法では駄目でしょうか。。 ☆新規作成時のシートが3枚固定であれば (こちらの方がコード的には分かりやすいかと思います) Dim xlbook As Workbook Application.DisplayAlerts = False 'シート削除時の警告解除 Set xlbook = Workbooks.Add With xlbook ThisWorkbook.Sheets("コピー元").Copy before:=.Sheets(1) 'シートのコピー .Sheets(4).Delete 'Sheet3を削除 .Sheets(3).Delete 'Sheet2を削除 .Sheets(2).Delete 'Sheet1を削除 End With Application.DisplayAlerts = True '警告表示を元に戻す ☆新規作成時のシート数を自動判定して削除する方法 Dim xlbook As Workbook Dim i As Long Application.DisplayAlerts = False Set xlbook = Workbooks.Add With xlbook ThisWorkbook.Sheets("コピー元").Copy before:=.Sheets(1) 'シートのコピー For i = .Sheets.Count To 2 Step -1 '新規ブックのシート数をカウントし、後ろから順に削除 .Sheets(i).Delete Next End With Application.DisplayAlerts = True - - - 「メッセージボックスが邪魔」というくだりがよく分からなかったのですが(理解力不足ですみません 苦笑)、その部分に関してももう少し詳細に教えて頂ければもしかしたらお答えできるかもしれません。。。
補足
回答ありがとうございます! メッセージボックスが邪魔というのは、 自分で作成したフォーム上で実行させているメッセージボックスが邪魔なのです。 例えば、 UserForm1 UserForm2 UserForm3 NewForm があるとします。 UserForm1~3までのコンボボックスに NewFormのコンボボックスの内容を入力し、 UserForm1~3のCommandbutton1_Clickのイベントを 実行するようにプログラムしました。 その場合、UserForm1で出るようにしていたMsgboxや UserForm2で出るようにしていたMsgbox等 必ず出てしまいます。 これを出ないようにするためには UserForm上のMsgboxを削除すればいいかと思うのですが、 それでは、UserFormのみを実行したとき Msgboxが表示されなくなってしまうので、困っています。 説明下手で本当に申し訳ないです。
- usami33
- ベストアンサー率36% (808/2210)
やりたいことが今一理解できていませんが とりあえずメッセージは以下を試してください マクロの最初にこれを実行 Application.ScreenUpdating = False 抜けるときにもとに戻します Application.ScreenUpdating = True
補足
回答ありあがとうございます。 本当に、説明不足で申し訳ありません。 例えば、 UserForm1 UserForm2 UserForm3 NewForm があるとします。 UserForm1~3までのコンボボックスに NewFormのコンボボックスの内容を入力し、 UserForm1~3のCommandbutton1_Clickのイベントを 実行するようにプログラムしました。 その場合、UserForm1で出るようにしていたMsgboxや UserForm2で出るようにしていたMsgbox等 必ず出てしまいます。 これを出ないようにするためには UserForm上のMsgboxを削除すればいいかと思うのですが、 それでは、UserFormのみを実行したとき Msgboxが表示されなくなってしまうので、困っています。 上記内容の場合、 私が設定したMsgboxは表示されてしまいます。 調べたところ他に方法は無い模様ですが・・・
お礼
回答ありがとうございます。 シートコピーはお蔭様で上手くいきました。 この質問も、もうそろそろ締め切りですかね。 そのUserForm2などの内容まで見て、全部記入していく方式ですね! その方法も良いのですが、転記で失敗?してしまいそうなのと、 行数が結構あるため、迷っています… 頑張って、間違えないように転記したいと思います! 上記プログラムは見本用としてなので、 実際はもっと膨大なプログラムを書いています。 (プログラム組むの下手なので・・・) では、回答ありがとうございました! 参考に頑張ります!