アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。
エクセルのVBAについて教えてください。(初心者)

 "シートA!"(印刷用データ)のAG15("シートB!"の2ページ目先頭セル)のセルが空欄なら、"シートB!"(印刷用フォーマット)の40~390行(2ページ目~最終10ページ目)を非表示に、
 "シートA!"(印刷用データ)のAG30("シートB!"の3ページ目先頭セル)のセルが空欄なら、"シートB!"(印刷用フォーマット)の79~390行(3ページ目~最終10ページ目)を非表示に、
 "シートA!"(印刷用データ)のAG45("シートB!"の4ページ目先頭セル)のセルが空欄なら、"シートB!"(印刷用フォーマット)の118~390行(4ページ目~最終10ページ目)を非表示に、
 "シートA!"(印刷用データ)のAG60("シートB!"の5ページ目先頭セル)のセルが空欄なら、"シートB!"(印刷用フォーマット)の157~390行(5ページ目~最終10ページ目)を非表示。・・・・
 と、いうような、

 "シートB!"(印刷用フォーマット)の先頭ページのセルが空欄なら、そのページ以降は非表示にする (印刷範囲が1ページ分しか無いなら2ページ目以降はいらないから自動で非表示にしたい)。
 [シートタブ]→[右クリック]→[コードの表示]の所に貼り付けるVBA入力方法を教えてください。

 質問は"シートB!"にVBA入力を考えていますが、"シートA!"に入力でも構いません。

似たような質問を参考に何度も試しましたが、上手くいきませんでした。

どうしても作りたいので、どうか助けて下さい。
よろしくお願いします。

質問者からの補足コメント

  • うーん・・・

    ご回答ありがとうございます。今一度お願いします。

    「シートAにVBA入力を考えています。」
    ※ 作りたいVBAは、他のアプリよりエクセルにデータをエクスポートする場所が
    シートA(印刷用データ)です。

    シートA(印刷用データ)のAG15のセルが
    シートB(印刷用フォーマット)の2ページ目の先頭データになるので、
    シートA(印刷用データ)のAG15のセルが空欄なら、
    シートB(印刷用フォーマット)の40~390行(2ページ目~最終10ページ目)を非表示に。

    ・・・シートAのAG135のセルが空欄なら、
    シートBの352~390行(最終10ページ目)を非表示。

    (補足) シートBのセルには、シートAのデータを転送する関数が既に入っているので、
    「シートAの・・セルが空欄なら」で考えています。
    (補足) シートBの列はA~BC迄使用

    「エクセル VBA 複数条件に対した印刷ペ」の補足画像1
    No.3の回答に寄せられた補足コメントです。 補足日時:2019/08/20 02:12
  • 補足追加画像その①

    「エクセル VBA 複数条件に対した印刷ペ」の補足画像2
      補足日時:2019/08/20 02:15
  • 補足追加画像その②

    ※ シートAの空欄確認セルはAG15,AG30,AG45,AG60,AG75,AG90,AG105,AG120,AG135です。

    ※ シートBの様式は1ページ目が13明細、残り9ページは15明細になっています。

    何卒よろしくお願いします。

    「エクセル VBA 複数条件に対した印刷ペ」の補足画像3
      補足日時:2019/08/20 02:32
  • うれしい

    早速、質問した通りのご回答本当に有り難うございます。
    少し、試してみましたが上手くいかず、何も変化が有りません。
    でも、私のやり方が間違っていると思うので少し時間を掛けてやってみます。

     確認ですが、考えて頂いたVBAの入力は、シートAで宜しいですか?
    あまり詳しくないので・・・。

     もう少しやってみた後、結果を報告します。
    親切にして戴き、有り難うございました。

      補足日時:2019/08/20 21:39

A 回答 (7件)

Ctrl+F11で起動し 表ジョンモジュールを挿入、


コードをコピペ下した、VBEの画像です。
「エクセル VBA 複数条件に対した印刷ペ」の回答画像7
    • good
    • 0

>確認ですが、考えて頂いたVBAの入力は、シートAで宜しいですか?



VBEを立ち上げます。Excelを開いて Ctrl + F11 を同時に押します。 エディターが立ち上がったら、上の挿入タグから
標準モジュールを挿入します。 その標準モジュールにコードをコピペして、そのエクセルを名前を付けて保存します。保存時にマクロ有効ブックにしてください。

今回、作成したコードは、2つのプロシージャで構成しています。
コードの呼び出し方は、いくつかありますが、Alt+F8を押してマクロを図のようなダイアログからpage_setを選択して実行を押します。
また、コマンドボタンをシート上に設置して、そのボタンにpage_setを登録して実行する事も出来ます。
参考サイト:https://www.tipsfound.com/vba/01004

Sub page_set()の中で印刷ページの枚数をせってしています。
条件は、ページ数をシートA(シートの名前)のAG15、、、が空欄でないと言う条件。
コードで示すと If Worksheets("シートA").Range("AG" & i).Value <> "" Then ここです。
"シートA"が実際のシート名と同じ(半角や全角も同じ)かどうか確認してください。場合によっては、シートタグをダブルクリック、Ctrl+C、コードのシートAを選択してCtrl+V

また、印刷するシート名も同様に同じか確認してください。
コードは、Private Sub myHeader(page_value As Long)内の "印刷用フォーマット"がそれにあたります。(印刷するページのシート名)

以上ご確認ください。
「エクセル VBA 複数条件に対した印刷ペ」の回答画像6
    • good
    • 0

すみません。

ここが違いました下記に変更してください。
Sub page_set()
Dim page_value As Long, i As Long, Rowscunt As Long
page_value = 0 'ここを変えました
For i = 15 To 135 Step 15
If Worksheets("シートA").Range("AG" & i).Value <> "" Then
page_value = page_value + 1
Rowscunt = Rowscunt + i
Rows("1:" & Rowscunt).Hidden = False
Else
Exit For
End If
Next
if page_value = 0 then Exit Sub 'ここを変えました
Call myHeader(page_value)
End Sub
    • good
    • 0

情報に基づき変更してみましたが、いかがでしょう?


シート名は実際に合わせて変更してください。
デバックしていないので、エラーなど発生した場合は、情報をください。

Sub page_set()
Dim page_value As Long, i As Long, Rowscunt As Long
page_value = 1
For i = 15 To 135 Step 15
If Worksheets("シートA").Range("AG" & i).Value <> "" Then
page_value = page_value + 1
Rowscunt = Rowscunt + i
Rows("1:" & Rowscunt).Hidden = False
Else
Exit For
End If
Next
Call myHeader(page_value)
End Sub

Private Sub myHeader(page_value As Long)
Dim i As Long, n As Long, RowN As Long
Dim W_RANGE As Range
Worksheets("印刷用フォーマット").Activate
Rows("1:" & Rows.Count).Hidden = True
ActiveSheet.PageSetup.PrintArea = ""
ActiveSheet.ResetAllPageBreaks
Set W_RANGE = Worksheets("印刷用フォーマット").Range("$A$1:$BC$39")
n = 0
For i = 1 To page_value
Set W_RANGE = Union(W_RANGE, Worksheets("印刷用フォーマット").Range("$A$" & n + 1 & ":$BC$" & n + 39))
n = n + 39
RowN = n + 1
ActiveSheet.HPageBreaks.Add Range("A" & RowN)
Next
ActiveSheet.VPageBreaks.Add Range("BD1")
W_RANGE.Name = "Print_Area"
With ActiveSheet.PageSetup
.PrintArea = "Print_Area"
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
End Sub
    • good
    • 0

ちょっとイミフの為、シートA!"(印刷用データ)のAGは無視しています。



ページ範囲が分からなかったので、"印刷用フォーマット"シート A1:H39 、、、10ページ と仮定して下記を作成しました
先頭行(A1,40,79,,,に値が入っていないと、そこでページ設定を確定します。ちなみにA1が空だとA40に値があっても
ページは作成されません。とにかく10ページまで探す場合は、下記のExit Forを消すか、コメントアウトしてください。
印刷範囲に関しては、手直しをしてください。
全ての行を非表示にしています。非表示処理は、処理速度が遅いので、Rows("1:" & Rows.Count).Hidden = True を
Rows("1:390").Hidden = True に必要に応じ、変更してください。
改ページの最適化は、行のみです。ご質問で列は不明の為。仮に'ActiveSheet.VPageBreaks.Add Range("H1")を書いてあります。(コメント)
ActiveSheet.ResetAllPageBreaksで改ページを削除しているので、(列方向もコードが必要になるかと思います)
使用している寄せ集めVBAで作ったので、読みにくいかも知れませんが、そこのところはかんべんで、、

Option Explicit
Sub page_set()
Dim page_value As Long, i As Long, Rowscunt As Long
Rows("1:" & Rows.Count).Hidden = True
page_value = 1
For i = 39 To 390 Step 39
If Worksheets("印刷用フォーマット").Range("A" & 1 + i).Value <> "" Then
page_value = page_value + 1
Rowscunt = Rowscunt + i
Rows("1:" & Rowscunt).Hidden = False
Else
Exit For
End If
Next
Call myHeader(page_value)
End Sub

Private Sub myHeader(page_value As Long)
Dim i As Long, n As Long, RowN As Long
Dim W_RANGE As Range
Worksheets("印刷用フォーマット").Activate
ActiveSheet.PageSetup.PrintArea = ""
ActiveSheet.ResetAllPageBreaks
Set W_RANGE = Worksheets("印刷用フォーマット").Range("$A$1:$H$39")
n = 0
For i = 1 To page_value
Set W_RANGE = Union(W_RANGE, Worksheets("印刷用フォーマット").Range("$A$" & n + 1 & ":$H$" & n + 39))
n = n + 39
RowN = n + 1
ActiveSheet.HPageBreaks.Add Range("A" & RowN)
Next
   'ActiveSheet.VPageBreaks.Add Range("H1")
W_RANGE.Name = "Print_Area"
With ActiveSheet.PageSetup
.PrintArea = "Print_Area"
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
End Sub
この回答への補足あり
    • good
    • 0

ごめん。


タイトルに書いてた…

非表示にする、と言うよりは、印刷時に、条件によって印刷部分を範囲指定すればどう?
VBAなら、改ページを入れる事も出来るし。
頑張ってね。
    • good
    • 0

たぶん、説明が下手。


その処理の目的や概要などを記載した方がいい。
画像なども載せた方がいい。

非表示とはセルの非表示?
なぜ非表示にしたい?
印刷させないってこと?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!