• ベストアンサー

特定のセルに文字が入力されているページの印刷VBA

エクセルVBAで質問が2つあります。 エクセルシートは改ページプレビューでページ毎の印刷範囲が見えるようになっています。 (1)コマンドボックスを押したらE4~E963又はB4~B963のセルに文字が入力されているページのみ印刷するVBAはどの様にすれば宜しいでしょうか? (2)コマンドボックスを押すとインプットボックスが表示され、その中に数字を入力したら、その入力されたページのみを印刷するVBAはどの様にすれば宜しいでしょうか?

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.3

(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

noname#247334
質問者

お礼

ありがとうございます。 私が求めたVBAでした。

その他の回答 (5)

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.6

今日は 質問の意味は全ての印刷で頁の内容を同じにするには 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

noname#247334
質問者

お礼

この度は回答して頂きありがとうございます。 参考になりました。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.5

お早うございます。 ActiveXコントロールボックスの配置の流れです。 1.報告書印刷のコマンドボックスをボタン(ActiveXコントロール)で配置  【開発リボン】⇒【挿入】⇒【任意のセル】⇒【斜め下にドラッグ】 ⇒【(オブジェクト名)に「報告書印刷」と入力】⇒【「コーディング入力」】 ⇒【コーディング枠の右上の✖でコーディングを終了】 2.指定頁No.のラベルボックスをラベル(ActiveXコントロール)で配置  ⇒【挿入】⇒【ラベル(ActiveXコントロール)】⇒【任意のセル】  ⇒【斜め下にドラッグ】⇒【プロパティ】⇒【Captionに「指定頁」と入力】 3.指定頁のテキストボックスをTEXT(ActiveXコントロール)で配置  【開発リボン】⇒【挿入】⇒【テキストボタン】⇒【任意のセル】 ⇒【斜め下にドラッグ】⇒【プロパティ】 ⇒【(オブジェクト名)に「指定頁No.」と入力】 ⇒【出来たボックスをダブルクリック】⇒【上辺右側の右端▼】 ⇒【LosutoFoucus】⇒【「コーディング入力」】 ⇒【コーディング枠の右上の✖でコーディングを終了】 ------- このActiveXコントロールは プロパティーのBackColor、ForColorで背景色、文字色を設定できます。

noname#247334
質問者

お礼

この度は回答して頂きありがとうございます。 参考になりました。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.4

今日は ご希望通りではないですが、近いものが出来ました。 報告書印刷のボタンボックス、頁指定のテキストボックス、 指定頁のラベルボックスの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 これをコピペするには三つのボックスを配置した後コードの表示をクリック

noname#247334
質問者

お礼

この度は回答して頂きありがとうございます。 参考になりました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

>インプットボックスで入力したページの所を印刷させます。 Dim PN As Long PN = Val(InputBox("改ページプレビューで表示されているページ数の" & _ vbCrLf & "数字のみを入力してOKボタンを押して下さい。")) If PN = 0 Then Exit Sub ActiveSheet.PrintOut From:=PN, To:=PN

noname#247334
質問者

お礼

この度は回答して頂きありがとうございます。 参考になりました。

noname#247334
質問者

補足

質問1の部分で、フィルターを使用した場合、E4~E963又はB4~B963の範囲で文字が入力した所だけが順番に詰めて表示され、その状態で印刷されます。 そうでは無く、仮にE4(1ページ目)とE36(2ページ目)E127(5ページ目)に文字が入力されていた場合、改ページプレビューに表示されている1ページ目と2ページ目と5ページ目を自動で抽出して印刷するVBAについて質問しています。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.1

今晩は自分でもわかりにくい回答になったと思ています。ご容赦を 不明なところはコメント下さい (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

noname#247334
質問者

お礼

この度は回答して頂きありがとうございます。 参考になりました。

noname#247334
質問者

補足

2の質問の補足です。 コマンドボックスをクリックするとインプットボックスが表記され「改ページプレビューで表示されているページ数の数字のみを入力してOKボタンを押して下さい。」と表記させ(例えば10ページ目を印刷させたかったらインプットボックスに10と入力させ→OKボタンを押すと10ページのみが印刷される)と言う意味です。 改ページプレビューの印刷範囲はA1~J963の範囲です。 (2)の質問では、例え空白のセルの場合でも、インプットボックスで入力したページの所を印刷させます。

関連するQ&A