Search code examples
excelvbauserform

Changing properties of multiple controls in VBA userform permanently


I have a rather large multipage userform in which I want to make changes to some of the tags. I wrote the following bit of code, only to realize that it only changed said properties during run time - whereas I need them to be changed 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

From going through lots of somewhat similar questions I've gathered I probably need to use

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

But I have not been able to implement it, despite trying several variations. This one

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

results in Runtime Error 91: Object variable or with block variable not set.

Any ideas on how to make this work?


Solution

  • Yes, as you've discovered, you'll need to use the Designer property to make permanent changes. Try the following code...

    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