アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA初心者ですのでどうか詳しく教えてください。下記のマクロをエクセルで組んだのですが・・・

--------------------------------------------------------------------

Sub hideworksheets()

Worksheets("sheet1").Visible = False

End Sub




Sub ボタン_Click()

ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet1").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet2").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet3").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet4").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1

End Sub


------------------------------------------------------------

1.上記設定で"sheet5"という別シートにボタンを設置した場合、このボタンを実行すると、シート1~4のほかにシート5まで印刷されてしまいます。シート5を印刷したくない場合のVBAの記述について教えてください。

2.「Sub hideworksheets()

 Worksheets("sheet1").Visible = False

   End Sub」
  
の箇所で、シート1を非表示にしたいのですが、このマクロを実行時、「Sub ボタン_Click()」以下のマクロを実行しようとすると、「実行時エラー1004 worksheeクラスのselectメソッドが失敗しました」のエラーがでてしまいます。シート1を非表示にし、無事印刷のマクロを実行する為の記述を教えてください。

A 回答 (5件)

Sheet1は印刷する必要があると思って回答していました。


補足を見ると、Sheet1の表示、非表示にかかわらずSheet1は印刷の必要はないようなので簡単にしました。

補足がSheet2だけのことなのか分かりませんので Select Case の中で印刷範囲の設定、印刷、印刷範囲の解除をしています。

Sub 印刷test()
  Dim ws As Worksheet 'ワークシート

  For Each ws In Worksheets '全てのシートを調べる
    With ws
      Select Case .Name
        Case "Sheet2"
          .PageSetup.PrintArea = "A1:AB42"
          .PrintPreview
          .PageSetup.PrintArea = ""
        Case "Sheet3"
          .PrintPreview
        Case "Sheet4"
          .PrintPreview
      End Select
    End With
  Next
End Sub

蛇足ですが・・・・・・
Sheet2、Sheet3、Sheet4のみを印刷したいなら直接的に書いたほうが分かりやすいかもしれません。(下記)
また、PrintAreaの指定が固定であれば、シート上(印刷範囲の設定)で設定しておけばマクロの中で設定する必要はありません。
印刷範囲が変動する場合はマクロの中で自動的に設定したりします。マクロの実行のたびに印刷範囲を変更するとマクロの意味がなくなってしまいます。
1つのシートの印刷範囲を1種類にしておけば、そのシートの余白などの細かい印刷設定をシート上(プレビュー)で行えば、マクロ側ではほとんど設定する必要はありません。(今回はExcel2000です。同じでしょう)

Sub 印刷test2()
  With Worksheets("Sheet2")
    .PageSetup.PrintArea = "A1:AB42"
    .PrintPreview
    .PageSetup.PrintArea = ""
  End With

  With Worksheets("Sheet3")
    .PrintPreview
  End With

  With Worksheets("Sheet4")
    .PrintPreview
  End With
End Sub

最後に、マクロを記録した結果から不必要な箇所を除いたり、繰り返し処理、判定処理を組み込むようにすれば間違いが減り、分かりやすく短くなり、上達すると思います。
    • good
    • 0
この回答へのお礼

いろいろ教えていただきまして、ありがとうございました。
VBAを始めて、1週間がたちましたが、詳しく教えていただいたので
VBAの作成の方法がだいぶわかりました。本を読んでやっていたときは
さっぱりわかりませんでしたが、親切に教えていただいたおかげで助かりました
また、何か質問をする事がありかもわかりませんが、そのときはよろしくお願いします。

お礼日時:2002/01/11 18:55

少し書き換えてみました。

コメントを見てもらえば行っていることは分かると思います。

Excel97で動作確認しました。ご参考に。

Sub 印刷test()
  Dim ws As Worksheet 'ワークシート
  Dim PrintFlg As Boolean '印刷するかの判定

  On Error GoTo ErrorHandler 'エラー対応(非表示シート対応)

  For Each ws In Worksheets '全てのシートを調べる
    Select Case ws.Name
      '印刷したいシートは PrintFlg を True にする
      Case "Sheet1": PrintFlg = True
      Case "Sheet2": PrintFlg = True
      Case "Sheet3": PrintFlg = True
      Case "Sheet4": PrintFlg = True
      '上以外のシート名なら PrintFlg は False
      Case Else: PrintFlg = False
    End Select
    If PrintFlg = True Then ws.PrintPreview '今はプレビュー。PrintOutで印刷
  Next

  Exit Sub '終わり

ErrorHandler:
  'シートが非表示の場合
  If Err = 1004 Then
    ws.Visible = True '表示する
    ws.PrintPreview '今はプレビュー。PrintOutで印刷
    ws.Visible = False '非表示に戻す
  End If
  Resume Next '次の処理
End Sub

この回答への補足

もうひとつ、教えてください。よろしくお願いします。
---------------------------------------------------------------------
Sub 印刷test()
  Dim ws As Worksheet 'ワークシート
  Dim PrintFlg As Boolean '印刷するかの判定

  On Error GoTo ErrorHandler 'エラー対応(非表示シート対応)

  For Each ws In Worksheets '全てのシートを調べる
    Select Case ws.Name
      '印刷したいシートは PrintFlg を True にする
      Case "Sheet2": PrintFlg = True
      Case "Sheet3": PrintFlg = True
      Case "Sheet4": PrintFlg = True
      '上以外のシート名なら PrintFlg は False
      Case Else: PrintFlg = False
    End Select
    If PrintFlg = True Then ws.PrintPreview '今はプレビュー。PrintOutで印刷
  Next

  Exit Sub '終わり

ErrorHandler:
  'シートが非表示の場合
  If Err = 1004 Then
    ws.Visible = True '表示する
    ws.PrintPreview '今はプレビュー。PrintOutで印刷
    ws.Visible = False '非表示に戻す
  End If
  Resume Next '次の処理
End Sub
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
上記のマクロに下記のマクロを書き込みたいのですが教えてください

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Sub printappointedrange()

Worksheets("Sheet2").Activate
Range("A1:AB42").Select 'セル範囲の選択

With ActiveSheet
.PageSetup.PrintArea = Selection.Address '印刷範囲の指定
.PrintOut '印刷
.PageSetup.PrintArea = False '印刷範囲のクリア
End With

End sub
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

補足日時:2002/01/10 20:16
    • good
    • 0

#2以外の方法です



On Error Resume Next

Sheets("sheet1").PrintOut Copies:=1
Sheets("sheet2").PrintOut Copies:=1
Sheets("sheet3").PrintOut Copies:=1
Sheets("sheet4").PrintOut Copies:=1

という方法です。
On Error Resume Nextでエラーとなっても強制的に次のステートメントを実行します。
あまり勧めれませんが・・・
    • good
    • 0

2.への回答です



If Worksheets("sheet1").Visible = True Then
 Sheets("sheet1").Select
 ActiveWindow.SelectedSheets.PrintOut Copies:=1
End If
If Worksheets("sheet2").Visible = True Then
 Sheets("sheet2").Select
 ActiveWindow.SelectedSheets.PrintOut Copies:=1
End If
    :

こんな感じでしょうか?
    • good
    • 0

1)


ActiveWindow.SelectedSheets.PrintOut Copies:=1 ←これを消せば良いです。
Sheets("sheet1").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet2").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet3").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets("sheet4").Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
Sheets().selectで、それぞれのシートをアクティブにして、
Active…でアクティブなシートを印刷してますので、最初のシート5の状態で印刷している部分が不要でしょう。

2)
非表示なのでシートを選択できないのが原因ではないでしょうか。
ちょっと回避策はすぐには浮かばないです。
    • good
    • 0

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