- ベストアンサー
Excel VBAで CheckBox を印刷する時タイムラグが発生
Windows2000,Excel2000(SP3) です。 Excelで表を印刷しようとしています。 Sheet1 に印刷するレイアウトを作成し CheckBoxを配置 してあります。 Sheet2 にデータが入っており VBAでそのデータを Sheet1 に展開して印刷するプログラムを書きました。 (もちろんCheckBoxにも値を設定してます) 最初のページはちゃんと出力されるのに、2ページ目から CheckBox のチェックが1ページ目と同じものが印刷され てしまいます。 VBA が終了した時点では、CheckBoxのチェックは正しいの ですが(画面上で確認)プリントアウトは1ページ目と同じものです。 Application.ScreenUpdating=True(画面再描画)とか Calculate とかやって見ましたがダメでした。 オブジェクトの表示が正しく印刷されるようにするにはどうしたら良いか教えてもらえないでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
wildcat888さん、こんにちは。 外したようでスミマセン。 環境が違う(Win95+Excel97)せいでしょうか、#4で提示されたソースはこちらでは問題なく印刷されました。 ActiveWindow.SelectedSheets.PrintOut を Sheet1.PrintOut や Worksheets(1).PrintOut に変更しても同じでしょうか? 印刷部分をシートコピーとかにしたら、変更されたシートが出来るのでしょうか? Private Sub Sub_insatu() 'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True ActiveCell.Activate Worksheets(1).Copy after:=Worksheets(1) End Sub あとは、DoEvents とかを入れてみるとか。。 Private Sub CommandButton1_Click() For n = 1 To 5 Range("A1").Value = n m = Range("A1").Value TextBox1.Value = m DoEvents ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Next n End Sub
その他の回答 (6)
- wildcat888
- ベストアンサー率40% (15/37)
>ご指摘のとおりに、Worksheets(1).PrintOut にしてみたり、DoEvents を入れて試してみましたが、状況は変わりませんでした。 ですか・・・・・・・・・・・・。 私の場合、Win2000+Office2000では 流れとDoEventsの挿入個所によっては 解消したのですが。 >問題となる部分(CheckBoxに対する処理部分)のソースを簡略化し(出来れば動く形で)提示された方が解決しやすいと思います。 と思います。そのままのソースでももちろんいいですが。
お礼
DoEvents で解決したとのことなので、こちらも色々なところに挿入してみたところ解決してしまいました。 オブジェクトの更新はExcelではなくWindowsが行っているという事なのでしょうか? DoEventsで制御をVBAからWindowsに返してあげないとオブジェクトが更新されないのかなと漠然と考えています。 なんにせよおかげ様で問題解決しました。 ありがとうございました。 wildcat888さんとpapayukaさんのお二人には感謝、感謝です。
- wildcat888
- ベストアンサー率40% (15/37)
No4のものです。 papayukaさんありがとうございます。 「DoEvents」 を挿入することによって、「タイムラグ」を 解消できました。 制御を他に移すのですね。 kon3さんのCheckBoxがどのように扱われているのかが 具体的にはわからないのですが、 適切な個所に「DoEvents」を挿入すれば、 「タイムラグ」を解消できると思います。 少し単調な例ですが、CheckBoxを含んだ場合についても 確認してみました。参考になれば。 まず CommandButton1,CommandButton2,CommandButton3, CheckBox1,CheckBox2,CheckBox3, TextBox1, CommandButton1,CommandButton2, を準備しておいて、 以下のVBAを貼り付けます。 4個所ある 'DoEvents を無効のままにすると、 画面が途中で更新されませんが、 DoEvents と、「'」を4箇所取り除いて有効にすると、 途中で更新されているのが確認できます。 (環境に合わせて数値100000は適当に変更を) '----------------------------------------- Private Sub CommandButton1_Click() Sub_A TextBox1.Value = 1 Sub_B TextBox1.Value = 2 Sub_C TextBox1.Value = 3 Sub_D TextBox1.Value = 4 End Sub Private Sub Sub_A() 'DoEvents CheckBox1.Value = False CheckBox2.Value = False CheckBox3.Value = False Sub_Print End Sub Private Sub Sub_B() 'DoEvents CheckBox1.Value = False CheckBox2.Value = True CheckBox3.Value = True Sub_Print End Sub Private Sub Sub_C() 'DoEvents CheckBox1.Value = True CheckBox2.Value = False CheckBox3.Value = True Sub_Print End Sub Private Sub Sub_D() 'DoEvents CheckBox1.Value = True CheckBox2.Value = True CheckBox3.Value = True Sub_Print End Sub Private Sub Sub_Print() For n = 1 To 100000 '時間つぶし 環境に合わせて数値は適当に変更を k = 999 '画面が更新されるかどうかが確認できる Next n 'ここに印刷のマクロを記入 End Sub Private Sub CommandButton2_Click() Sub_A TextBox1.Value = "" End Sub '----------------------------------------- ありがとうございました。
- wildcat888
- ベストアンサー率40% (15/37)
NO2に書いたものです。 kon3さんの質問は、 連続した印刷の際に 表示したはずのCheckBoxの変更が 印刷に反映されない。 最後のページの画面表示には CheckBoxが変更されているので 表示そのものには問題はない。 ということですから、 kon3さんの質問の要点は、 『画面の変更を各ページに正しく反映 して印刷するにはどうしたらいいか?』 ということだと思います。 「印刷する時タイムラグが発生」 と表現してらっしゃいます。 私の場合も全く同じ疑問だと認識してるので 書かせてもらいました。 papayukaさんありがとうございます。 >プライベート変数はSub~End Sub内でしか効力を持ちません というご指摘で、わき道にそれてしまったようで、 kon3さんごめんなさい。 あまり適切でない形で例示してしまったのですが、 実際は変数の部分は本質的な問題ではありません。 (Sub_BではOKですので、プライベート変数ではありません) 前回のものに沿った形で書き直すと、 「印刷する時タイムラグが発生」 するのは、次のような例です。 Dim m As Integer Private Sub Sub_A() For n = 1 To 5 'For l = 1 To 1000000 印刷の代りに時間つぶし ' p = p 'Next l Range("A1").Value = n m = Range("A1").Value Sub_hyouji '表示データの更新 Sub_insatu '印刷 Next n End Sub Private Sub Sub_B() m = Range("A1").Value Sub_hyouji '表示データの更新 Sub_insatu '印刷 End Sub Private Sub Sub_C() Range("A1").Value = Range("A1").Value + 1 End Sub Private Sub Sub_hyouji() TextBox1.Value = m End Sub Private Sub Sub_insatu() ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True End Sub Private Sub CommandButton1_Click() Sub_A End Sub Private Sub CommandButton2_Click() Sub_B End Sub Private Sub CommandButton3_Click() Sub_C End Sub 表示を更新すればいいのだと思うのですが・・・・。
- papayuka
- ベストアンサー率45% (1388/3066)
wildcat888さん、こんにちは。 他の方の質問の回答に回答するのもなんですが、、 変数 m に代入した値は何に使われているのか、コールしている2つのプロシージャは何なのかが不明です。テキストボックスも出てこないし。。 m=range("A1").value Sub_hyouji '表示データの更新 Sub_insatu '印刷 ひょっとして、Sub_hyoujiやSub_insatuの中でも m を使っていて、それで変わらないと言っているのだとしたら、そもそも使い方を間違えているだけだと思います。 プライベート変数はSub~End Sub内でしか効力を持ちません。 Sheet1にTextBoxがあったとして、 Sub test() Dim n As Integer For n = 1 To 5 Worksheets("Sheet1").Range("A1").Value = n Call myPrintOut(n) Next n End Sub Sub myPrintOut(hikisuu) Worksheets("Sheet1").TextBox1.Value = hikisuu Worksheets("Sheet1").PrintOut End Sub
- wildcat888
- ベストアンサー率40% (15/37)
すみません、回答ではないのですが、 同じようなところでつまづいているので、 書かせてください。 チェックボックスではなく、 複数のテキストボックスを含む領域を 更新しながら印刷したいのですが、 ご質問と同様に、 全て同じものが印刷されてしまうのです。 何か、再表示のようなことをやればいいのだと思って、 ここで「連続 印刷」、「印刷 再表示」などで検索したのですが、 みつかりませんでした。 私の場合は概略以下のようなことです。 ボタンAを押すと、Sub_A が 実行されるようにすると、 5枚全て同じものが印刷されます。 途中、テキストボックスは更新されないようで、 最後に5枚目のデータが正しく表示されて終わっています。 セルA1に0を入れておき、 ボタンB、Cを押すと、Sub_B、Sub_C が 実行されるようにすると、 ボタンC、Bを次々に押すことによって、 期待したように、表示データが更新されて 全て正しく印刷されます。 Sub_A for n = 1 to 5 range("A1").value = n m=range("A1").value Sub_hyouji '表示データの更新 Sub_insatu '印刷 next n Eub end Sub_B m = range("A1").value Sub_hyouji '表示データの更新 Sub_insatu '印刷 Eub end Sub_C range("A1").value = range("A1").value + 1 Eub end 再描画か再計算みたいなことを印刷の前に 実行するのかと思うのですがわかりません。
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 印刷プレビューでは正しく表示されてますか? 問題となる部分(CheckBoxに対する処理部分)のソースを簡略化し(出来れば動く形で)提示された方が解決しやすいと思います。
補足
ご指摘のとおりに、Worksheets(1).PrintOut にしてみたり、DoEvents を入れて試してみましたが、状況は変わりませんでした。 Excel97 では大丈夫なんですか? どうしてこうなるんでしょうネ?