2010-10-28 127 views
1

如何使用C#在Excel工作表上创建按钮(或形状)?我目前正在做它用下面的代码,但我遇到两个问题:如何以编程方式在C#中的Excel工作表上创建按钮?

  1. 当列其左侧被调整按钮被移到
  2. ,当你选择或右键单击它的键没有反应,所以没有明显的方式让用户在自动添加后从表中手动删除它

编辑:由于兰斯提醒我,#2是由于我自己的误解 - 为了删除表单按钮,则必须使用设计模式,您可以通过功能区栏上的“开发工具”选项卡访问该模式。

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

 // 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"; 

回答

1

那么你也可以尝试使用OLEObjects集合用。新增方法来创建它,它使用相同的参数Shapes集合的AddOLEObject方法。虽然我尝试了VBA中的AddOLEObject代码,但它工作得很好。我能进入设计模式,并选择按钮,列没有调整其大小,就像这样:

Public Sub Test() 

Dim btn As Shape 

Set btn = Sheets("Sheet1").Shapes.AddOLEObject("Forms.CommandButton.1", , , , , , , 1, 1, 100, 100) 

End Sub 
+0

D'oh - 我忘了设计模式。 – Eric 2010-10-28 20:59:56

1

为了防止按钮从列时,它被调整之前,设置移动:

btn.Placement = XlPlacement.xlFreeFloating; 

至于创建一个按钮或者,你可以使用一个形状:

 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; 

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

相关问题