我正在开发一个小的Excel-VBA GUI /表单,供用户从/到.ini文件读取和写入数据。其中一个UserForms
有一个MultiPage
项,用户在运行时和after help from 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
但我仍然遇到同样的错误,但是当我在即时窗口中检查了具有所谓使用名称的对象时,它确认该对象不存在。我做错了什么?