『チェックボックスにチェックで印刷』(タマネギ) 別シートに各シートのリンクされたチェックボックスを 配置し配置したチェックボックスにチェックした シートのみ印刷しなおかつ全て目的のページを にチェックを入れたら別のマクロのボタンで チェックされたシートを印刷しますとガイダンスが表示され 印刷終了でチェックしたチェックボックスのチェックが 消える こんなのを作りたいのですが教えてもらえませんか? よろしくお願いします < 使用 Excel:Excel2003、使用 OS:WindowsXP > ---- 回答・・・でもないですがとりあえず。 >別シートに各シートのリンクされたチェックボックス フォームコントロール、ActiveXコントロール どちらでも行けそうですがどっちで進めるんですか? >こんなのを作りたいのですが教えてもらえませんか? イチから丸投げされるのも大変なので、たたき台くらいは提示されたほうがいいんじゃないかとおもいます。 (もこな2) 2018/04/18(水) 12:09 ---- コントロールツールボックスのチェックボックスを3個と、 コマンドボタンを配置して、コマンドボタンのマクロを以下のようにすれば 出来ると思います。 Private Sub CommandButton1_Click() If CheckBox1.Value = True Then 'Worksheets("Sheet1").PrintOut Worksheets("Sheet1").PrintPreview End If If CheckBox2.Value = True Then Worksheets("Sheet2").PrintPreview End If If CheckBox3.Value = True Then Worksheets("Sheet3").PrintPreview End If End Sub ここで探したのですがこんな感じです エラーになってしまいます (タマネギ) 2018/04/18(水) 15:47 ---- >エラーになってしまいます どのようなエラーがでるのでしょうか?(エラーにも種類があります) ActiveXコントロールで作成してるとして、とりあえず拝見する限りはおかしなところはないようですが・・・ <確認した方がいいとおもうこと> ・シートモジュールに記述しているか。 ・オブジェクトの名前は合っているのか。(そもそもオブジェクトをちゃんと設置しているのか) ・対象となるシートの名前は合っているのか (もこな2) 2018/04/18(水) 17:12 ---- 前言撤回。ちょっと研究してみないと私にはわからないです。 [[20041227183457]]←参考にされたのはこちらですよね 2004年だから約14年前・・・ 残念ながら私がVBAの勉強始めたの数年前なので、そもそも「コントロールツールボックス」っていうのが何かわからないです。 なんとなく、シート上に配置したコントロールをつかんでから、Valueを確認して対応するシートをプリントアウトするだけに思えたのですが、controls(オブジェクト名)ではつかめなかったので再考します・・・ (もこな2) 2018/04/18(水) 17:56 ---- わかりました。 OLEObjectsのObject.Valueを見る必要があるみたいです。 なので、たとえばこんな感じならいけるとおもいます。 【※チェックボックス名とシートのインデックス番号を対応させたとして】 Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 3 If Me.OLEObjects("CheckBox" & i).Object.Value Then _ ThisWorkbook.Worksheets(i).PrintPreview Next i End Sub (もこな2) 2018/04/18(水) 18:19 ---- 横から失礼します。 もこな2さん PrintOutメソッドはどこへ行ったの? >チェックされたシートを印刷しますとガイダンスが表示され >印刷終了でチェックしたチェックボックスのチェックが >消える この部分はどうしたの? >イチから丸投げされるのも大変なので、..... と言っておきながら質問者の回答になっていないのでは? (z) 2018/04/18(水) 22:04 ---- >PrintOutメソッドはどこへ行ったの? >「ガイダンスが表示され印刷終了でチェックしたチェックボックスのチェックが消える」この部分はどうしたの? >質問者の回答になっていないのでは? う〜ん。そっか〜そうですね・・・ ちょっとアルコールが入ってしまったので、アタマが動いてないですが、こんな感じではどうですか。 Private Sub CommandButton1_Click() Dim i As Long Dim flag As Integer For i = 1 To 3 If Me.OLEObjects("CheckBox" & i).Object.Value Then With ThisWorkbook.Worksheets(i) flag = MsgBox("「" & .Name & "」シートを印刷してよろしいですか?", vbYesNo) If flag = 6 Then .PrintOut End With End If Next i End Sub >zさんへ 確かに回答に不足があったのかもしれないけど、そう思うならケチつけるだけじゃなくて足りない思う部分を補足していただいてもいいんじゃないかとおもうんですが・・・ でないと単に喧嘩売りたい人にしか思えないです。(もっとも喧嘩買うほどのスキルもないので、ごめんなさいと言って逃げますけど・・・) (もこな2) 2018/04/19(木) 00:14 ---- おはようございます。 色々ありがとうございます チェックボックスはシートに貼り付けるタイプ しかしよくわかってないので このコードの使い方が良くわかってないのですが どのようにしたらよいのでしょうか? よろしくお願いします (タマネギ) 2018/04/19(木) 05:46 ---- >チェックボックスはシートに貼り付けるタイプ >しかしよくわかってないので >このコードの使い方が良くわかってないのですが >どのようにしたらよいのでしょうか? 質問を読み直したら、Excel2003なんですね。 手元にあるのが、Excel2007、職場にあるのがExcel2013なので、 そちらでしかわからないですが、シートに設置する(できる?) ものに、フォームコントロール、ActiveXコントロールの 2種類があります。 私の説明は、ActiveXコントロールを設置した場合のものです。 (コードはシートモジュールに記述) ただ、上記のように私は古いバージョンのExcelを持ってないので、 2003で同じようにActiveXコントロールが使えるかわかりません。 よって、別の回答者さんをお待ちください。 (もこな2) 2018/04/19(木) 07:07 ---- 追加で。 手空きのときにちょっと調べてみましたが、Excel2003で、ActiveXコントロールは使用可能”だった”ようです。 【参考】https://kokodane.com/macro18.htm 逆に言うと現状はExcel2003でActiveXコントロールを使うことができないようなので、Excelのバージョンアップをしないなら、フォームコントロール?で処理する方法を考えないとダメみたいですね。 とりあえず、以下のような案はどうですか? (1)制御用のシートをシートの最後(一番右)になるように追加。 (2)制御用のシートにチェックボックスをシートの数だけ用意(制御用シート分を除く) (3)チェックボックスを右クリックすると「コントロールの書式設定」というのがあるのでそれをクリック (4)表示されたダイアログのうち、「コントロール」タブにリンクするセルというのがあるので、以下のような感じでセットする     1つ目のチェックボックス・・・・$A$1     2つ目のチェックボックス・・・・$A$2     3つ目のチェックボックス・・・・$A$3         ・         ・         ・ (5)以下のコードを標準モジュールに記述。 Sub フォームコントール制御() Dim i As Integer Dim flag As Integer With ActiveSheet For i = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row If .Cells(i, "A").Value Then flag = MsgBox("「" & .Name & "」シートを印刷してよろしいですか?", vbYesNo) If flag = 6 Then Worksheets(i).PrintOut .Cells(i, "A").Value = "" End If End If Next i End With End Sub (6)ボタンを配置して、(5)のマクロを登録する。 一応、Excel2013では動いたので、フォームコントロールの仕組みが一緒なら使えると思います。 これで無理なら私のスキルではこれ以上どうにもできないですね・・ 他にもこの質問に関心がある回答者さんがいらっしゃるようなので私も一緒に勉強させていただきます。 (もこな2) 2018/04/19(木) 20:00 ---- 解答ありがとうございます チェックボックスとコードを入れて動くのですが シートを指定して印刷できるのでしょうか? このコードはどんな仕組みなのですか❓ チェックボックスを目的のシートにリンクさせて印刷するのでしょうか? (タマネギ) 2018/04/19(木) 22:47 ---- >チェックボックスとコードを入れて動くのですが >シートを指定して印刷できるのでしょうか? えっと・・・質問が理解できません。 提案した案は成功したんですか?(繰り返しになりますが、Excel2003を持っていないのでこちらではテストできません) 提案した方法が成功しているのであれば、1つ目のチェックボックスが1番目のシート、2つ目のチェックボックスが2番目のシートに対応してるから、”シートを指定”できるとおもうんですが・・・ >このコードはどんな仕組みなのですか? そんなに難しいものを書いたとおもっていないのですが・・・ 具体的にどこがわからないんですか? >チェックボックスを目的のシートにリンクさせて印刷するのでしょうか? 上記のとおり、そうであるとも、そうではないとも言えるように思います。 厳密にいえばチェックを入れるとA列に「TRUE」と入り、 マクロはTRUEとなっている行の行番号に対応するシートを印刷してますよね。 (私の案がうまくいってるとして) (もこな2) 2018/04/19(木) 23:41 ---- おはようございます 複数のシートがあり印刷したくないシートが 存在すると印刷シートを指定出来ないと言う ことでしょうか? 一個目チェックボックスは必ずシート1二つ目の チェックボックスはシート2を印刷する 印刷したくないシートはチェックボックスを存在させて どこかに隠すしかないと言うことですか? よろしくお願いします。 (タマネギ) 2018/04/20(金) 07:18 ---- なるほど・・・・そういうことですか。 まずは、提示の案で動いているのですか? もう3回目になりますが、Excel2003を持っていないのでこちらではテストできないので そもそも提案の方法が使えるか(使えているか)わからないです。 以降、提案した案で行けた場合の話です。 提示したコードは理解できてますか? 理解できていないのであれば、ステップ実行をしてどのようなことをやっているのか研究してみてください。 理解できているのであれば、対応させたくないシートに対応する行番号にリンクさせない(チェックボックスつくらない)か、B列にシート名を書いておいて、A列がTRUEなら、B列のシート名を参照して印刷するといったコードに改造すればよいんじゃないかとおもいます。 あとは、zさんをはじめ、他にもアイデアをお持ちの方がいるとおもうので、のんびりお待ちいただければよいかと。 (もこな2) 2018/04/20(金) 07:40 ---- ありがとうございました 色々試して理解していきます。 (タマネギ) 2018/04/20(金) 07:55 ---- んと、遅ればせながら、 案1) チェックボックスを別途用意しないでも、 Ctrlキーを押しながらマウスでシートタブを選択する ではいけませんか? 案2) チェックボックスではなく、 リストボックスを使ってはいかがでしょうか? 多分そちらの方がシートの増減に対応しやすいと思います。 (固定で変わらないなら、チェックボックスでいいとおもいます。 VBAを駆使すればチェックボックスでもシートの増減に対応できます。) もこな2さんへ> ActiveXコントロールは2000の時代からほぼ変わってないです、 ので、古風なデザインは昔ながらですし (逆にそれが市販ソフトっぽい雰囲気が出るのはありますが、さすがに時代遅れ感が^^;)、 2003だからとか2000だからとかはあまり気にしなくていいと思います。 (なのでマウスホイールの操作に単純に対応できない><) だれか、エクセルVBA用にフリーで作ってくれないかなぁ。。。^^; (まっつわん) 2018/04/20(金) 08:23 ---- Option Explicit '印刷ボタン押下でリストボックスで選択された名前のシートを印刷 Private Sub CommandButton1_Click() Dim lstSNames As MSForms.ListBox Dim i As Long Set lstSNames = Me.ListBox1 With ThisWorkbook.Worksheets For i = 0 To lstSNames.ListCount - 1 If lstSNames.Selected(i) Then On Error Resume Next .Item(lstSNames.List(i, 0)).PrintPreview '.Item(lstSNames.List(i, 0)).Printout On Error GoTo 0 End If lstSNames.Selected(i) = False Next End With End Sub 'リセットボタン押下でシート一覧をリセット Private Sub CommandButton2_Click() Dim ws As Worksheet Dim lstSNames As MSForms.ListBox Set lstSNames = Me.ListBox1 With lstSNames .Clear For Each ws In ThisWorkbook.Worksheets If Not Me Is ws Then .AddItem ws.Name End If Next End With End Sub 'リセットボタン押下で一覧をリセット Private Sub CommandButton2_Click() Dim ws As Worksheet Dim lstSNames As MSForms.ListBox Set lstSNames = Me.ListBox1 With lstSNames .Clear For Each ws In ThisWorkbook.Worksheets If Not Me Is ws Then .AddItem ws.Name End If Next End With End Sub 参考URL>> http://www.eurus.dti.ne.jp/~Yoneyama/Excel/vba/vba_userform03b.html (まっつわん) 2018/04/20(金) 09:11 ---- あ、リンク先に書いてありますが、 リストボックスのプロパティを MultiSelect → fmMultiSelectSingle ListStyle → fmListStyleOption にセットしておいてください。 (まっつわん) 2018/04/20(金) 09:15 ---- >別シートに各シートのリンクされたチェックボックスを配置 〇別シートとしてここではシート名を「フォーム」としています。  リンクはしていません。目的のシートを呼び出すようにしています。 >なおかつ全て目的のページをにチェックを入れたら 〇シート名(目的のページ)分だけチェックボックスを配置しているのですか? >チェックボックスはシートに貼り付けるタイプしかしよくわかってないので 〇フォームコントロール、ActiveXコントロールのどちらなのかわからないので  両方提示しておきます。どちらも3個配置してください。  ・フォームコントロールは、セルとリンクさせて使用するので状況判断用のセルが必要。  チェックありの時は「TRUET(真)」チェツクなしの時は「FALSE(偽)」となる  (もこな2)さん 2018/04/19(木) 20:00 を参照。  フォントサイズは変更できない。右クリックで容易に変更できるので場合によってはシートを保護する必要がある。  ・ActiveXコントロールは「TRUET(真)」、「FALSE(偽)」の値が習得できる。  デザインモードを「ON」にして右クリックでプロパティを選択するとプロパティウィンドウ現れる。  ここで外観デザインができる。「OFF」にするとロック状態になり変更できない。 >複数のシートがあり印刷したくないシートが 存在すると印刷シートを指定出来ないと言うことでしょうか? 〇そういう事はありません。ここでは「CheckBox3」で印刷シートを指定出来ます。 > 一個目チェックボックスは必ずシート1二つ目のチェックボックスはシート2を印刷する 〇ここではそれぞれ「CheckBox1→シート1」「CheckBox2→シート2」としています。   >印刷したくないシートはチェックボックスを存在させてどこかに隠すしかないと言うことですか? 〇これは全く必要ありません。 〇フォームコントロール(標準モジュールに記述)  ※印刷時は「'」削除、「PrintPreview」必要なければ先頭に「'」を付記 Sub チェック() Dim Pri As Integer Dim Pria As String Worksheets("フォーム").Select Select Case True Case Range("A1").Value = True Pri = MsgBox("シート1を印刷してよろしいですか?", vbYesNo, "印刷") If Pri = vbYes Then Worksheets("Sheet1").PrintPreview 'Worksheets("Sheet1").PrintOut Worksheets("フォーム").Range("A1").Value = False Else Range("A1").Value = False End If Exit Sub Case Range("A2").Value = True Pri = MsgBox("シート2を印刷してよろしいですか?", vbYesNo, "印刷") If Pri = vbYes Then Worksheets("Sheet2").PrintPreview 'Worksheets("Sheet2").PrintOut Worksheets("フォーム").Range("A2").Value = False Else Range("A2").Value = False End If Exit Sub Case Range("A3").Value = True Pria = InputBox("シート名を入力してください", "シートの選択") If Pria = "" Then Range("A3").Value = False Else Range("A3").Value = False Worksheets(Pria).PrintPreview 'Worksheets(Pria).PrintOut Worksheets("フォーム").Range("A3").Value = False End If Exit Sub End Select End Sub 〇ActiveXコントロール(シートモジーュールに記述)  ※印刷時は「'」削除、「PrintPreview」必要なければ先頭に「'」を付記    Private Sub CheckBox1_Click() Dim Pri As Integer If CheckBox1.Value = True Then Pri = MsgBox("シート1を印刷してよろしいですか?", vbYesNo, "印刷") If Pri = vbYes Then Worksheets("Sheet1").PrintPreview 'Worksheets("Sheet1").PrintOut CheckBox1.Value = False Exit Sub Else CheckBox1.Value = False End If End If End Sub Private Sub CheckBox2_Click() Dim Pri As Integer If CheckBox2.Value = True Then Pri = MsgBox("シート2を印刷してよろしいですか?", vbYesNo, "印刷") If Pri = vbYes Then Worksheets("Sheet2").PrintPreview 'Worksheets("Sheet2").PrintOut CheckBox2.Value = False Exit Sub Else CheckBox2.Value = False End If End If End Sub Private Sub CheckBox3_Click() Dim Pria As String If CheckBox3.Value = True Then Pria = InputBox("シート名を入力してください", "シートの選択") If Pria = "" Then CheckBox3.Value = False Else Worksheets(Pria).PrintPreview 'Worksheets(Pria).PrintOut       CheckBox3.Value = False End If End If End Sub (もこな2)さん 前回の発言で気分を悪くされたと痛感しており反省しております。すみませんでした。 ご指摘のように >足りない思う部分を補足していただいてもいいんじゃないかとおもうんですが・・・ を忘れずに行動したいと思います。 (z) 2018/04/21(土) 17:54