- ベストアンサー
特定のセルに文字が入力されているページの印刷VBA
エクセルVBAで質問が2つあります。 エクセルシートは改ページプレビューでページ毎の印刷範囲が見えるようになっています。 (1)コマンドボックスを押したらE4~E963又はB4~B963のセルに文字が入力されているページのみ印刷するVBAはどの様にすれば宜しいでしょうか? (2)コマンドボックスを押すとインプットボックスが表示され、その中に数字を入力したら、その入力されたページのみを印刷するVBAはどの様にすれば宜しいでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
(1)については、 印刷するページ群が縦方向にのみ並んでいるのであれば、 作業列としてZ列を使う前提で こんなコードになるんじゃないかと思います。 (2)はすでにNo.2で掲示されたコードでいいんじゃないかと思います。 (どこが期待と異なるのかがわかりません) Sub Sample1() Dim C As HPageBreak Dim PageNum As Long Dim RowCounter As Long Dim PSLine As Long Dim PELine As Long Dim PrinPage As Long Dim PrinSW As Boolean Const wkCol = 26 '作業列Z '作業列クリアー ActiveSheet.Columns(wkCol).ClearContents '印刷範囲開始行、終了行を取得 With Range(ActiveSheet.PageSetup.PrintArea) PSLine = .Rows.Row PELine = PSLine + .Rows.Count - 1 End With '作業列、ページ末行にページ番号を格納 PageNum = 0 For Each C In ActiveSheet.HPageBreaks PageNum = PageNum + 1 ActiveSheet.Cells(C.Location.Row - 1, wkCol).Value = PageNum Next C ActiveSheet.Cells(PELine, wkCol).Value = PageNum + 1 '印刷対象か?を判断して印刷 PrinSW = False With ActiveSheet For RowCounter = PSLine To PELine 'B列orE列がNull以外? If ((.Cells(RowCounter, 2).Value <> "") Or _ (.Cells(RowCounter, 5).Value <> "")) Then PrinSW = True End If PrinPage = Val(.Cells(RowCounter, wkCol).Value) If ((PrinSW = True) And _ (PrinPage <> 0)) Then PrinSW = False .PrintOut from:=PrinPage, To:=PrinPage End If Next RowCounter End With End Sub
その他の回答 (5)
- chayamati
- ベストアンサー率41% (260/624)
今日は 質問の意味は全ての印刷で頁の内容を同じにするには 1ページの行数毎に改ページを入れる この行数はテキストボックスを添付のように配置し、 プロパティーのValueに、PrinObject=false にします --------------------------------------------------------- Option Explicit Private Sub 指定頁No._LostFocus() 改頁挿入 Range("A1").Select ActiveSheet.PrintOut From:=指定頁No., To:=指定頁No., Preview:=True ActiveSheet.ResetAllPageBreaks 'すべての改ページを解除 End Sub Private Sub 報告書印刷_Click() 改頁挿入 ActiveSheet.Range("$Z$1:$Z$1000").AutoFilter Field:=1, Criteria1:="<>" ActiveSheet.PrintOut , , Preview:=True ActiveSheet.ShowAllData ActiveSheet.ResetAllPageBreaks 'すべての改ページを解除 End Sub Private Sub 改頁挿入() Dim I As Integer, L As String ActiveSheet.ResetAllPageBreaks For I = 頁内行数 To 2000 Step 頁内行数 L = "A" & I ActiveSheet.HPageBreaks.Add Range(L) Next I End Sub
お礼
この度は回答して頂きありがとうございます。 参考になりました。
- chayamati
- ベストアンサー率41% (260/624)
お早うございます。 ActiveXコントロールボックスの配置の流れです。 1.報告書印刷のコマンドボックスをボタン(ActiveXコントロール)で配置 【開発リボン】⇒【挿入】⇒【任意のセル】⇒【斜め下にドラッグ】 ⇒【(オブジェクト名)に「報告書印刷」と入力】⇒【「コーディング入力」】 ⇒【コーディング枠の右上の✖でコーディングを終了】 2.指定頁No.のラベルボックスをラベル(ActiveXコントロール)で配置 ⇒【挿入】⇒【ラベル(ActiveXコントロール)】⇒【任意のセル】 ⇒【斜め下にドラッグ】⇒【プロパティ】⇒【Captionに「指定頁」と入力】 3.指定頁のテキストボックスをTEXT(ActiveXコントロール)で配置 【開発リボン】⇒【挿入】⇒【テキストボタン】⇒【任意のセル】 ⇒【斜め下にドラッグ】⇒【プロパティ】 ⇒【(オブジェクト名)に「指定頁No.」と入力】 ⇒【出来たボックスをダブルクリック】⇒【上辺右側の右端▼】 ⇒【LosutoFoucus】⇒【「コーディング入力」】 ⇒【コーディング枠の右上の✖でコーディングを終了】 ------- このActiveXコントロールは プロパティーのBackColor、ForColorで背景色、文字色を設定できます。
お礼
この度は回答して頂きありがとうございます。 参考になりました。
- chayamati
- ベストアンサー率41% (260/624)
今日は ご希望通りではないですが、近いものが出来ました。 報告書印刷のボタンボックス、頁指定のテキストボックス、 指定頁のラベルボックスの3つで構成 何れもActiveXのコントロールです。 コントロール名と表示名はボックスのプロパティのオブジェクト名 Captionに定義します。 こちらのコーディングは開発リボンからデザインモードクリックから始めます。 先ず結論は Option Explicit '-------------------------------------- Private Sub 指定頁_Click() Range("A1").Select ActiveSheet.PrintOut From:=指定頁No., To:=指定頁No., Preview:=True End Sub ’------------------------------------------ Private Sub 報告書印刷_Click() ActiveSheet.Range("$Z$1:$Z$1000").AutoFilter Field:=1, Criteria1:="<>" ActiveSheet.PrintOut , , Preview:=True ActiveSheet.ShowAllData End Sub これをコピペするには三つのボックスを配置した後コードの表示をクリック
お礼
この度は回答して頂きありがとうございます。 参考になりました。
- watabe007
- ベストアンサー率62% (476/760)
>インプットボックスで入力したページの所を印刷させます。 Dim PN As Long PN = Val(InputBox("改ページプレビューで表示されているページ数の" & _ vbCrLf & "数字のみを入力してOKボタンを押して下さい。")) If PN = 0 Then Exit Sub ActiveSheet.PrintOut From:=PN, To:=PN
お礼
この度は回答して頂きありがとうございます。 参考になりました。
補足
質問1の部分で、フィルターを使用した場合、E4~E963又はB4~B963の範囲で文字が入力した所だけが順番に詰めて表示され、その状態で印刷されます。 そうでは無く、仮にE4(1ページ目)とE36(2ページ目)E127(5ページ目)に文字が入力されていた場合、改ページプレビューに表示されている1ページ目と2ページ目と5ページ目を自動で抽出して印刷するVBAについて質問しています。
- chayamati
- ベストアンサー率41% (260/624)
今晩は自分でもわかりにくい回答になったと思ています。ご容赦を 不明なところはコメント下さい (1)コマンドボックスを押したら E4~E963又は B4~B963の セルに文字が入力されているページのみ印刷するVBA ★フィルターツールを利用するため使用していないZ列に 1-1.Z4=B4&E4と入力しこの列全てに適用します。 1-2.マクロの記録(マクロ名は「印刷」 マクロの記録は大丈夫ですね なぜか印刷、プレビューは記録してくれませんので フィルターの設定とフィルタのクリアの定義をして下さい 出来上がったマクロ(VBA)にはやり直しも含めえて 余分な命令文が記述されますが 有効なのはフィルターの設定文分とクリア文だけです この2つの命令文の間にプレビュー文を記述して Sub 印刷() ActiveSheet.Range("$Z$1:$Z$1000").AutoFilter Field:=1, Criteria1:="<>" ActiveSheet.PrintOut , , Preview:=True ActiveSheet.ShowAllData End Sub 1-3.コマンドボタンにマクロ(VBA)を適用 開発リボン⇒挿入⇒ボタン(フォームコントロール)⇒任意のセル ⇒印刷規定値が印刷対象外が規定値です。 このボタンの表示は「」ボタン1ですが、これを「印刷」に変更 クリックでマクロが起動します。 右クリックで編集モードになります。 (2)コマンドボックスを押すとインプットボックスが表示され、 その中に数字を入力したら、その入力されたページのみを印刷する VBAはどの様にすれば宜しいでしょうか? ★開始ページをセルAA2,終了頁をセルABに入力VBAを次のようにします Sub 印刷() ActiveSheet.Range("$Z$1:$Z$1000").AutoFilter Field:=1, Criteria1:="<>" ActiveSheet.PrintOut From:=Range("AA2"), To:=Range("AB2"), Preview:=True ActiveSheet.ShowAllData End Sub
お礼
この度は回答して頂きありがとうございます。 参考になりました。
補足
2の質問の補足です。 コマンドボックスをクリックするとインプットボックスが表記され「改ページプレビューで表示されているページ数の数字のみを入力してOKボタンを押して下さい。」と表記させ(例えば10ページ目を印刷させたかったらインプットボックスに10と入力させ→OKボタンを押すと10ページのみが印刷される)と言う意味です。 改ページプレビューの印刷範囲はA1~J963の範囲です。 (2)の質問では、例え空白のセルの場合でも、インプットボックスで入力したページの所を印刷させます。
お礼
ありがとうございます。 私が求めたVBAでした。