- ベストアンサー
VBA 印刷 コード
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.5のおまけです。 また、ふと思いついて 「リンクでシートにいくようにしています」というのがハイパーリンクだとしたらシート名をそこから取得するとして No.2のチェックボックスの位置を取得する場合 顧客名がチェックボックスのひとつ左の列の場合 MsgBox mSha.TopLeftCell.Address を Worksheets(Split(mSha.TopLeftCell.Offset(0, -1).Hyperlinks(1).SubAddress, "!")(0)).PrintOut Preview:=True に変更 リンクするセルでやった場合 B列が顧客名でG列がリンクするセルの場合 Sub TestHyper() Dim i As Long For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row If Cells(i, "G").Value = True And Cells(i, "B").Value <> "" Then If Cells(i, "B").Hyperlinks.Count > 0 Then Worksheets(Split(Cells(i, "B").Hyperlinks(1).SubAddress, "!")(0)).PrintOut Preview:=True End If End If Next End Sub
その他の回答 (5)
- kkkkkm
- ベストアンサー率66% (1719/2589)
No.2 No.3の追加です。 ふと思ったのですが、シートのセル範囲指定ではなくシートそのものを指定して印刷するのでしたら (No.2で「顧客のシートが何を印刷するのか不明」というのは、このあたり色々考えられるので、そこが不明だという事です) たとえば、チェックボックスの3列右にシート名を記載したセルがあるのでしたら MsgBox mSha.TopLeftCell.Address を Worksheets(mSha.TopLeftCell.Offset(0, 3).Value).PrintOut Preview:=True にすればチェックした行に対応するシートが印刷プレビューされます。 ちなみに リンクするセルでやった場合、G列をリンクするセルにして、F列がシート名とした場合には Sub Test() Dim i As Long For i = 1 To Cells(Rows.Count, "F").End(xlUp).Row If Cells(i, "G").Value = True And Cells(i, "F").Value <> "" Then Worksheets(Cells(i, "F").Value).PrintOut Preview:=True End If Next End Sub No1の顧客が何行目が不明なのでとりあえずi=1にしてますが本来の行にしてください。 ただ、同じ売上日の顧客のシートを印刷するのでしたら、どこかに日付を入力してその日の売上日に対応する顧客のシートを印刷したほうが操作が楽だと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
(1)その会社とシート名の対応はどうするのか。1社1シートか? (2)複数のチェックボックスがオンにされて、その会社を(複数、一度に)印刷するのか。前の質問の際もあいまいだった。 ーー 仕組みとして、普通行われる、 チェックボックスをクリックしたら反応(その会社のシートを印刷)は、沢山候補会社があると、チェックボックスもその数だけ必要で、その中でどれを(どのチェックボックスを)オンにしたのか、検出が、コード技術上高等なスキル(例クラスのイベントのしくみを使うなど)が必要で、それを使うのは、まだ早いだろうを忠告したつもり。 フォームの会社と対応している、チェックボックスで、印刷したい会社(複数を予想)をオンにし終わって、コマンドボタン(Caption例「印刷開始」)(1つ)を押させるなら、CommandButton(1つ)のクリックイベントで、オンにされている、チェックボックスを、舐めて探し、オンの分の対応会社を割り出し、 其れの対応シートを印刷すればよい。 出来るならWEBで調べて https://kosapi.com/post-4338/ のような記事が探せるはず。 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 Private Sub CommandButton1_Click() Dim コントロール As Control Dim チェック状態 As Boolean チェック状態 = False For Each コントロール In Controls If TypeName(コントロール) = "CheckBox" Then If コントロール.Value = True Then チェック状態 = True ’ <===本番では、ここで印刷候補を集めるとか1社印刷実行にはいる Exit For End If End If Next If チェック状態 = False Then MsgBox "選択されていません。" Exit Sub End If End Sub のようなことを、私は言っているつもり。 こういう時は前回の質問番号なりを参考に上げておくと、事情の参考になると思う。 まだ、そば(社内など)に、誰か熟練者・相談者がいないと、本件は、短期には無理ではないか?
お礼
imogasi様 お礼が遅くなりまして申し訳ございません。 初心者の私に対して ご親切に回答いただきましてありがとうございます。 社内に詳しい者がだれもおらず 私が業務改善も兼ねて勉強中でして 色々思考錯誤の段階でした。 早速試して習得していこうと思います。 ありがとうございます。
- kkkkkm
- ベストアンサー率66% (1719/2589)
> 教えていただいた知識、コードを基に > やってみます。 チェックボックスがTrueの行の売上日のデータが必要でしたら MsgBox mSha.TopLeftCell.Address を MsgBox mSha.TopLeftCell.Offset(0, 1).Value にすれば確認できます。 ただ同じ日付が並んでますので、まずはちゃんとセルアドレスが取得できるかどうか確認が必要です。 また、チェックボックスが移動してしまうと正しい値が取得できなくなりますので、移動できないようにする必要もあります。 右の方の使っていない列を利用して(目障りでしたら非表示にして)リンクするセルでやったほうが楽なような気もしますよ。 フォームコントロールという事なので前回に回答した 【エクセル】チェックボックスのリンクするセルを自動で指定 https://xnonce.com/wq7rpq4o/ を利用して、今のチェックボックスを削除して作り直したら沢山あっても楽です。
- kkkkkm
- ベストアンサー率66% (1719/2589)
ActiveXコントロールなのかフォームコントロールなのか不明ですので、まずそれを記載してください。 フォームコントロールでしたら (右クリックしたときに囲まれている位置) Sub TestCh1() Dim mSha As Shape For Each mSha In Worksheets("Sheet1").Shapes If mSha.Type = msoFormControl Then If mSha.FormControlType = xlCheckBox Then If mSha.ControlFormat.Value = xlOn Then MsgBox mSha.TopLeftCell.Address End If End If End If Next End Sub ActiveXコントロールでしたら(デザインモードで囲まれている位置) Sub TestCh() Dim mObj As Object For Each mObj In ThisWorkbook.Worksheets("Sheet1").OLEObjects If mObj.progID = "Forms.CheckBox.1" Then If mObj.Object.Value = True Then MsgBox mObj.TopLeftCell.Address End If End If Next End Sub Sheet1のチェックされているチェックボックスの左上が位置するセルアドレスが表示されます。 ボックスの位置が微妙にずれて結果が思わしくないときは前回のリンクするセルを利用してください。 > チェックボックスがTRUEの時は > その顧客のシートを印刷できるようにしたいです。 顧客のシートが何を印刷するのか不明ですので、上記で取得した結果をもとに印刷のコードを作成してください。
お礼
フォームコントロールです。 説明不足で申し訳ないです。 詳細と分かりやすい説明ありがとうございます。 まだ私自身、VBA初心者なので 教えていただいた知識、コードを基に やってみます。 回答いただきありがとうございました。
- dell_OK
- ベストアンサー率13% (766/5721)
チェックボックスとその行を関連付けるために手間がかかると思いますので、操作性は下がりますが、チェックボックスをやめて、0と1かTRUEとFALSEを入力するようにした方が、コードが簡単になると思います。 入力規則でリストを設定すればマウスで操作できるようになります。 各行にはシート名が必要ですが、その準備はできていますか。 現在、コードがどこまでできているのかわかりませんが、できていない箇所を書かれた方が、適切な回答がいただけると思います。
お礼
手間が掛かってしまうんですね。 チェックボックスを辞めて 入力規則も活用してみます。 各行のシート名も準備は完了しています。 まだコードが出来ていなく これから作っていきます。 回答ありがとうございました。
お礼
kkkkkm様 遅くなりまして申し訳ございません。 色々考えて教えていただきありがとうございます。 早速業務に活かしていきます。 初心者の私の質問にご親切にお答えいただき ありがとうございます。