Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2013)
一覧表シートからレイアウトシートに印刷
投稿日時: 17/07/14 11:08:15
投稿者: 鵜

お世話になります。
VBA初心者です。
過去にも同じような質問があったかもしれませんが、ご教授願います。
 
下記のような各項目を入力した一覧表があります。
 
   A列    B列   C列
 (印刷有無) (氏名) (内容)
 
※シート右上に「印刷」ボタンを置きたい
 
上記の入力データをもとに
A列の印刷有無で「○」(※○でなくてもよい)を選択した行のデータを
別シートに既定のレイアウトで印刷をしたいと思っています。
 
「印刷」ボタンのVBAやレイアウトシート側のセルの関数をどのようにしたらよいのか
よろしくご教授願います。
 
説明が下手で申し訳ありませんが
通常、外回りに出ているため
返事が遅くなりますが
気長によろしくお願いいたします。
 
 

回答
投稿日時: 17/07/14 13:08:28
投稿者: WinArrow
投稿者のウェブサイトに移動

説明の文章はオード作成依頼ともとれる内容に受け取られます。
最初に「掲示板ご利用上のお願い」というページに
コード作成依頼は、禁止
と書かれています。
http://www.moug.net/faq/kiyaku.html
 
>別シートに既定のレイアウトで
の説明がないので、どのような対応になるのかわかりませんが、
 
元シートでオートフィルタを使えば、印刷対象のデータは、取得可能です。
そのまま印刷することもできます。(マクロは不要)
 
別シートへの転記も手作業でもできますので、試してみましょう。

回答
投稿日時: 17/07/14 13:12:22
投稿者: めんたん

どこまでできていてどこが分からないんでしょうね?

A列        B列     C列       D列
ID     (印刷有無)   (氏名)      (内容) 
1                     太郎        男
2          ○         花子        女

1.IDの列を作る
2.印刷用ページには IDをキーにVlookup関数でデータを持ってくる
3.印刷有無のセルが「○」なら印刷する。
 
仮にIDを記入するセルが A1、印刷有無の結果を表示するのが B1だとして
=VLookup(A1,元データ範囲,列数,FALSE)
 
With Sheets(印刷用のシート名)
    For i = 1 To 10
         .Range("A1").Value = i
        If .Range("B1").Value = "○" Then .PrintOut
    End If
End With
 
こんなのが分かりやすくていいんじゃないですかね。

投稿日時: 17/07/14 18:37:06
投稿者: 鵜

WinArrowさん、めんたんさん
返事が遅くなって申し訳ありません。
また、ご指摘や説明不足で申し訳ありませんでした。
 
印刷シートのレイアウトで
一人一人の項目を記入しては印刷の繰り返しが多く
また、項目の内容も日々変わるため
必要な項目のみ一覧表でわかるように作成し
それを一括印刷できるようにしたいと思っております。
 
一覧表となる入力シートは下記の通りです。
 
    A列    B列    C列   D列   E列
   (IDNo.) (印刷有無) (氏名) (内容1) (内容2)
    1    ○    ××  □□   △△
    2         ×○  ○□   □△
 
のちにIDとなる項目を追加しました。(内容変更して申し訳ありません。)
 
印刷するシートは、B列の項目(○の有無)を判別して
決まった様式のレイアウトに
C〜E列の入力した項目を
印刷シートの各セルに反映して
印刷したいと思っています。
 
そこで、印刷シートの画面に切り替えなくても
入力シートに印刷ボタンを設定して
一括印刷できるようにしたいと思っておりますが
どのように作成したらよいのかがわかりません。
特に印刷ボタンの設定はVBAでやらないと難しいのでは思っています。
VBAは素人で申し訳ありませんが
指定のシートをただ印刷するだけのVBAは作ったことがあります。
こんな私ですが、なにとぞご教授をお願いします。

回答
投稿日時: 17/07/14 20:01:36
投稿者: WinArrow
投稿者のウェブサイトに移動

>特に印刷ボタンの設定はVBAでやらないと難しいのでは思っています。
印刷ボタンの設定・・・の内容がわかりませんが、
 
元シートのセルを別シートのセルに複写するコード

別シートの印刷
 
を1つのプロシジャとして作成します。
 
印刷用のボタンは手作業で作成し、
そのボタンに、↑で作成したプロシジャ名をマクロとして登録します。
 
元シートのセルを別シートの複写するコード例
 
 Sheets("別シート").Range("□").Value = Sheets("元シート").Range("●").Value
これを必要なだけ記述します。

投稿日時: 17/07/15 12:07:58
投稿者: 鵜

ご教授ありがとうございます。
遅れて申し訳ありません。
 
一覧表の入力シートに「一括印刷」というボタンを作って
一覧表の各行ごと項目を印刷シート側のレイアウトで印刷したいと思っております。
 
とりあえず、めいたんさんのを参考に
下記のようなマクロを作ってみましたが
「End IfのIfブロックがありません」というエラーが出ました。
 
Sub 一括印刷()
  With Sheets(出力印刷用)
    For i = 1 To 30
         .Renge("A3").Value = i
        If .Renge("B3").Value = "○" Then .PrintOut
    End If
  End With
End Sub
 
※出力したい項目は3行目からになっています。
 
何が原因でしょうか?
 

回答
投稿日時: 17/07/15 13:07:07
投稿者: ちゃこ

エラーが出ないようにするだけということで……
Sub 一括印刷()
    Dim i As Long
    With Sheets("出力印刷用")
        For i = 3 To 30
            If .Range("B" & i).Value = "○" Then .PrintOut
        Next
    End With
End Sub

投稿日時: 17/07/15 13:57:26
投稿者: 鵜

ご教授ありがとうございます。
 
以下の通り、修正してみましたが
「オブジェクトはこのプロパティまたはメソッドをサポートしていません」というエラーがでました。
 
Sub 一括印刷()
  Dim i As Long
  With Sheets("出力印刷用")
    For i = 3 To 40
        If .Renge("B" & i).Value = "○" Then .PrintOut
    Next
  End With
End Sub
 
印刷する側のシートに問題があるのではないかと思いますが
印刷する側のシートは各セルに
 
  =IF(VLOOKUP(入力一覧!A3,入力一覧!A3:I40,○)="","",VLOOKUP(入力一覧!A3,入力一覧!A3:I40,○))
 
のような関数を入れてあります。
○はセルごとに列番号を数値を入れてます。
 
よろしくご教授をお願いします。
 

回答
投稿日時: 17/07/15 14:07:49
投稿者: simple

RengeはNo goodです。
Rangeの間違い。
エラーになった行を子細に見ればわかると思うのですが。

回答
投稿日時: 17/07/15 14:11:46
投稿者: simple

ちなみに、
.Renge("A3").Value = i
は論点ではないとして?、回答者さんが省略していますよ。
まさに鵜呑みにしてはいけないと思います。
 
それと、きちんとインデントをつける習慣をお薦めします。

回答
投稿日時: 17/07/15 14:32:48
投稿者: ちゃこ

エラーが出るか出ないかを試すだけなら
アップしたコードをコピペで試して貰えませんか?
他の条件は考慮していません ^^;
 
再掲
Sub 一括印刷()
    Dim i As Long
    With Sheets("出力印刷用")
        For i = 3 To 30
            If .Range("B" & i).Value = "○" Then .PrintOut
        Next
    End With
End Sub

回答
投稿日時: 17/07/15 15:06:29
投稿者: simple

ちゃこ様お久しぶりでございます。
私の投稿が誤解を招きかねない表現でした。申し訳ありませんでした。
投稿に疑義があるという積もりはみじんもありません。
内容を理解して受け止めて欲しいという趣旨でした。

投稿日時: 17/07/15 15:47:41
投稿者: 鵜

ご教授およびご指摘ありがとうございます。
 
私のミスで申し訳ありませんでした。
下記のとおりで走らせてエラーは出なかったのですが
印刷が出てきませんでした。
 
Sub 一括印刷()
  Dim i As Long
  With Sheets("出力印刷用")
    For i = 3 To 40
         .Range("A3").Value = i
        If .Range("B" & i).Value = "○" Then .PrintOut
    Next
  End With
End Sub
 
印刷シート側のA3セルに手入力で数値を入れると
各項目(○も含めて)は表示されています。
印刷側の各セルは下記の関数を記入してあります。
 
 =IF(VLOOKUP(A3,入力一覧!A3:I40,□)="","",VLOOKUP(A3,入力一覧!A3:I40,□))
 ※□は列数の数値
 
よろしくご教授をお願いします。

回答
投稿日時: 17/07/15 16:08:01
投稿者: simple

ステップ実行ということをご存じですか?
F8キーを押しながら一行ずつ実行する機能です。
 
B列の値がどうなっているか、
PintOutが実行されているか、
印刷範囲の設定はどうなっているか、
など確認して下さい。
 
ご自分で確認するほか無い内容です。
他人にはわかりません。

回答
投稿日時: 17/07/15 16:16:16
投稿者: WinArrow
投稿者のウェブサイトに移動

> =IF(VLOOKUP(A3,入力一覧!A3:I40,□)="","",VLOOKUP(A3,入力一覧!A3:I40,□))
↑の数式には、若干の疑問符はつきますが、「印刷できない」こととは関係ないので
一つ質問します。
 
この数式が入力されているセルアドレスを教えてください。
 
それと、印刷する領域(=印刷範囲)のセル範囲も教えてください。」
 

投稿日時: 17/07/15 18:23:55
投稿者: 鵜

ご教授ありがとうございます。
 
ステップ実行を行って
レイアウトの項目表示を確認しましたが
問題はありませんでした。
印刷だけがどうしてもうまくいきません。
 
ステップ実行で気になるとすれば
 Then .PrintOut
の部分の .PrintOut 部分だけ
印刷判別の○の有無が関係なく
塗りつぶしの表示がしないのが
気になるのですが、問題があるのでしょうか?
 
ちなみに手動での印刷は問題なく印刷されます。
 
ご迷惑をおかけして申し訳ありませんが
よろしくご教授をお願いします。
 

回答
投稿日時: 17/07/15 19:25:58
投稿者: simple

# 2時間ほど散歩してきました。老体には結構きつい暑さですな。
 
> .PrintOut 部分だけ
> 印刷判別の○の有無が関係なく
> 塗りつぶしの表示がしないのが
> 気になるのですが、問題があるのでしょうか

問題があるんでしょうね。
 
要するに、
If .Renge("B" & i).Value = "○"
の判定が False になって、結果的にPrintOutが実行されていない、
と考えてよいのですね?
 
では、自分が○としているのに、
そのセルの値が○と一致しないのはなぜか、
と自分で調べるしかないです。
他人に聞いても分かりません。真実は貴方の手元にしかありません。
 
Debug.print .Range("B" & i).Value
として、○にしているところが何故"○"と一致しないのか
よく観察してください。
 
考えられるのは、
・○の前後に半角スペースが含まれている
・見た目は同じ○だけど、文字コードが違う○を使っている
といったことでしょうか。
間違いが起きにくいのは、数値の1にすることでしょうか?

回答
投稿日時: 17/07/15 22:24:12
投稿者: めんたん

 If .Renge("B3").Value = "○" Then .PrintOut
 
最初にご自身で書かれていた通り「○」があるのはB3なのではないですか?

回答
投稿日時: 17/07/16 07:44:06
投稿者: simple

ご指摘のとおりのようです。
ミスリートしたようで失礼しました。
# 当事者ではないので、
# しっかりデバッグをしてください、という気持ちしかなかったですね。

投稿日時: 17/07/16 09:45:45
投稿者: 鵜

ご教授ありがとうございます。
 
解決しました。
 
  If .Range("B" & i).Value = "○" Then
 →If .Range("B3").Value = "○" Then
 
ご指摘の通り、Bセルを固定にしていなかったのが原因でした。
これでは、Bのセルが移動していては
いつまでも印刷できませんでした。
 
いろいろご迷惑をおかけして申し訳ありませんでした。
もう少しVBAを勉強しなければと痛悔しています。
 
この後は部数印刷ができるよう自力でやってみます。
WinArrow さん、めんたん さん、ちゃこ さん、simple さん
いろいろありがとうございました。
 
また、ご縁があったらよろしくご教授をお願いします。
 
ではでは。。。