永久更改 VBA 用户窗体中多个控件的属性

Changing properties of multiple controls in VBA userform permanently

我有一个相当大的多页用户表单,我想在其中更改一些标签。我写了下面的代码,才意识到它只在 运行 时间内更改了上述属性 - 而我需要永久更改它们。

Sub ephemeralNameCh()
   Dim p As Integer, lenTag As Integer, lastShMulti As Integer
   Dim Ctrl As Control

   lastShMulti = uf_Screening.MultiPage1.Count - 1              'Last pg in multipage uf

   For p = 0 To lastShMulti
      For Each Ctrl In uf_Screening.MultiPage1.Pages(p).Controls
         'If tags needs to be change, do so
         If Ctrl.Tag <> "" And Left(Ctrl.Tag, 3) <> "P10" And Left(Ctrl.Tag, 3) <> "P11" Then
            If Left(Ctrl.Tag, 2) <> "P0" Then
               lenTag = Len(Ctrl.Tag)
               'New tag
               Ctrl.Tag = "P0" & Right(Ctrl.Tag, lenTag - 1)
            End If
         End If
      Next Ctrl
   Next p
End Sub

通过我收集到的许多类似的问题,我可能需要使用

With ThisWorkbook.VBProject.VBComponents("uf_Screening").Designer

但是尽管尝试了多种变体,我还是无法实现它。 这个

Sub permanentNameCh()
   Dim p As Integer, lenTag As Integer, lastShMulti As Integer
   Dim Ctrl As Control

   lastShMulti = uf_Screening.MultiPage1.Count - 1              'Last pg in multipage uf

   With ThisWorkbook.VBProject.VBComponents("uf_Screening").Designer
      For p = 0 To lastShMulti
         For Each Ctrl In uf_Screening.MultiPage1.Pages(p).Controls
            'If tags needs to be change, do so
            If Ctrl.Tag <> "" And Left(Ctrl.Tag, 3) <> "P10" And Left(Ctrl.Tag, 3) <> "P11" Then
               If Left(Ctrl.Tag, 2) <> "P0" Then
                  lenTag = Len(Ctrl.Tag)
                  'New tag
                  .MultiPage1.Pages(p).Controls(Ctrl.Name).Tag = "P0" & Right(Ctrl.Tag, lenTag - 1)
               End If
            End If
         Next Ctrl
      Next p
   End With
End Sub

导致 运行时错误 91:对象变量或块变量未设置

关于如何使这项工作有任何想法吗?

是的,正如您所发现的,您需要使用设计器 属性 进行永久性更改。试试下面的代码...

Option Explicit

Sub permanentNameCh()
   Dim p As Integer, lenTag As Integer
   Dim Ctrl As Control

   With ThisWorkbook.VBProject.VBComponents("uf_Screening").Designer.MultiPage1
        For p = 0 To .Pages.Count - 1
            For Each Ctrl In .Pages(p).Controls
                'If tags needs to be change, do so
                If Ctrl.Tag <> "" And Left(Ctrl.Tag, 3) <> "P10" And Left(Ctrl.Tag, 3) <> "P11" Then
                   If Left(Ctrl.Tag, 2) <> "P0" Then
                      lenTag = Len(Ctrl.Tag)
                      'New tag
                      Ctrl.Tag = "P0" & Right(Ctrl.Tag, lenTag - 1)
                   End If
                End If
            Next Ctrl
        Next p
   End With
End Sub