powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с динамической UserForm (VBA/Excel)
10 сообщений из 10, страница 1 из 1
Работа с динамической UserForm (VBA/Excel)
    #36488203
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!

Собственно есть код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Private Sub btnData_Click()
    Dim frmData As Object
    Set frmData = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
    
    With frmData
        .Properties("Caption") = "Данные по детале - " & frmMain.LW.SelectedItem.SubItems( 1 ) & _
            "(" & frmMain.LW.SelectedItem & ")"
        .Properties("Width") =  435 
        .Properties("Height") =  510 
        .Properties("Top") =  30 
        .Properties("Left") =  150 
    End With

    Dim lwData As MSComctlLib.ListView

    Set lwData = frmData.Designer.Controls.Add("MSComCtlLib.ListViewCtrl")

    With lwData
        .Top =  0 
        .Left =  0 
        .Height =  250 
        .Width =  430 


        .ColumnHeaders.Add , , "Месяц",  100 
        .ColumnHeaders.Add , , "Сумма заказов",  150 
        .ColumnHeaders.Add , , "Количесвто деталей",  150 

        .Font.Size =  10 

        .HideColumnHeaders = False
        .View = lvwReport
        .Gridlines = True

        .FullRowSelect = True

    End With      
            
    VBA.UserForms.Add(frmData.Name).Show ( 1 )
    ThisWorkbook.VBProject.VBComponents.Remove frmData
    
End Sub

Форма с ListView отображается отлично. Все заданные свойства и поля отрабатывают на "ура", но когда я пытаюсь заполнить ListView, мне выдается сообщение: "Run-time error '394' Property is write-only" .

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    

    Dim li As MSComctlLib.ListItem

    With lwData
        
        Set li = .ListItems.Add

    End With


Как я понимаю, frmData.Designer.Controls.Add("MSComCtlLib.ListViewCtrl") (что-то вроде макета дизайнера), добавляет контрол на форму и позволяет изменять только часть свойств, но не дает вносить содержимое. frmData.Controls.Add("MSComCtlLib.ListViewCtrl") выдает ошибку, как я понимаю, в виду того что frmData на момент обращения еще не сгенерированна и поэтому мы не можем добавить на нее контрол.

Попробовал обойти данную ситуацию добавив следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    With frmData.CodeModule
        X = .CountOfLines
        .InsertLines X +  1 , "Private Sub UserForm_Activate()"
        .InsertLines X +  2 , "   Call LWDActivate"
        .InsertLines X +  3 , "End Sub"

        .InsertLines X +  5 , "Private Sub LWDActivate()"
        .InsertLines X +  6 , "Dim ilwData As MSComctlLib.ListView"
        .InsertLines X +  7 , "Set ilwData = " & frmData.Name & "." & lwData.Name
        .InsertLines X +  8 , "ilwData.BackColor = RGB (20, 20, 20)"

        .InsertLines X +  9 , "End Sub"

    End With

Но он так же не отрабатывает, хотя никаких ошибок не выдает. В связи с этим появилось несколько вопросов:

1. Есть ли возможность заполнить содержимое ListView на динамически созданной форме?
2. Почему не отрабатывает Call LWDActivate, а в частности ilwData.BackColor = RGB (20, 20, 20)?
3. Где можно более подробно почитать о работе с динамически создаваемыми объектами?
__________________

С уважением, Lepaj
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #36488580
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajВсе заданные свойства и поля отрабатывают на "ура", но когда я пытаюсь заполнить ListView, мне выдается сообщение: "Run-time error '394' Property is write-only". Показали бы конкретную строчку что ли.

1) Да, иначе какой смысл?
2) Науке неизвестно что такое LWDActivate
3) Работа с ними не отличается ничем от работы со статическими контролами.

Jah loves you.
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #36488749
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПоказали бы конкретную строчку что ли.


Если мы добавим вот эти строки, то выскакивает ошибка: "Run-time error '394' Property is write-only".

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
    Dim li As MSComctlLib.ListItem ' Определяем li как ссылку на добавленую строчку
    With lwData ' Задаем свойства ListView
        ....
        Set li = .ListItems.Add ' пытаемся добавить новую строку, здесь и выскакивает ошибка :(
        ...
    End With      
 ...

Если допишем динамически создаваемый код для формы, в моем случае frmData код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
   
   With frmData.CodeModule
        X = .CountOfLines
        .InsertLines X +  1 , "Private Sub UserForm_Activate()"
        .InsertLines X +  2 , "   Call LWDActivate"
        .InsertLines X +  3 , "End Sub"

        .InsertLines X +  5 , "Private Sub LWDActivate()"
        .InsertLines X +  6 , "Dim ilwData As MSComctlLib.ListView"
        .InsertLines X +  7 , "Set ilwData = " & frmData.Name & "." & lwData.Name
        .InsertLines X +  8 , "ilwData.BackColor = RGB (20, 20, 20)"

        .InsertLines X +  9 , "End Sub"

    End With

Т.е. для динамически созданного модуля формы UserForm1 код будет выглядеть так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   
Private Sub UserForm_Activate() 
   Call LWDActivate ' при активации формы вызываем процедуру LWDActivate()
End Sub

Private Sub LWDActivate()

   Dim ilwData As MSComctlLib.ListView
   Set ilwData = UserForm1.ListView1
   ilwData.BackColor = RGB ( 20 ,  20 ,  20 )

End Sub

В принципе если код в процедуре LWDActivate модуля frmData вставить MsgBox, то сообщение отрабатывает, а если пытаться изменить ListView или добавить строку, код как будто игнорируется.
Надеюсь, это хоть немного внесло ясность :(

__________________

С уважением, Lepaj
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #36488809
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению оригинал на работе, с компа у знакомых попытался воссоздать ситуацию))))
__________________

С уважением, Lepaj
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #36489317
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все проблему решил! Может кому пригодится...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    Dim X As Integer
    With frmData.CodeModule
        X = .CountOfLines
        .InsertLines X +  1 , "Private Sub UserForm_Activate()"
        .InsertLines X +  2 , "   Dim li As MSComctlLib.ListItem"
        .InsertLines X +  3 , "   Dim ilwData As MSComctlLib.ListView"
 
' Судя по всему проблема была здесь, похоже было неправильное обращение к элементу
' .InsertLines X + 7, "Set ilwData = " & frmData.Name & "." & lwData.Name

        .InsertLines X +  4 , "   Set ilwData = Me." & lwData.Name ' правильное обращение к элементу

        .InsertLines X +  5 , "   Dim i As Integer"
        .InsertLines X +  6 , "   With ilwData"
        .InsertLines X +  7 , "       For i = 0 To 2"
        .InsertLines X +  8 , "       Set li = .ListItems.Add (, , pArrayData(i).year)"
        .InsertLines X +  9 , "       li.SubItems(1) = Format$(pArrayData(i).money," & Chr( 34 ) & "Currency" & Chr( 34 ) & ")"
        .InsertLines X +  10 , "       li.SubItems(2) = Format$(pArrayData(i).count," & Chr( 34 ) & "# ##0 øò" & Chr( 34 ) & ")"
        .InsertLines X +  11 , "      Next i"
        .InsertLines X +  12 , "   End With"
        .InsertLines X +  13 , "End Sub"
    End With
__________________

С уважением, Lepaj
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #36489392
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy
3) Работа с ними не отличается ничем от работы со статическими контролами.


Я думаю, что все же различия есть. Когда мы работаем с динамическими контролами, мы сначала создаем их при помощи дизайнера frmData.Designer.Controls.Add("MSComCtlLib.ListViewCtrl") , который позволяет задать свойства контрола, но не дает возможность работать с самим контентом, поэтому заполнять сам контент приходится на вновь созданной форме.

В случае если мы работаем со статическими контролами, то используем frmData.Controls.Add("MSComCtlLib.ListViewCtrl") , пропуская режим дизайнера и можем сразу начать работать с контентом, т.е. сразу добавляем контрол на форму. В моем случае с ListView.

Может кто нибудь сталкивался с тем, где можно поподробней про это почитать?
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #36489522
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любой книге по VBA этому вопросу уделено гораздо меньше подробностей, чем уже написали вы :)
Единственное отличие — как контрол создается, в дизайнере или кодом. После создания никаких отличий нет. Только названия констант нужно заменить их значениями, если ссылки на контрол нет.

В VB6 есть еще одно отличие, которого нет в VBA — массив контролов.

Jah loves you.
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #36489565
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ любой книге по VBA этому вопросу уделено гораздо меньше подробностей, чем уже написали вы :)


Да, Вы правы, уже столкнулся с такой проблемой :)

__________________

С уважением, Lepaj
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #37013112
GWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было бы неплохо выложить файл с примером.
...
Рейтинг: 0 / 0
Работа с динамической UserForm (VBA/Excel)
    #37013166
GWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не увидел сразу пример.
Прошу прощения
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с динамической UserForm (VBA/Excel)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]