2016-09-01 13 views
1

私はデータ入力のために使用されるユーザーフォームを開くフォームコントロールでスプレッドシートに取り組んでいます。フォームのサブミットボタンは、セルの行を塗りつぶし、その行の最後の2つのセルに2つのボタンを追加します。これは、ユーザーが行う行数と、2つの新しいボタンが独自の別名で作成されるたびに挿入されます。しかし、これらはActiveXコントロールであり、同僚がファイルを開いてラップトップで使用しようとすると、他のWindows/Officeバージョンとの互換性の問題が発生しています。プログラムでフォームコントロールを追加する方法はありますか?

これは私が(それだけで異なる変数、基本的に他のボタンについても同様である)スプレッドシート上のコマンドボタンのいずれかを追加するために使用しているコードです:

Dim i As Long, Hght As Long 
Dim Name As String, NName As String 


i = 0 
Hght = 305.25 

NName = "cmdAction" & i 

For Each OLEObject In ActiveSheet.OLEObjects 
    If Left(OLEObject.Name, 9) = "cmdAction" Then 
     Name = Right(OLEObject.Name, Len(OLEObject.Name) - 9) 
     If Name >= i Then 
      i = Name + 1 
     End If 
     NName = "cmdAction" & i 
     Hght = Hght + 27 
    End If 
Next 
    Dim UpdateEntry As OLEObject, N% 

Set UpdateEntry = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _ 
    , DisplayAsIcon:=False, Left:=Selection.Offset(0, 23).Left, Top:=Selection.Offset(0, 23).Top, Width:=72, Height _ 
    :=24) 


UpdateEntry.Name = NName  
UpdateEntry.Object.Caption = "Edit Entry" 
With ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule 
    N = .CountOfLines 
.InsertLines N + 1, "Private Sub " & NName & "_Click()" 
.InsertLines N + 2, vbTab & "Code for button goes here" 
.InsertLines N + 3, vbTab & "End Sub" 
End With 

それならば、私は思っていました同じことをすることは可能でしたが、作成されたボタンはActiveXではなくフォームコントロールです。

表示されるエラーは、実行時エラー32809:アプリケーション定義エラーまたはオブジェクト定義エラーです。大規模な調査の結果、別のバージョンのWindowsで変更されたシートが壊れてしまっていることが判明しました。修正する唯一の方法は、新しいシートを作成し、すべての内容を新しいシートにコピーし、破損したシートを削除し、新しいシートの名前を以前の名前に変更することです。これは機能しますが、ActiveXコントロールをコピーすることはできません。なぜなら、名前が変更され、適切なコードがその中にないからです。ユーザーフォームを開くために使用されるスプレッドシートのフォームコントロールはうまく動作します。私の唯一の解決策は、すべてのActiveXをフォームコントロールに変更することだと思います。

助けていただければ幸いです。

+0

このようなことは一切していませんが、このリンクは使用していますか? [リンク](http://www.ozgrid.com/Excel/free-training/ExcelVBA2/excelvba2lesson21.htm) オブジェクトが必要なように見えます。 – Clusks

+0

これは最初のように聞こえます。どうもありがとう。 – user6782845

答えて

0

ActiveXボタンを使用する代わりに、Shapesを使用してShape.OnActionプロパティを設定して、通常はActiveXボタンの背後に配置するマクロを呼び出します。マクロでは、Application.Callerを使用してクリックされた図形の名前を取得し、クリックされたボタンを知り、それに応じてコードを分岐させることができます。

+0

返信いただきありがとうございます。フォームコントロールと同じ方法でシェイプをセルにリンクしますか?コピーするシート全体を選択すると、フォームコントロールもコピーされますが、ActiveXコントロールはコピーされません。シェイプもセルでコピーされますか? – user6782845

+0

はい、図形がコピーされます。 –

関連する問題