2017-08-25 4 views
3

次のコードは、リストオブジェクトの横にあるすべての行にチェックボックスを追加することになっています。私はデータベースからデータを読み込んでそれをリストオブジェクトにロードする承認ツールを開発したいと考えています。その後、チェックボックスでデータを承認または不許可にして変更を保存できます。リストオブジェクトの長さが変更されるので、チェックボックスをコードで追加して削除する必要があります。vbaにはどのようなタイプのスプレッドシートチェックボックスがありますか?

ので、ここでコード:

Sub Approval() 
Dim i As Integer 
Dim tbl As ListObject 
Dim CBcollection As Collection 
Dim CB As msforms.CheckBox ' THIS IS WRONG 
Dim sht As Worksheet 
Dim L As Double, T As Double, H As Double, W As Double 
Dim rng As Range 

Set sht = Tabelle1 
Set tbl = sht.ListObjects("ApprovalTBL") 
Set rng = tbl.Range(2, 1).Offset(0, -1) 
     W = 10 
     H = 10 
     L = rng.Left + rng.Width/2 - W/2 
     T = rng.Top + rng.Height/2 - H/2 

For i = 1 To tbl.ListRows.Count 
     Set CB = sht.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H) 
'the line before will give me an error 13 type missmatch 
     CBcollection.Add (CB) 
     Set rng = rng.Offset(-1, 0) 
     T = rng.Top + rng.Height/2 - H/2 
Next i 

End Sub 

今の質問:

通常のスプレッドシートのチェックボックスを持っている何種類?

私はいつも "Option Explicit"を使用しています。私は常に変数を正しい型に薄暗くします。私はバリアント型を使用したくありません。

+1

フォームコントロールやActiveXコントロール:

だから、取得するMSForms.CheckboxあなたはOLEObject.Objectの参照を取得する必要がありますか? –

答えて

3

フォームコントロールチェックボックスだろうShapeになりますが、それはあなたがここにいるものではありません。

ワークシートにActiveXチェックボックスを追加すると、UserFormをVBAプロジェクトに追加するのと同じように、MSFormsタイプライブラリへの参照が追加されます。

チェックボックスは確かにMSForms.Checkboxインスタンスですが、それはOLEObjectでを埋め込まExcelタイプライブラリに住んでいるタイプだワークシート上で生活します。

Dim ctrl As Excel.OLEObject 
Set ctrl = sht.OLEObjects.Add(ClassType:="Forms.CheckBox.1", Link:=False, DisplayAsIcon:=False, Left:=L, Top:=T, Width:=W, Height:=H) 

Dim chkBox As MSForms.CheckBox 
Set chkBox = ctrl.Object 
+0

あなたのソリューションは動作しますが、私は別の問題::エラー91オブジェクトまたは変数が定義されていない、CheckBoxをコレクションに追加しようとしています。どんなアイデアがそこに間違っている可能性がある? –

+0

@LucasRaphaelPianegondaはあなたの 'CBcollection.Add'呼び出しを見て、オブジェクト参照の周りに余分な括弧を付けています。これはVBAにとって「この式を値として評価し、結果を' ByVal' *に渡す」ことを意味します。オブジェクト参照を扱うときのアイデア(値が良好に終了する可能性は低いと評価する)余分なかっこを削除して、問題を修正します。 –

0

これはちょうどCheckboxです。あなたはそれを何かで修飾する必要はありません。

それはスプレッドシートカントー上にある場合は、それはおそらくObject

+1

埋め込みコントロールは 'OLEObject'であり、' MSForms'型ライブラリでは 'qualifiedbox'が定義されています。 –

0

OLEObjects.Add戻りOLEObjectとして定義されたActiveXチェックボックスですので、このようなあなたの変数を宣言:

Dim CB As OLEObject 
+0

OLEObjectを使用すると、エラー13タイプのミスマッチは表示されませんが、エラー438が返されます。オブジェクトはプロパティまたはメソッドをサポートしていません。 –

+0

@ルーカスラファエルピアネゴンダ私の答えを参照してください –

+0

ああ、私にそれを打つ! –

関連する問題