Excel-VBA: задайте Userfom Control.Name во время выполнения (ошибка выполнения 382)

Я работаю над небольшим графическим интерфейсом/формой 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

но я все равно продолжал получать ту же ошибку, но когда я проверил объект с предположительно используемым именем в непосредственном окне, он подтвердил, что объект не существует. Что я делаю не так?


person Fission Chips    schedule 02.04.2017    source источник
comment
Я провел небольшое тестирование, похоже, вы можете изменить только Name элементов управления, созданных во время выполнения (например, Set tb = UFmodproject.Controls.Add("Forms.TextBox.1") tb.Name = "NewName" работает). Невозможно изменить Name существующих элементов управления в форме   -  person chris neilsen    schedule 03.04.2017
comment
Спасибо, Крис, но тогда почему у меня это работает в 80% случаев? Посмотрите мой код для копирования страницы, я не получил никаких ошибок, а в новом SetNames() я получаю ошибку только для некоторых элементов управления.   -  person Fission Chips    schedule 03.04.2017
comment
Я не уверен, что вы поняли мою точку зрения: есть разница между элементами управления, которые вы размещаете на форме в VBA IDE, и элементами управления, которые вы создаете с помощью кода (используя <something>.Controls.Add в моем тестировании для первого вы не можете изменить имена, для последнее вы можете Мое подозрение вызвано вашим комментарием в OP, что the user creates pages at runtime   -  person chris neilsen    schedule 03.04.2017
comment
@Chris, все эти страницы и элементы управления создаются кодом во время выполнения, кроме страницы 1, с которой копируются элементы управления. И код работает, но только не тогда, когда я хочу установить имена для элементов управления на MultiPage1. Вы смотрели ссылку на мой предыдущий вопрос? Я уверен, что это должно быть как-то связано с двусмысленностью.   -  person Fission Chips    schedule 03.04.2017
comment
исходя из этого, я ожидаю, что вы сможете изменить все имена элементов управления _кроме_тех на странице 1. Можете ли вы подтвердить, так это или нет?   -  person chris neilsen    schedule 03.04.2017
comment
Зачем использовать имена элементов управления? Разве вы не можете просто a использовать свойство tag или b, если обработка событий с помощью пользовательского объекта передает объекту дополнительный параметр?   -  person SWa    schedule 03.04.2017
comment
@ Крис, извини, кажется, я неправильно прочитал твой комментарий. Я думал, вы говорите прямо противоположное, извините. Так что да, правильно, я не могу изменить control.names, которые были созданы в редакторе (страница 1). Теперь я попытался скопировать страницу и удалить страницу шаблона, но это тоже не позволяет мне это сделать. Возможно ли, что я также не могу удалить элементы управления, созданные в среде IDE?   -  person Fission Chips    schedule 03.04.2017
comment
Спасибо @SWa, я тоже об этом думал ... свойство .tag уже используется для хранения значений ключа .ini, я использую имена для обращения к элементам управления, чтобы добавлять их в массивы для установки правильных событий, например . Но тогда, возможно, мне придется пойти и создать все элементы управления во время выполнения, создать массив объектов для всех элементов управления, а затем добавить к ним свойства...?   -  person Fission Chips    schedule 03.04.2017