OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

エクセルのマクロの記述について

  • すぐに回答を!
  • 質問No.195333
  • 閲覧数530
  • ありがとう数1
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 52% (151/290)

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を非表示にし、無事印刷のマクロを実行する為の記述を教えてください。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.5
レベル13

ベストアンサー率 68% (791/1163)

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

最後に、マクロを記録した結果から不必要な箇所を除いたり、繰り返し処理、判定処理を組み込むようにすれば間違いが減り、分かりやすく短くなり、上達すると思います。
お礼コメント
m-happy-t

お礼率 52% (151/290)

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

その他の回答 (全4件)

  • 回答No.1
レベル14

ベストアンサー率 24% (612/2465)

1) ActiveWindow.SelectedSheets.PrintOut Copies:=1 ←これを消せば良いです。 Sheets("sheet1").Select ActiveWindow.SelectedSheets.PrintOut Copies:=1 Sheets("sheet2").Select ActiveWindow.Selec ...続きを読む
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)
非表示なのでシートを選択できないのが原因ではないでしょうか。
ちょっと回避策はすぐには浮かばないです。

  • 回答No.2
レベル9

ベストアンサー率 59% (32/54)

2.への回答です If Worksheets("sheet1").Visible = True Then  Sheets("sheet1").Select  ActiveWindow.SelectedSheets.PrintOut Copies:=1 End If If Worksheets("sheet2").Visible = ...続きを読む
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
    :

こんな感じでしょうか?
  • 回答No.3
レベル9

ベストアンサー率 59% (32/54)

#2以外の方法です On Error Resume Next Sheets("sheet1").PrintOut Copies:=1 Sheets("sheet2").PrintOut Copies:=1 Sheets("sheet3").PrintOut Copies:=1 Sheets("sheet4&qu ...続きを読む
#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でエラーとなっても強制的に次のステートメントを実行します。
あまり勧めれませんが・・・
  • 回答No.4
レベル13

ベストアンサー率 68% (791/1163)

少し書き換えてみました。コメントを見てもらえば行っていることは分かると思います。 Excel97で動作確認しました。ご参考に。 Sub 印刷test()   Dim ws As Worksheet 'ワークシート   Dim PrintFlg As Boolean '印刷するかの判定   On Error GoTo ErrorHandler ...続きを読む
少し書き換えてみました。コメントを見てもらえば行っていることは分かると思います。

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
補足コメント
m-happy-t

お礼率 52% (151/290)

もうひとつ、教えてください。よろしくお願いします。
---------------------------------------------------------------------
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:22
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ