2016-09-01 2 views
1

Я работаю над таблицей с элементом управления формой, который открывает Userform, используемый для целей ввода данных. Кнопка отправки формы заполняет ряд ячеек и добавляет две кнопки в последние две ячейки строки. Он будет вставлять столько строк, сколько пользователь делает, и каждый раз, когда две новые кнопки создаются с их собственным именем. Тем не менее, это элементы управления 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, потому что они будут переименованы и соответствующий код не будет в них, однако элемент управления формы в электронной таблице, используемой для открытия UserForm, будет работать отлично, поэтому я думаю, мое единственное решение - изменить все ActiveX на Form Control.

Поблагодарили бы за помощь.

+0

Никогда не делал ничего подобного конкретно, но используется ли эта ссылка? [link] (http://www.ozgrid.com/Excel/free-training/ExcelVBA2/excelvba2lesson21.htm) Похож, что вам нужен объект.Add – Clusks

+0

Это звучит как начало. Я могу изучить его немного больше, большое спасибо. – user6782845

ответ

0

Вместо использования кнопок ActiveX используйте Shapes и установите для свойства Shape.OnAction вызов макроса, который вы обычно размещаете за кнопкой ActiveX. В макросе вы можете использовать Application.Caller для получения имени выбранной формы, что позволит вам узнать, какая кнопка была нажата, и соответствующим образом разделить ваш код.

+0

Спасибо за ваш ответ, будут ли Shapes привязаны к ячейкам так же, как Form Controls? Если я выберу весь лист, чтобы скопировать его, также будут скопированы элементы управления формой, но не те элементы ActiveX. Формы также будут скопированы с ячейками? – user6782845

+0

Да, формы будут скопированы. –

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