• ベストアンサー

フォームのCheck boxとOLEObjectのCheckboxのマクロの違い?

エクセル2003です。 ワークシート上に複数個のチェックボックスを配置し、オンの場合、その左隣のセルの値を返すマクロを作成する場合についての質問です。 普段はフォームのCheck boxを使っています。 フォームのCheck boxなら Sub ChkBx() With ActiveSheet.CheckBoxes(Application.Caller) If .Value = xlOn Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub と、標準モジュールに一つだけプロシージャを書いて、複数個のCheck boxに同一のマクロを登録すれば簡単に出来ます。 ところがこれをOLEObjectのCheckboxでやってみようと思ったところ、フォームのように一つのプロシージャを使いまわすことができず、シートモジュールに以下のように各Checkboxごとのマクロを書かなくてはいけないようです。 Private Sub CheckBox1_Click() With OLEObjects("CheckBox1") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox2_Click() With OLEObjects("CheckBox2") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub Private Sub CheckBox3_Click() With OLEObjects("CheckBox3") If .Object.Value Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub 3つや4つくらいならどうってことはないのですが十数個もあるとかなり面倒です。 OLEObjectのCheckboxでももっと簡単にする方法はないのでしょうか? それともわたしが何かOLEObjectのCheckboxの使い方について思い違いをしているのでしょうか? ご教示をお願いいたします。

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.1

プロシージャChkBkに引数を持たしたらどうでしょうか。 '---------------------------------- Private Sub CheckBox1_Click() Call ChkBx(1) End Sub Private Sub CheckBox2_Click() Call ChkBx(2) End Sub '----------------------------------- Sub ChkBx(N)  With ActiveSheet.OLEObjects("CheckBox" & N)    If .Object.Value = True Then      MsgBox .TopLeftCell.Offset(0, -1).Value    End If  End With End Sub '--------------------------------------------- しかしこれでもコントロールが数十もあると大変ですので クラスを使用するといいでしょう。 ”VBA コントロール 疑似配列”などをキーにして検索すると サンプルコードがたっぷりヒットします。   質問者のレベルであれば当然クラスに挑戦することになるでしょう。。。(^^;;;  

merlionXX
質問者

お礼

onlyromさま、ありがとうございます。 クラスを勉強してみるつもりではおりますが、自分でよく理解出来てないものを今、実装するわけにはいきませんので今回はプロシージャChkBkに引数を持たせることで対処しようと思います。 幸いWendy02さまのアドバイスで、シートモジュールに書くコードも簡単に出来そうです。 これからもご指導の程、よろしくお願い申し上げます。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 そのままになっているようですから、ちょっと割り込ませていただきます。 特に、Sub プロシージャは、標準で「参照渡し」となるので、明示的というか可読性のために、ByRef が必要な場合のみです。同じシートモジュールに書く限りは、オブジェクトを渡すのでも、あまり変わりがないように思います。確かに、オブジェクトを再取得する場合の、タイム・ロスを否定はできませんが、この程度では差が見られません。

merlionXX
質問者

お礼

takana_さんの、Sub ChkBx(ByRef N As MSForms.CheckBox)は、CheckBoxというオブジェクトを「参照渡し」させるために明示的に書いている。 onlyromさんの、 Sub ChkBx(N)も明示的には書いていないが「参照渡し」で「値渡し」ではないという理解でいいですね。 ありがとうございます。

  • takana_
  • ベストアンサー率44% (21/47)
回答No.5

#2です。参考までに onlyromさんのコードを、以下のように引数でチェックボックスを渡すように変更すると CheckBoxの名前と位置を意識しないで自由に作成することができるようになります。 '---------------------------------- Private Sub CheckBox1_Click()  'クリックされたCheckBoxを設定  Call ChkBx(ActiveSheet.OLEObjects("CheckBox1").Object) End Sub Private Sub CheckBox2_Click()  Call ChkBx(ActiveSheet.OLEObjects("CheckBox2").Object) End Sub '----------------------------------- Sub ChkBx(ByRef N As MSForms.CheckBox)  With N    If .Value = True Then      MsgBox .TopLeftCell.Offset(0, -1).Value    End If  End With End Sub

merlionXX
質問者

お礼

ご丁寧にありがとうございます。 onlyromさまのコードは省略しないで書くと Sub ChkBx(ByVal N As Integer) With ActiveSheet.OLEObjects("CheckBox" & N) If .Object.Value = True Then MsgBox .TopLeftCell.Offset(0, -1).Value End If End With End Sub と、「値渡し」していますが、それを「参照渡し」にするとサブルーチンの中にわざわざActiveSheet.OLEObjects("CheckBox" & N)と長々と書く必要がなくなるという意味に理解してよろしいでしょうか?

  • takana_
  • ベストアンサー率44% (21/47)
回答No.4

>ということは、BOOK起動時にWorkbookOpenイベントなどで必ずSub SetCheckBox()を走らせなくてはいけないということなのでしょうか? はいその通りです。 クラスのインスタンスを作成し、それぞれのインスタンスとチェックボックスを関連付けないとクリックイベントは発生しません。 なんらかのコードで、クラスのインスタンスを作成させかつ、インスタンスを保持しなければなりません。 Private cChkbox(1 To 3) As Class1 が関数内ではなく、モジュール内変数として、宣言しているのはそのためです。

merlionXX
質問者

お礼

何度もありがとうございます。 初めてクラスにさわりました。 これから勉強します。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 以前、Class のインスタンスのお話はあまり興味を示されなかったようですので、こちらが書くのは控えておきますが、Class インスタンスのコードは、二重・三重になるので、多少、コードは複雑になるのはやむをえないです。 VBAでは一般的というか、私自身、#1さんのように、コードの共通部分だけ抜き出し、サブルーチン化してしまい、個々のオブジェクトのイベントを書くことになります。だから、コントロールツールの名称は、必ず枝番のように最後に数字をつけるわけですね。 面倒であるとかないとかは、この際はあまり重要でないというか、ある程度、複雑になり数が増えてくると、テキストエディタやワークシートの数式や関数を使い、コードを作ってしまってから、VBEditor 側に貼り付けるというのが、私のやり方です。 コントロール配列自体が、コントロールツール(OLEオブジェクト)では持たない性質上やむをえないのと、Classでは、イベント形式で、通常のワークシートなどにつけるものよりも、結果的に、内容によって煩雑というか、ややこしくなりがちなのです。また、インスタンスの恒常化も問題になります。欲を言えば、カプセル化についても考えなくてはなりません。プロの仕事(公開されたものという意味)では、アドインは別として、Class によるインスタンスを設けたものを見た記憶がありません。

merlionXX
質問者

お礼

Wendy02さま、いつもありがとうございます。 すみません、以前のClass のインスタンスのお話は興味がなかったのではなく不勉強なわたしには理解が出来なかったのです。 でも今回、No2のtakana_さまから具体的なコードのご教示があり、何もわからぬままにやってみたら作動したのでこれから勉強していきたいと思ってます。インスタンスの恒常化の問題?カプセル化?・・・もう何のことやら想像もつきません。すみません。 というわけで今回はクラスはほとんど理解できていませんのでNo1のonlyromさまからご教示のあったサブルーチン方式をWendy02さまの「ワークシートの数式や関数を使い、コードを作ってしまってから、VBEditorに貼り付ける」方法を使って行いたいと思います。 ありがとうございました。

  • takana_
  • ベストアンサー率44% (21/47)
回答No.2

まず、クラスモジュールを1つ作成してください。例では、Class1とします そのクラスの中で、WithEventsをつけて、チェックボックスオブジェクトを宣言します。 そうすると、クラスの中でそのオブジェクトのイベントを記述することが出来るようになります。 中身の例です Option Explicit Private WithEvents objCheckBox As MsForms.CheckBox Public Sub SetCheckBox(ByRef InCheckBox As MsForms.CheckBox)   Set objCheckBox = InCheckBox End Sub Private Sub objCheckBox_Click()   MsgBox objCheckBox.Name & "が" & objCheckBox.Value & "にチェックされました" End Sub このクラスを利用する例です Option Explicit Private cChkbox(1 To 3) As Class1 Sub SetCheckBox()   Dim i As Long      For i = 1 To 3     Set cChkbox(i) = New Class1     Call cChkbox(i).SetCheckBox(ActiveSheet.OLEObjects("CheckBox" & i).Object)   Next End Sub ワークシート上にCheckBox1、CheckBox2、CheckBox3という名のチェックボックスが 作成されていることが前提です。

merlionXX
質問者

お礼

takana_さま、ありがとうございます。 今回はNo1のonlyromさまの方法で対処することにしました。 ただ、クラスというものをやってみるのは今回が初めてですので後学のために以下の点をお教え願いたいのです。 「中身の例です」以下のコードをクラスモジュール 「このクラスを利用する例です」以下のコードを標準モジュールにコピペしました。 そのままCheckboxをクリックしましたが何も起こりませんでした。 それで標準モジュールのSub SetCheckBox()を実行させてみたところCheckboxをクリックすると作動するようになりました。 ところが一旦、BOOKを終了し、再度開いたら、また作動しません。 それでまた標準モジュールのSub SetCheckBox()を実行させてみたところ作動するようになりました。 ということは、BOOK起動時にWorkbookOpenイベントなどで必ずSub SetCheckBox()を走らせなくてはいけないということなのでしょうか?

関連するQ&A

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • Excel チェックボックスの配置を換えた時

    ご質問させていただきます。 Excel2007を使用しています。 sheet2のA1セルからA190セルまでチェックボックスがあり、下記のmacro1が登録されていました。 そこで、チェックボックスの位置を以下のように変更しました。 sheet2のA1~A10セルまでチェックボックスが10個、その隣のB1~B10セルにsheet1のJ2~J11列への参照式、sheet2のC1~C10セルまでチェックボックスが10個、その隣のD1~D10セルにsheet1のJ12~J21列への参照式、・・・(省略)・・・、sheet2のAK1~AK10セルまでチェックボックスが10個、その隣のAL1~AL10セルにsheet1のJ182~J191への参照式、というふうに変更しました。 変更に伴い、A1~A10セルのチェックボックスには下記のmacro1を登録し、C1~C10セルのチェックボックスには下記のmacro2を登録しました。 問題は次で起こりました。E1~E10セルのチェックボックスに下記macro3を登録したのですが、チェックボックスをONにすると「実行時エラー13 型が一致しません」と表示されてしまいます。デバックボタンを押すと、myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Valueが黄色くなります。 そこで、myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Valueを削除してE1セルのチェックボックスをONにしてみたところ、なぜかE1セルにSheet1のI22セルの値が表示され、チェックボックスをOFFにしてみたらE1セルに=Sheet1!I22と書かれていることがわかりました。 offsetの数値を色々と試してみたところ、macro3のoffset(0,1)の部分をoffset(0,2)にするとチェックボックスがOFFの時にちゃんとE1セルには=Sheet1!J22と記入されます。 しかし、offset(0,2)の状態でmyCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Valueを挿入して実行してみたところ、やはり「実行時エラー13 型が一致しません」と表示されてしまいます。 どこをどう直したら良いのか全くわかりません。 教えてください。 よろしくお願いいたします。 Sub macro1()  Dim myCheck As Shape  Set myCheck = ActiveSheet.Shapes(Application.Caller)  myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Value  With myCheck.TopLeftCell.Offset(0, 1)   If myCheck.ControlFormat.Value = 1 Then    .Value = .Value   Else    .FormulaR1C1 = "=Sheet1!R[1]C[8]"   End If  End With End Sub Sub macro2() Dim myCheck As Shape Set myCheck = ActiveSheet.Shapes(Application.Caller) myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Value With myCheck.TopLeftCell.Offset(0, 1) If myCheck.ControlFormat.Value = 1 Then .Value = .Value Else .FormulaR1C1 = "=Sheet1!R[11]C[6]" End If End With End Sub Sub macro3() Dim myCheck As Shape Set myCheck = ActiveSheet.Shapes(Application.Caller) myCheck.TopLeftCell.Value = Not myCheck.TopLeftCell.Value With myCheck.TopLeftCell.Offset(0, 1) If myCheck.ControlFormat.Value = 1 Then .Value = .Value Else .FormulaR1C1 = "=Sheet1!R[21]C[4]" End If End With End Sub

  • エクセル チェックボックスの解除について(VBA)

    YES/NOを入力させる為の下記のVBAにおいて、チェックボックス1をチェックすると、アの部分でチェックボックス2の解除を行う関係で?、シート上でチェックボックス2を操作していないのにもかかわらず、勝手にCheckBox2_Click()に入り、命令文イを実行してしまいます。 ただ単にSub CheckBox1_Click()のルーチンの最後までの処理で終わりたいのですが、どうしたらよいのでしょうか。 Private Sub CheckBox1_Click() If CheckBox1 = True Then Sheets("sheet1").Range("A1") = 1 Sheets("sheet1").Range("A2") = 0 CheckBox2 = False・・・ア Else Sheets("sheet1").Range("A1") = "" End If End Sub Private Sub CheckBox2_Click() If CheckBox2 = True Then Sheets("sheet1").Range("A1") = 0 Sheets("sheet1").Range("A2") = 1 CheckBox1 = False Else Sheets("sheet1").Range("A2") = ""・・・イ End If End Sub

  • エクセル マクロ:チェックボックス コピー

    教えてください。 sheet1にデータがあり sheet2にチェックボックスとコマンドボタンがあります。 チェックボックスにレ点を入れ、コマンドボタンを押すと sheet1の該当する列をコピーして、sheet3に貼り付ける マクロを作ろうと思ってますがうまくいきません。 下記のマクロを使えるように手直ししていただけないでしょうか。 よろしくお願い致します。 Private Sub CommandButton1_Click() Dim myrange As String Dim rmax As Long rmax = Sheets("sheet1").Range("A2").End(xlDown).Row With Sheets("sheet2") If .CheckBox1 Then myrange = myrange & ",$B$1:$B$" & rmax If .CheckBox2 Then myrange = myrange & ",$C$1:$C$" & rmax If .CheckBox3 Then myrange = myrange & ",$D$1:$D$" & rmax End With If myrange = "" Then MsgBox "チェックしてください" Exit Sub End If myrange = "$A$2:$A$" & rmax & myrange Sheets("sheet1").Range(myrange).Copy Sheets("sheet3").Range("A1").PasteSpecial xlPasteValues Application.CutCopyMode = False Sheets("sheet3").Select End Sub

  • エクセル マクロ チェックボックス

    sheet1にチェックボックスが3つあり、マクロを実行するコマンドボタンが1つあります。 チェックボックスにレ点を入れることにより、sheet4のデータからsheet2にグラフを作成しようと考えてますが、エラーが出てしまい解決できません。 どのように訂正したらいいのか教えて頂けないでしょうか。 Private Sub CommandButton1_Click() Dim GraphRange As String Dim Graph As ChartObject Dim lastRow As Long Set Graph = Sheets("sheet2").ChartObjects.Add(150, 27, 350, 200) lastRow = Sheets("sheet4").Range("A" & Rows.Count).End(xlUp).Row GraphRange = Sheets("sheet4").Range(Cells(1, 1), Cells(lastRow, 1)).Value If Sheets("sheet1").CheckBox1.Value = True Then 'CheckBox1にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 2), Cells(lastRow, 2)).Value End If If Sheets("sheet1").CheckBox2.Value = True Then 'CheckBox2にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 3), Cells(lastRow, 3)).Value End If If CheckBox3.Value = True Then 'CheckBox3にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 4), Cells(lastRow, 4)).Value End If Graph.Chart.ChartWizard Source:=Sheets("sheet4").Range(GraphRange).Value, _ Gallery:=xlLine, Format:=1, PlotBy:=xlColumns, _ CategoryLabels:=1, SeriesLabels:=1, HasLegend:=True End Sub

  • エクセル VBA チェックボックスについて

    よろしくお願い致します。 OS:XP エクセル2003 VBAのことは、まったくの初心者です。 質問なのですが、下記のようなチェックボックス7にチェックが入れば、チェックボックス8~11に自由にチェックが入れれるようになり、逆にチャックボックス7にチェックが入ってない場合は、チェックボックス8~11のチェックはクリアされ、チェックできないものを作りました。 ここから、チェックボックス7にチェック入れたあとは、必ずチェックボックス9~11のどれかにチェックが入っている状態(ラジオボタンのような)で、チェックボックス7にチェックが入ってなかったら、8~11のチェックがクリアで尚且つ、チェックができなくなるようにするにはどうすればよいでしょうか? よろしくお願い致します。 Private Sub CheckBox7_Click() If CheckBox7.Value = True Then CheckBox8.Enabled = True CheckBox9.Enabled = True CheckBox10.Enabled = True CheckBox11.Enabled = True Else CheckBox8.Value = False CheckBox9.Value = False CheckBox10.Value = False CheckBox11.Value = False CheckBox8.Enabled = False CheckBox9.Enabled = False CheckBox10.Enabled = False CheckBox11.Enabled = False End If End Sub

  • Excel ユーザーフォーム呼び出し時エラー

    WindowsVista HomePremium Excel 2007 Microsoft Visual Basic 6.5 です。 Excelでユーザーフォーム(UserForm1)を作り、   Sub Auto_Open()     UserForm1.Show   End Sub で起動時に呼び出すようにしました。 確認のため、一度Excelを閉じ起動し直したところ正常に動作しました。 もう一度確認のため同じように再起動をすると、  実行時エラー '2110': コントロールが表示されていない、利用できない、またはフォーカスを持てないため、そのコントロールにフォーカスを移すことはできません。 と出て、それ以降何度やっても動作しなくなってしまいました。 解決法か原因がわかる方いらっしゃいましたら、ぜひご教授ください。よろしくおねがいします。 ユーザーフォーム関係のコードを以下に書いておきます。(内容は小遣い帳のようなものです。) ―――――――――――――――――――― Private Sub CommandButton1_Click() Dim NUM As Integer If TextBox1.Text = "" Then MsgBox "概要が記入されていません。" TextBox1.SetFocus GoTo 100 ElseIf TextBox2.Text = "" Then MsgBox "収支が記入されていません。" TextBox2.SetFocus GoTo 100 ElseIf ComboBox1.ListIndex = -1 Then MsgBox "収支の種類が選択されていません。" ComboBox1.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = TextBox1.Value If CheckBox1 = True Then TextBox2 = -TextBox2 End If If ComboBox1.ListIndex = 0 Or ComboBox1.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox1.ListIndex + 1) = TextBox2.Value Else ActiveCell.Offset(0, ComboBox1.ListIndex + 2) = TextBox2.Value End If TextBox1 = "" TextBox2 = "" CheckBox = Falses ComboBox1.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton2_Click() Dim NUM As Integer If TextBox3.Text = "" Then MsgBox "移動金額が記入されていません。" TextBox3.SetFocus GoTo 100 ElseIf ComboBox2.Text = "" Then MsgBox "移動元が選択されていません。" ComboBox2.SetFocus GoTo 100 ElseIf ComboBox3.ListIndex = -1 Then MsgBox "移動先が選択されていません。" ComboBox3.SetFocus GoTo 100 End If Range("F6").Select NUM = 0 Do While ActiveCell.Offset(NUM, 0) <> "" NUM = NUM + 1 Loop ActiveCell.Offset(NUM, 0).Select ActiveCell = "移動" If ComboBox2.ListIndex = 0 Or ComboBox2.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox2.ListIndex + 1) = -TextBox3.Value Else ActiveCell.Offset(0, ComboBox2.ListIndex + 2) = -TextBox3.Value End If If ComboBox3.ListIndex = 0 Or ComboBox3.ListIndex = 1 Then ActiveCell.Offset(0, ComboBox3.ListIndex + 1) = TextBox3.Value Else ActiveCell.Offset(0, ComboBox3.ListIndex + 2) = TextBox3.Value End If TextBox3 = "" ComboBox2.ListIndex = -1 ComboBox3.ListIndex = -1 100 End Sub ―――――――――――――――――――― Private Sub CommandButton3_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub CommandButton4_Click() Unload Me End Sub ―――――――――――――――――――― Private Sub UserForm_Initialize() myarray1 = Array("収支", "クレジット", "郵便局", "机", "500", "1") For i = 0 To 5 ComboBox1.AddItem myarray1(i) ComboBox2.AddItem myarray1(i) ComboBox3.AddItem myarray1(i) Next i TextBox1.SetFocus End Sub

  • チェックボックスについて

    こんにちは。 フォームで「個人別状態」が「成約済み」の時に チェックボックスにチェックがつくようにしたいのですが、 動作しません。 どこが間違っているのでしょうか。。。 Private Sub チェック31_Click() If Me.個人別状態 = "成約済み" Then Me.チェック31.Value = False Else Me.チェック31.Value = True End If End Sub

  • エクセル チェックBOXを使用してシート選択 保存

    皆様お世話になります。 昨日は一括保存をご教授していただきありがとうございました。 早速ですが今回は、チェックboxを使用してシートを選択しそれをCSV形式にて保存したいのですがどうもうまくいきません。 ご教授よろしくお願いします Private Sub 保存_Button1_Click() If CheckBox5.Value Or CheckBox6.Value Or CheckBox7.Value Then bl = 5 If CheckBox5.Value Then Sheets("管理").Select Cells.Select Range("a1").Select 保存_start End If bl = 5 If CheckBox6.Value Then Sheets("カット").Select Cells.Select Range("a1").Select 保存_start End If bl = 5 If CheckBox7.Value Then Sheets("ノズル").Select Cells.Select Range("a1").Select 保存_start End If MsgBox "通信終了" Unload Me Else MsgBox "何も選択されていません" End If End Sub Private Sub 保存_start() Cells.Select Selection.Copy Workbooks.Add ActiveSheet.Paste Application.CutCopyMode = False Application.DisplayAlerts = False ActiveWorkbook.SaveAs Flname = "c:\" & ActiveSheet.Name & "-" & CStr(Format(Date, "yymmdd") & _ "-" & Format(Time, "hhmmss")), FileFormat:=xlCSV ActiveWindow.Close ThisWorkbook.Activate Application.DisplayAlerts = True End Sub

  • Excel VBA 動的に作成したチェックボックスにイベントを追加したい

    http://oshiete1.goo.ne.jp/qa504573.html を参考にしたのですがエラーが出ます。 ------標準モジュール------- Dim NewChkBox As New Class1 Sub main() Dim oObj As OLEObject Set oObj = ActiveSheet.OLEObjects.Add(classtype:="forms.checkbox.1") oObj.Top = 10 oObj.Left = 10 NewChkBox.cb = oObj Set oObj = Nothing End Sub ---------クラスモジュール-------- Public WithEvents cb As Checkbox Private Sub cb_Click() MsgBox "You clicked the checkbox." End Sub 実行すると、 「オブジェクトはオートメーションイベントを発生させることができません。」 というエラーメッセージが出ます。 OLEObjectで作成したコントロールに イベントを追加するにはどのようにしたら良いのでしょうか?

専門家に質問してみよう