如何以编程方式在C#中的Excel工作表上创buildbutton?

如何使用C#在Excel工作表上创buildbutton(或形状)? 我目前正在使用下面的代码,但是我遇到了两个问题:

  1. 当左边的列被resize时,该button会移动
  2. 当您select或右键单击该button时,该button不响应,因此在自动添加后,用户无法从该工作表手动删除该button

编辑:由于兰斯提醒我,#2是由于我自己的误解 – 为了删除表单button,您必须使用devise模式,您可以通过function区上的开发人员选项卡访问。

有没有更好的方法来生成button,可以避免这两个问题?

// prior code is equivalent to: // var name = "MyButton"; // var row = 2; // var buttonCol = 5; Range cell = sh.Cells[row, buttonCol]; var width = cell.Width; var height = 25; var left = cell.Left; var top = Math.Max(cell.Top + cell.Height - height, 0); var items = sh.Shapes; var btn = items.AddOLEObject("Forms.CommandButton.1", null, null, null, null, null, null, left, top, width, height); btn.Name = name; OLEObject sheetBtn = sh.OLEObjects(name); sheetBtn.Object.Caption = isSubmit ? "Send" : "Cancel"; 

那么你也可以尝试使用带有.Add方法的OLEObjects集合创build它,它使用与Shapes集合的AddOLEObject方法相同的参数。 虽然我尝试了VBA中的AddOLEObject代码,但它工作得很好。 我能够进入devise模式,并selectbutton,列没有resize,如下所示:

 Public Sub Test() Dim btn As Shape Set btn = Sheets("Sheet1").Shapes.AddOLEObject("Forms.CommandButton.1", , , , , , , 1, 1, 100, 100) End Sub 

要在resize之前防止button移动,请设置:

 btn.Placement = XlPlacement.xlFreeFloating; 

作为创buildbutton的替代方法,您可以使用一个形状:

  var items = sh.Shapes; var shape = sh.Shapes.AddShape(MsoAutoShapeType.msoShapeRectangle, left, top, width, height); shape.Name = name; shape.Placement = XlPlacement.xlFreeFloating; shape.TextFrame.Characters().Text = isSubmit ? "Send" : "Cancel"; // an use this to assign a macro to it (won't happen by default as with a button) shape.OnAction = xl.Name + "!"+ sh.Name + "." + subName; 

请注意,常规Office.Interop DLL中不包含MsoAutoShapeType的定义。 我通过使用“添加引用”的COM选项卡并添加对“Microsoft.Office 12.0对象库”的引用来find它。