2010-10-28 3 views
1

Как создать кнопку (или форму) на листе Excel с помощью C#? Я сейчас делаю это с ниже код, но я сталкиваюсь две проблемы:Как запрограммировать создание кнопки на листе Excel в C#?

  1. кнопка получает перемещается, когда колонки с левой изменении размеров
  2. кнопка не реагирует, когда вы выбираете или щелкните правой кнопкой мыши , поэтому нет очевидного способа для пользователя вручную удалить его с листа после его автоматического добавления

EDIT: Как мне напоминает Ланс, №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 с помощью метода .Add, она использует те же параметры, что и метод AddOLEObject коллекции Shapes. Хотя я пробовал код AddOLEObject, который у вас есть в VBA, и он отлично работал. Я был в состоянии перейти в режим разработки и выбрать кнопку, а столбцы не изменить его размер, например, так:

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

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».

Смежные вопросы