Я работаю над небольшим графическим интерфейсом/формой Excel-VBA, чтобы пользователь мог читать и записывать данные из/в файл .ini. Один из UserForms
имеет элемент MultiPage
, для которого пользователь создает страницы во время выполнения и после помощи stackoverflow они также могут перемещать страницы. Поскольку свойства элемента управления используются для записи данных в файл .ini, элементы управления должны быть правильно названы, то есть для моих целей, в том числе, в соответствии с соответствующим MultiPage.Value
. Я добавил следующее в методы MoveLeft/Right и получаю сообщение об ошибке не могу изменить свойство Control.Name
во время выполнения (382).
For i = 1 To UFmodproject.MultiPage1.Pages.Count - 1
For Each Ctrl In UFmodproject.MultiPage1.Pages(i).Controls
If TypeOf Ctrl Is MSForms.TextBox Then
Ctrl.Name = Left(Ctrl.Name, Len(Ctrl.Name) - 1) & i
End If
Next
Next
Странно то, что я делаю почти то же самое при копировании страницы, и это не вызывает никаких ошибок:
For Each newCtrl In UFmodproject.MultiPage1.Pages(pCount).Controls
For Each Ctrl In UFmodproject.MultiPage1.Pages(UFmodproject.MultiPage1.Value).Controls
If (Ctrl.Left = newCtrl.Left And Ctrl.Top = newCtrl.Top) Then
newCtrl.Name = Left(Ctrl.Name, Len(Ctrl.Name) - 1) & pCount
Exit For
End If
Next
'[bunch of other code...]
Next
В чем тут может быть ошибка? Что бы это ни стоило, я пробовал Dim Ctrl as Object
и Dim Ctrl as Control
, оба работают при копировании, но ни один из них, когда я пытаюсь установить только свойство Control.Name
. Кроме того, код для копирования страницы находится в стандартном модуле и вызывается из модуля класса. Новый код для переименования элементов управления находится в модуле класса. Я попытался перенести его в стандартный модуль, как и другой, но безрезультатно.
РЕДАКТИРОВАТЬ:
Я думал, что понял это, и что ошибка заключалась не в том, что он не мог изменить свойство во время выполнения, а в том, что, похоже, обнаруживается неоднозначное имя, когда для свойства Control.Name установлено собственное значение. ценность. Но я все еще получал ошибки, когда пытался переместить страницу на значение 1. Поскольку у меня все еще были неоднозначные имена, я получил следующее для тестирования:
Sub SetNames()
Dim Ctrl As Object
Dim Ctrl2 As Object
Dim i As Integer
Dim Name As String
For i = 1 To UFmodproject.MultiPage1.Pages.Count - 1
For Each Ctrl In UFmodproject.MultiPage1.Pages(i).Controls
If Int(Right(Ctrl.Name, 1)) <> i Then
For Each Ctrl2 In UFmodproject.Controls
If Ctrl2.Name = Left(Ctrl.Name, Len(Ctrl.Name) - 1) & i Then
Ctrl2.Name = Left(Ctrl.Name, Len(Ctrl.Name) - 1) & i + 4
Exit For
End If
Next
Ctrl.Name = Left(Ctrl.Name, Len(Ctrl.Name) - 1) & i
End If
Next Ctrl
Next i
End Sub
но я все равно продолжал получать ту же ошибку, но когда я проверил объект с предположительно используемым именем в непосредственном окне, он подтвердил, что объект не существует. Что я делаю не так?
Name
элементов управления, созданных во время выполнения (например,Set tb = UFmodproject.Controls.Add("Forms.TextBox.1") tb.Name = "NewName"
работает). Невозможно изменитьName
существующих элементов управления в форме - person chris neilsen   schedule 03.04.2017<something>.Controls.Add
в моем тестировании для первого вы не можете изменить имена, для последнее вы можете Мое подозрение вызвано вашим комментарием в OP, чтоthe user creates pages at runtime
- person chris neilsen   schedule 03.04.2017a
использовать свойствоtag
илиb
, если обработка событий с помощью пользовательского объекта передает объекту дополнительный параметр? - person SWa   schedule 03.04.2017