重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

VBAを使い、レポートを作成しようと考えています。
レポートを作成するに当たり、
今まで作成しておいたフォームを利用し、
新しいシートを作成していきます。
※実行するにあたり、フォームで実行される
 メッセージボックスが邪魔です…


例) 作成されたシート名
   出荷数
   累計
   レベル
   効果
   ランク

そして、そのシートを
新しいブックにコピーしようと考えています。
コピーしたいブックは、
レベル・効果・ランク のみになります。

最初は、ブックをコピーして保存し、
シートを削除してく方向を考えましたが
ブックごとコピーしてしまったために、マクロまでコピーされてしまいました。
マクロは必要ありません。

シートの作成、コピーを色々考えていくうちに
良くわからなくなってしまったため、質問いたしました。
できれば、そのシートのみコピーしたいと思っています。
(新規作成したときのSheet1,Sheet2などは要らないです)

上のほうで書いた、メッセージボックスが邪魔という件ですが、
これは改善方法があれば回答いただけるとうれしいです。
(調べたところ、そういった情報はありませんでした)

回答よろしくお願いいたします!

A 回答 (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

といった具合に、「迂回路」で処理するだけです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
シートコピーはお蔭様で上手くいきました。
この質問も、もうそろそろ締め切りですかね。

そのUserForm2などの内容まで見て、全部記入していく方式ですね!
その方法も良いのですが、転記で失敗?してしまいそうなのと、
行数が結構あるため、迷っています…

頑張って、間違えないように転記したいと思います!

上記プログラムは見本用としてなので、
実際はもっと膨大なプログラムを書いています。
(プログラム組むの下手なので・・・)

では、回答ありがとうございました!
参考に頑張ります!

お礼日時:2013/12/16 10:26

#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の内容も同時に修正しないといけなくなりますが。。。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
内容を転記というのは、そのままフォームに書き込むのでしょうか?
膨大な量なため、
転記するのが難しい状況にあります。

お礼日時:2013/12/16 10:21

こーいうことですかね。



標準モジュール:
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以上あり、手作業でやるには
面倒に感じたため、質問させて頂きました。


語彙力不足・説明力不足で本当に申し訳ありません。

"あったらいいな~"という内容でしたので、
無ければ無いでかまわない事でした。
なので、合わせて質問させて頂きました。

補足日時:2013/12/13 08:45
    • good
    • 0

補足を拝見しましたが、なおさら意味が分からなくなりした。


>ブックごとコピーしてしまったために、マクロまでコピーされてしまいました。
>マクロは必要ありません。
これだけを手掛かりにですが、Office2007以上であれば
保存するときに .Xlsx マクロなしのタイプを選択して保存すれば
マクロの部分は、全てなくなります。

この回答への補足

Excelは2003です。

補足日時:2013/12/13 08:34
    • good
    • 0
この回答へのお礼

回答ありがとうございました!

お礼日時:2013/12/13 08:34

ヤリタイ事:


目的のシートだけ複写した新しいブックを作りたい

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が表示されなくなってしまうので、困っています。

補足日時:2013/12/12 09:59
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
簡単にシートをコピーすることができました。
助かります。

お礼日時:2013/12/12 09:59

VBAでシートのみコピーすることは可能です。


http://officetanaka.net/excel/vba/sheet/sheet05. …

新規作成時のシートが不要なのであれば、コピー後に削除する方法では駄目でしょうか。。

☆新規作成時のシートが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が表示されなくなってしまうので、困っています。

説明下手で本当に申し訳ないです。

補足日時:2013/12/12 09:04
    • good
    • 0

やりたいことが今一理解できていませんが


とりあえずメッセージは以下を試してください
マクロの最初にこれを実行
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は表示されてしまいます。
調べたところ他に方法は無い模様ですが・・・

補足日時:2013/12/12 09:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!