人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

EXCELマクロに詳しい方、何度も同じ質問ですみませんが、解決出来ないのでもう一度お聞きします。
下記のVBAの中に
To Printsheet 3,6
From Printsheet 3,9
Toがブランクの場合は ?From
Fromがブランクの場合は To?
が印刷出来るように変更する構文を教えてください。
Printsheet 6,47 をキーにDataSheetからVLOOKUPで
値を返すようになっています。

Sub 一括出力()
' 一括出力 Macro
'
Dim PrintSheet As Worksheet
Dim DataSheet As Worksheet
Dim r As Long

Set PrintSheet = Worksheets("A)")
Set DataSheet = Worksheets("B)")

Application.ScreenUpdating = False
Application.DisplayAlerts = False

r = 9

Do While DataSheet.Cells(r, 2).Value <> ""
If DataSheet.Cells(r, 1).Value >= 1 And DataSheet.Cells(r, 1).Value <> "" Then

PrintSheet.Cells(6, 47).Value = DataSheet.Cells(r, 1).Value

PrintSheet.Calculate

PrintSheet.PrintOut
' Debug.Print r, DataSheet.Cells(r, 1).Value
r = r + 1
Else
r = r + 1
End If
Loop

DataSheet.Select

Application.ScreenUpdating = True
Application.DisplayAlerts = True

MsgBox ("印刷が終了しました … " & (PrintSheet.Cells(6, 47).Value) & " 件印刷しました。")

End Sub

●質問者: mokachan
●カテゴリ:コンピュータ 学習・教育
✍キーワード:application AS LOOP print SELECT
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● きゃづみぃ
●27ポイント

最初に

Set PrintSheet = Worksheets("A)")

Set DataSheet = Worksheets("B)")

で ) が 入ってるのは シート名が そのようになっていれば 問題ないです。


Printsheet 6,47 をキーにDataSheetからVLOOKUPで

値を返すようになっています。

これが どういう意味なのか 推測しかねるので

PrintSheet.Cells(6, 47).Value = DataSheet.Cells(r, 1).Value

が正しいのか 判断がつきません。

また 何度も この処理を 行うと PrintSheet.Cells(6, 47).Value の値が

最後にセットしたものに なってしまうので

MsgBox ("印刷が終了しました … " & (PrintSheet.Cells(6, 47).Value) & " 件印刷しました。")

で出力される件数が 正しいものでは ないと思われます。

合計ならば

PrintSheet.Cells(6, 47).Value = DataSheet.Cells(r, 1).Value

の部分を

PrintSheet.Cells(6, 47).Value = PrintSheet.Cells(6, 47).Value + DataSheet.Cells(r, 1).Value

とやったほうがいいでしょう。

◎質問者からの返答

お返事遅くなってごめんなさい。

回答ありがとうございました。

今回は、neuromancer_shoさんのVBAでうまく印刷出来ました。

ただ、ダイアログボックスに印刷枚数がちゃんと出ないので

いろいろな方の答えを試して見ましたがダメなようでした。


2 ● Mook
●27ポイント

いま一つ状況が不明ですが、どの点が問題なのでしょうか。

質問はすぐに閉じる必要はありませんので、解決するまで一つの質問で進めては

どうでしょうか。


不明な点はコメントで状況を確認したいので、有効にお願いします。


一応、こちらで想定する内容をコード上のコメントに記載しました。

こちらの内容を確認してみて、実際と異なる部分がありましたらコメントください。

Sub 一括出力()
' 一括出力 Macro
'
Dim PrintSheet As Worksheet
Dim DataSheet As Worksheet
Dim r As Long
 Set PrintSheet = Worksheets("A)")
 Set DataSheet = Worksheets("B)")
 
 Application.ScreenUpdating = False
 
 Dim cnt As Long
'--- 開始行を設定
 Dim startRow As Long
 startRow = 9  '--- 9行目を仮設定
 If Not IsEmpty(PrintSheet.Cells(3, 6).Value) Then  '--- "A)" シートの "F3"
 If IsNumeric(PrintSheet.Cells(3, 6).Value) Then
 startRow = PrintSheet.Cells(3, 6).Value
 End If
 End If

'--- 終了行を設定
 Dim endRow As Long
 endRow = PrintSheet.Range("B" & Rows.Count).End(xlUp).Row  '--- B 列のデータの最終行を仮設定
 If Not IsEmpty(PrintSheet.Cells(3, 9).Value) Then  '--- "A)" シートの "I3"
 If IsNumeric(PrintSheet.Cells(3, 9).Value) Then
 endRow = PrintSheet.Cells(3, 9).Value
 End If
 End If

 MsgBox startRow & "行目?" & endRow & "行目まで処理します。"
 
 For r = startRow To endRow
'--- "B)"シートのB列にデータがなかったら途中で終了
If DataSheet.Cells(r, "B").Value = "" Then Exit For
'--- A列の r 行目に1以上の数値があったら処理
If DataSheet.Cells(r, "A").Value >= 1 And DataSheet.Cells(r, "A").Value <> "" Then
 PrintSheet.Cells(6, 47).Value = DataSheet.Cells(r, "A").Value
 PrintSheet.Calculate
'--- とりあえずプレビュー
 PrintSheet.PrintPreview
'--- PrintSheet.PrintOut
 cnt = cnt + 1
 End If
 Next
 
 DataSheet.Activate
 Application.ScreenUpdating = True
 MsgBox "印刷が終了しました。" & vbNewLine & cnt & " 件印刷しました。"
End Sub
◎質問者からの返答

MOOkさん

回答ありがとうございました。

(送信したつもりが出来ていなくて、遅くなってすみません)

MOOKさんは毎回親切にご回答頂いたりお心配りを頂き、大変感謝しております。

また、私の質問が分かりにくくてすみません。

neuromancer_shoさんのVBAでうまく印刷出来ました。

ただ、ダイアログボックスに印刷枚数がちゃんと出ないので

いろいろな方の答えを試して見ましたがダメなようでした。


3 ● neuromancer_sho
●26ポイント

質問者さんはFromとToの意味を逆に覚えていらっしゃるとすれば、こうだと思います。

Sub 一括出力()

' 一括出力 Macro

'

Dim PrintSheet As Worksheet

Dim DataSheet As Worksheet

Dim r As Long, FromValue As Long, ToValue As Long

Set PrintSheet = Worksheets("A)")

Set DataSheet = Worksheets("B)")

If PrintSheet.Cells(3, 6) = "" Then

FromValue = 1

Else

FromValue = PrintSheet.Cells(3, 6)

End If

If PrintSheet.Cells(3, 9) = "" Then

ToValue = 99999

Else

ToValue = PrintSheet.Cells(3, 9)

End If

Application.ScreenUpdating = False

Application.DisplayAlerts = False

r = 9

Do While DataSheet.Cells(r, 2).Value <> ""

If DataSheet.Cells(r, 1).Value >= FromValue And DataSheet.Cells(r, 1).Value <= ToValue Then

PrintSheet.Cells(6, 47).Value = DataSheet.Cells(r, 1).Value

PrintSheet.Calculate

PrintSheet.PrintOut

' Debug.Print r, DataSheet.Cells(r, 1).Value

r = r + 1

Else

r = r + 1

End If

Loop

DataSheet.Select

Application.ScreenUpdating = True

Application.DisplayAlerts = True

MsgBox ("印刷が終了しました … " & (PrintSheet.Cells(6, 47).Value) & " 件印刷しました。")

End Sub

◎質問者からの返答

回答ありがとうございました。

おかげさまでneuromancer_shoさんのVBAでうまく印刷出来ました。

ただ、ダイアログボックスに印刷枚数がちゃんと出ないので

いろいろな方の答えを試して見ましたがダメなようでした。


4 ● Mook
●10ポイント

コメントが有効でないので、こちらで失礼します。


不明な点があるのですが、質問内にある下記の行はどういう意味で記述されているのでしょうか。

 r=9

こちらの理解は「データは9行目から始まっている」だったのですが、neuromancer_sho さんので期待通りで

あったということは、1行目からが対象データでしょうか。


であれば先の回答の16行目の

 startRow = 9 '--- 9行目を仮設定

 startRow = 1 '--- 1行目を仮設定

に、25行目の

 endRow = PrintSheet.Range("B" & Rows.Count).End(xlUp).Row '--- B 列のデータの最終行を仮設定

 endRow = DataSheet.Range("B" & Rows.Count).End(xlUp).Row '--- B 列のデータの最終行を仮設定

にして、試してみていただけますか?

印刷枚数は実際の処理をカウントしているので、そちらでどうか確認いただけるでしょうか。


マクロの内容をご自身で多少なりとも手直しできるればよいのですが、何も手を入れずに期待通りの動作を

するものを提示するためには、細かな修正のためのやり取りが必要です。

その意味でもコメントを有効にしていただいた方がよいかと思います。


5 ● neuromancer_sho
●10ポイント

印刷枚数をちゃんと出したければ、最後のところを

MsgBox ("印刷が終了しました … " & r-9 & " 件印刷しました。")

としてください。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ