
vba初心者です。ネットを見ながら作成していますがどうしてもわかりません教えてください。
条件として
Sheet1のセルA2からA5にワークシート名(sheet1以外)を入れます。
Sheet1のセルB2からB5に印刷枚数をいれます。
例えば、A2「123」B2「「1」と入力すると、シート「123」を1枚印刷するようにしたいです。
但し、セルA3と一致するシートが無い場合は印刷を行わず、セルA4の印刷を実行、セルA5と一致するシートが無い場合は印刷を行わないようにしたいです。
最後にメッセージboxで印刷のできなかったシート名(=A列の値)を出したいです。
下記コードで印刷はできるのですが、シートが無かった場合の処理で止まってしまいます。
申し訳ありませんがお助けください。よろしくお願いします。
Sub 印刷()
Dim atai As String
Dim i As Long
Dim wS As Worksheet
Dim flag As Boolean
With Sheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
For Each wS In Worksheets
If wS.Name = .Cells(i, "A").Value Then flag = True
Next wS
If flag = True Then
atai = .Cells(i, "A").Value
Sheets(atai).PrintOut Copies:=.Cells(i, "B").Value
Else
MsgBox atai, vbInformation, vbInformation
End If
Next
End With
End Sub

No.4ベストアンサー
- 回答日時:
>シートが無かった場合の処理で止まってしまいます。
私がずいぶん前から使っている方法です。
dummy = Evaluate(ShName & "!A1") 'シートチェック用のダミー
If Not IsError(dummy)
という方法を取ります。しかし、以下では、次に飛ばさずに、メッセージを出して止まってしまいます。その代わりに、C列の同じ行数に「済」を入れるようにしています。なお、フォーム・コントロールのボタンにつけると良いかと思います。
'//
Sub PrintButton_Click()
Dim ShName As String
Dim Pg As Long
Dim i As Long, dummy As Variant
With Worksheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
ShName = .Cells(i, 1).Value
dummy = Evaluate(ShName & "!A1") 'シートチェック用のダミー
Pg = .Cells(i, 2).Value
If .Cells(i, 3).Value = "" Then '「済」判のチェック
If Not IsError(dummy) And Pg > 0 Then
Worksheets(ShName).PrintOut Copies:=Pg ', Preview:=True '試験用
DoEvents 'Esc を活かす
.Cells(i, 3).Value = "済" '印刷したら「済」を入れる
Else
MsgBox "シート" & ShName & "を" & Pg & "枚印刷する命令は無効です。", vbCritical
Exit For
End If
End If
Next i
.Select '念の為
End With
End Sub
WindFallerさん お返事ありがとうございます。
標準モジュールで試したら無事うまくいきました。
本当に色々なやり方があるのだなと感心させられます。
難しいところもあるので、ゆっくりと解読していきたいと思います。
教えてgooで質問すると、自分とのレベルの差を感じます。
これからもよろしくお願いします。
No.5
- 回答日時:
No.4の回答者です。
返事ありがとうございます。
私のコードはパーツで気に入った所があってら、それを使えばよいです。
これは、教えて!goo で覚えた方法です。
dummy = Evaluate(ShName & "!A1") 'シートチェック用のダミー
でも、質問のコードを直すというのか、最近の掲示板の流れのようですから、ちゃんとした解答にしておきます。
以下のようにすると、全体的には長くなりますが、とても分かりやすくなると思います。
'//ご質問のコードを直してみました。
Sub 印刷r()
Dim atai As String
Dim i As Long, cnt As Long
Dim flag As Boolean
With Sheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
atai = .Cells(i, "A").Value
cnt = .Cells(i, "B").Value '先に変数に入れておく
If IsShName(atai) And cnt > 0 Then 'ここでユーザー定義関数を使う 簡単になりました。
Sheets(atai).PrintOut Copies:=cnt 'No.4の回答者です。
返事ありがとうございます。
私のコードはパーツで気に入った所があってら、それを使えばよいです。
これは、教えて!goo で覚えた方法です。
dummy = Evaluate(ShName & "!A1") 'シートチェック用のダミー
との質問のコードを直すというのか、最近の掲示板の流れのようですから、ちゃんとした回答を出しておきます。
'//ご質問のコードを直してみました。
Sub 印刷r()
Dim atai As String
Dim i As Long, cnt As Long
Dim flag As Boolean
With Sheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
atai = .Cells(i, "A").Value
cnt = .Cells(i, "B").Value '先に変数に入れておく
If IsShName(atai) And cnt > 0 Then 'ここでユーザー定義関数を使う
Sheets(atai).PrintOut Copies:=cnt ', Preview:=True '実験用 プレビューで留まります。
Else
MsgBox atai & "というシートはありません。", vbCritical
End If
Next
End With
End Sub
'ユーザー定義関数でシート名をチェック
Function IsShName(wS As Variant) As Boolean
Dim sh As Object
For Each sh In Sheets
If LCase(wS) = LCase(sh.Name) Then '両方とも小文字にする
IsShName = True
Exit Function '見つかったら、ループより抜ける
End If
Next
End Function
Else
MsgBox atai & "というシートはありません。", vbCritical
End If
Next
End With
End Sub
'ユーザー定義関数でシート名をチェック
Function IsShName(wS As Variant) As Boolean
Dim sh As Object
For Each sh In Sheets
If LCase(wS) = LCase(sh.Name) Then '両方とも小文字にする
IsShName = True
Exit Function '見つかったら、ループより抜ける
End If
Next
End Function
WindFallerさん お返事ありがとうございます。
コードを解読して、気に入ったものがあれば使用させていただきます。
教えてgooは親切な方ばかりで感謝です。
No.3
- 回答日時:
ごめんなさい、間違えました。
これでいけるはずです。
If flag = True Then
Sheets(atai).PrintOut Copies:=.Cells(i, "B").Value
Else
atai = .Cells(i, "A").Value
MsgBox atai, vbInformation, vbInformation
End If
No.2
- 回答日時:
If flag = True Then
Sheets(atai).PrintOut Copies:=.Cells(i, "B").Value
Else
atai = .Cells(i, "A").Value
End If
next
MsgBox atai, vbInformation, vbInformation
下のところを
としたらどうでしょう?
No.1
- 回答日時:
flag が初期化されていませんね。
一度シートが見つかると、
flag が True のままですから
次のシートが見つからなかった場合にも
If flag = True Then ' <--- 真になってしまうので
atai = .Cells(i, "A").Value
Sheets(atai).PrintOut Copies:=.Cells(i, "B").Value
印刷されてしまいます。
flag のリセット処理を追加しましょう。
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
flag = False ' ここで初期化
For Each wS In Worksheets
bonaronさんお返事ありがとうざいます。
早速試してみたのですが、一部解決して一部未解決です。
エラー解消をして最後まで進むようになったところまではよかったのですが、
わたしのコードが根本的に間違っていたので、メッセージBOXに表示されるコメントが
印刷できなかったものではなく、印刷をしたものが表示されてしまいます。
今必死で解決策を探しているのですが、分かればすごく嬉しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) エクセルの印刷マクロについて質問があります。 現在、下記のマクロで印刷しています。Sheet1のD6 5 2023/06/12 10:59
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 複数シート一括作成後に、特定範囲の数式は値で貼り付けしたい 3 2022/10/07 11:18
- Visual Basic(VBA) 数式が消える 1 2023/03/19 16:55
このQ&Aを見た人はこんなQ&Aも見ています
-
EXCEL マクロ 条件の合ったシートだけ印刷したい
Excel(エクセル)
-
条件によって印刷するシートを変える方法 EXCEL-VBA
Excel(エクセル)
-
エクセルVBA Ifでシート名が合致したら別ファイルから転記する場合のElse IfとForの書き方
Visual Basic(VBA)
-
-
4
VBA シート名が一致した場合の転記内容について
Visual Basic(VBA)
-
5
excelのマクロで該当処理できなければ飛ばして進むにはどうすればよいのでしょうか
Visual Basic(VBA)
-
6
特定のセルに数値が入っているシートのみ印刷する方法
Excel(エクセル)
-
7
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
8
エクセルマクロでシート名を条件にする方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
IFステートの中にWithステート...
-
実行時エラー'1004': WorkSheet...
-
VBA 存在しないシートを選...
-
エクセルで通し番号を入れてチ...
-
エクセルVBA Ifでシート名が合...
-
excelのマクロで該当処理できな...
-
Excelマクロのエラーを解決した...
-
【ExcelVBA】全シートのセルの...
-
エクセルの特定のシートのみを...
-
【Excel VBA】Worksheets().Act...
-
エクセルで表の相違確認をVB...
-
【VBA】指定した検索条件に一致...
-
ユーザーフォームに入力したデ...
-
別のシートを参照して計算する方法
-
エクセルVBA 別シートからのコ...
-
エクセル VBA シートのコピー
-
Excel VBA シートを追加後に余...
-
エクセルの絶対参照の一括操作...
-
範囲を指定して別シートにコピペ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
実行時エラー'1004': WorkSheet...
-
XL:BeforeDoubleClickが動かない
-
エクセルVBA Ifでシート名が合...
-
実行時エラー1004「Select メソ...
-
エクセルのシート名変更で重複...
-
【ExcelVBA】全シートのセルの...
-
VBA 存在しないシートを選...
-
ブック名、シート名を他のモジ...
-
Excel チェックボックスにチェ...
-
VBA 検索して一致したセル...
-
エクセルで通し番号を入れてチ...
-
シートが保護されている状態で...
-
【VBA】特定の文字で改行(次の...
-
ExcelのVBAのマクロで他のシー...
-
Worksheet_Changeの内容を標準...
-
EXCELVBAを使ってシートを一定...
おすすめ情報