ここから質問投稿すると、最大4000ポイント当たる!!!! >>

Windows2000,Excel2000(SP3) です。
Excelで表を印刷しようとしています。
Sheet1 に印刷するレイアウトを作成し CheckBoxを配置
してあります。
Sheet2 にデータが入っており VBAでそのデータを Sheet1
に展開して印刷するプログラムを書きました。
(もちろんCheckBoxにも値を設定してます)
最初のページはちゃんと出力されるのに、2ページ目から
CheckBox のチェックが1ページ目と同じものが印刷され
てしまいます。
VBA が終了した時点では、CheckBoxのチェックは正しいの
ですが(画面上で確認)プリントアウトは1ページ目と同じものです。
Application.ScreenUpdating=True(画面再描画)とか
Calculate とかやって見ましたがダメでした。
オブジェクトの表示が正しく印刷されるようにするにはどうしたら良いか教えてもらえないでしょうか?

このQ&Aに関連する最新のQ&A

印刷 VBA」に関するQ&A: VBA印刷ページ設定

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

この回答への補足

ご指摘のとおりに、Worksheets(1).PrintOut にしてみたり、DoEvents を入れて試してみましたが、状況は変わりませんでした。
Excel97 では大丈夫なんですか?
どうしてこうなるんでしょうネ?

補足日時:2003/05/17 21:56
    • good
    • 0

>ご指摘のとおりに、Worksheets(1).PrintOut にしてみたり、DoEvents を入れて試してみましたが、状況は変わりませんでした。



ですか・・・・・・・・・・・・。
私の場合、Win2000+Office2000では
流れとDoEventsの挿入個所によっては
解消したのですが。

>問題となる部分(CheckBoxに対する処理部分)のソースを簡略化し(出来れば動く形で)提示された方が解決しやすいと思います。

と思います。そのままのソースでももちろんいいですが。
    • good
    • 0
この回答へのお礼

DoEvents で解決したとのことなので、こちらも色々なところに挿入してみたところ解決してしまいました。
オブジェクトの更新はExcelではなくWindowsが行っているという事なのでしょうか?
DoEventsで制御をVBAからWindowsに返してあげないとオブジェクトが更新されないのかなと漠然と考えています。

なんにせよおかげ様で問題解決しました。
ありがとうございました。
wildcat888さんとpapayukaさんのお二人には感謝、感謝です。

お礼日時:2003/05/18 01:26

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
'-----------------------------------------

ありがとうございました。
    • good
    • 0

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


表示を更新すればいいのだと思うのですが・・・・。
    • good
    • 0

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
    • good
    • 0

すみません、回答ではないのですが、


同じようなところでつまづいているので、
書かせてください。

チェックボックスではなく、
複数のテキストボックスを含む領域を
更新しながら印刷したいのですが、
ご質問と同様に、
全て同じものが印刷されてしまうのです。
何か、再表示のようなことをやればいいのだと思って、
ここで「連続 印刷」、「印刷 再表示」などで検索したのですが、
みつかりませんでした。
私の場合は概略以下のようなことです。

ボタン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

再描画か再計算みたいなことを印刷の前に
実行するのかと思うのですがわかりません。
    • good
    • 0

こんにちは。



印刷プレビューでは正しく表示されてますか?

問題となる部分(CheckBoxに対する処理部分)のソースを簡略化し(出来れば動く形で)提示された方が解決しやすいと思います。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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


人気Q&Aランキング