代码之家  ›  专栏  ›  技术社区  ›  Eric

如何在C#中编程创建Excel工作表上的按钮?

  •  1
  • Eric  · 技术社区  · 14 年前

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

    1. 当您选择或右键单击该按钮时,该按钮没有响应,因此用户在自动添加该按钮后无法从工作表中手动删除它

    编辑:正如兰斯提醒我的那样,#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";
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Lance Roberts    14 年前

    您也可以尝试使用.Add方法的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
    
        2
  •  1
  •   Eric    14 年前

    要在调整列大小之前防止按钮移动,请设置:

    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