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

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

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

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

Jah loves you.
...
Рейтинг: 0 / 0
25.02.2010, 18:48
    #36488749
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с динамической UserForm (VBA/Excel)
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
25.02.2010, 19:20
    #36488809
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с динамической UserForm (VBA/Excel)
К сожалению оригинал на работе, с компа у знакомых попытался воссоздать ситуацию))))
__________________

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

Код: 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
26.02.2010, 09:39
    #36489392
Lepaj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с динамической UserForm (VBA/Excel)
Antonariy
3) Работа с ними не отличается ничем от работы со статическими контролами.


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

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

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

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

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


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

__________________

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


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