Board logo

標題: [發問] 利用VBComponent動態新增表單,在利用Class執行動作時,出現Automation錯誤 [打印本頁]

作者: C.F    時間: 2014-10-17 11:14     標題: 利用VBComponent動態新增表單,在利用Class執行動作時,出現Automation錯誤

我利用 VBComponent 的方式新增了一個表單

Sub Report_Make_Form1()

          Dim MyNewForm3 As VBComponent

         Set MyNewForm3 = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
        
   
    Print #1, Now & " 開始建立 UserForm"
   
    With MyNewForm3
         .Properties("Caption") = "Report_Generate"
         .Properties("Width") = 570
         .Properties("Height") = 350
         .Name = "Report_Generate_Form"
          With .Designer
                       With .Controls.Add("forms.Multipage.1")
                                  .Name = "MultiPage_Step"
                                   .Left = 10
                                   .Top = 5
                                   .Height = 250
                                   .Width = 550
                                   .Font.Name = "Comic Sans MS"
              End With
             之後就 Multipage 中的 Page(0)、Page(1)中新增了一些控制項
              With .Controls.Add("forms.CommandButton.1")
              '建立個 Button 來按一步讓 MultiPage 到下一頁
                         .Name = "GoNext_Btn"
                        .Left = 280
                        .Top = 258
                        .Height = 50
                        .Width = 70
                        .Caption = "下一步"
                        .Font.Name = "標楷體"
                        .Font.Size = 14
              End With

      End With
       Set Class_obj3.MyFormObject1 = MyNewForm3 '.Designer
         Set Class_obj3.MyMultiPage1 = MyNewForm3.Designer.Controls("MultiPage_Step")
      然後利用 Class 方式執行動作
       With .CodeModule
                  .InsertLines i + 4, "Set Class_obj3.MyNewGoNextButton1 = Controls(""GoNext_Btn"")"

       End With

  End With


Class 3 的內容

Public MyFormObject1 As Object
Public MyMultiPage1 As MSForms.MultiPage

Private Sub MyNewGoNextButton1_Click()
                 With MyMultiPage1
        
                        .Value = .Value + 1
            
             End With

End Sub

在執行到 .Value=.Value+1 時就會出現 Automation 用戶端中斷已啟動物件的連線,然後整個 Excel 就重開,請目是怎麼回 事?
作者: C.F    時間: 2014-10-17 11:23

補充一下,我有在執行此行前利用將值吐到一個檔案的方式是可以吐出目前在哪一面的 ~~
Print #1,   MyMultiPage1..Value
作者: GBKEE    時間: 2014-10-17 15:01

回復 2# C.F
試試看
  1. Option Explicit
  2. Dim xeVBC As Object
  3. Private Sub Workbook_Open()
  4.     Dim e As Object ' VBComponent
  5.     Set xeVBC = Application.VBE.ActiveVBProject.VBComponents
  6.     For Each e In xeVBC
  7.         Debug.Print e.Name, e.Type   '模組的Type
  8.         If e.Type <> 100 Then xeVBC.Remove e
  9.     Next
  10.     加入物件類別模組
  11.     Report_Make_Form1
  12. End Sub
  13. Private Sub 加入物件類別模組()
  14.     With ThisWorkbook.VBProject.VBComponents.Add(2) 'vbext_ct_ClassModule
  15.         .Name = "ClassTest"
  16.         With .CodeModule
  17.             .InsertLines 2, "Public WithEvents MyNewGoNextButton1 As MSForms.CommandButton"
  18.             .InsertLines 3, "Private Sub MyNewGoNextButton1_Click()"
  19.             .InsertLines 4, "With MyNewGoNextButton1.Parent.MultiPage_Step"
  20.             .InsertLines 5, "If .Value = .Pages.Count - 1 Then"
  21.             .InsertLines 6, ".Value = 0"
  22.             .InsertLines 7, "Else"
  23.             .InsertLines 8, ".Value = .Value + 1"
  24.             .InsertLines 9, "End If"
  25.             .InsertLines 10, "End With"
  26.             .InsertLines 11, "End Sub"
  27.        End With  '
  28.   End With
  29. End Sub
  30. Sub Report_Make_Form1()
  31.     Dim MyNewForm3  As Variant, I
  32.     'Set MyNewForm3 = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
  33.     Set MyNewForm3 = ThisWorkbook.VBProject.VBComponents.Add(3)
  34.          '***********************************
  35.          'vbext_rk_Project       一般模組
  36.          'vbext_ct_ClassModule   物件類別模組
  37.          'vbext_ct_MSForm        表單模組
  38.          '此參數的常數 須在 [工具] 功能表引用項目。
  39.          '引用 "Microsoft Visual Basic 的應用程式擴充"
  40.          '***********************************
  41.     Close #1
  42.     Open "d:\MyNewForm.txt" For Append As #1
  43.     Print #1, Now & " 開始建立 UserForm"
  44.     Close #1
  45.     ' Shell "notepad.exe d:\MyNewForm.txt", vbMaximizedFocus '****開啟文字檔
  46.     With MyNewForm3
  47.          .Properties("Caption") = "Report_Generate"
  48.          .Properties("Width") = 570
  49.          .Properties("Height") = 350
  50.          .Name = "Report_Generate_Form"
  51.           With .Designer
  52.                 With .Controls.Add("forms.Multipage.1")
  53.                     .Name = "MultiPage_Step"
  54.                     .Left = 10
  55.                     .Top = 5
  56.                     .Height = 250
  57.                     .Width = 550
  58.                     .Font.Name = "Comic Sans MS"
  59.               End With
  60.                 '之後就 Multipage 中的 Page(0)、Page(1)中新增了一些控制項
  61.               With .Controls.Add("forms.CommandButton.1")
  62.              '建立個 Button 來按一步讓 MultiPage 到下一頁
  63.                          .Name = "GoNext_Btn"
  64.                         .Left = 280
  65.                         .Top = 258
  66.                         .Height = 50
  67.                         .Width = 70
  68.                         .Caption = "下一步"
  69.                         .Font.Name = "標楷體"
  70.                         .Font.Size = 14
  71.               End With
  72.       End With
  73.       ' Set Class_obj3(1).MyFormObject1 = MyNewForm3 '.Designer
  74.       ' Set Class_obj3(2).MyMultiPage1 = MyNewForm3.Designer.Controls("MultiPage_Step")
  75.      ' 然後利用 Class 方式執行動作
  76.        With .CodeModule
  77.                   .InsertLines 2, "Dim Class_obj As New ClassTest"
  78.                   .InsertLines 3, "Private Sub UserForm_Initialize()"
  79.                   .InsertLines 4, "Set Class_obj.MyNewGoNextButton1 = GoNext_Btn"
  80.                   .InsertLines 5, "End Sub"
  81.        End With  '
  82.   End With
  83. End Sub
複製代碼

作者: C.F    時間: 2014-10-17 17:24

謝謝你 ~~~ 我試了,果然沒問題 ~~
但因為我還需要將整個 Form 這個傳過來Class,因為需要再處理 ~~
所以想說是否可以將這個Form傳到 MyFormObject1後再作處理
MyFormObject1
作者: C.F    時間: 2014-10-17 17:55

我又試了另一個方法,在
Sub Report_Make_Form1()
將變數 TestVar1="MultiPage_Step"
另外再 多設定
Set Class_obj3.MyFormObject1 = MyNewForm3.Designer

於 Class 3 中

用 MyFormObject1.Controls(TestVar1).Value=MyFormObject1.Controls(TestVar1).Value + 1
卻出現 'Value'方法 ('IMultiPage'物件)失敗,請問是何原因
作者: GBKEE    時間: 2014-10-20 16:53

回復 5# C.F
試試看
  1. Private Sub 加入物件類別模組()
  2.     Dim i As Integer, MyString As String
  3.     With ThisWorkbook.VBProject.VBComponents.Add(2) 'vbext_ct_ClassModule
  4.         .Name = "ClassTest"
  5.         With .CodeModule
  6.              .DeleteLines 1
  7.              Close #1
  8.              Open "d:\ClassTest.txt" For Input As #1
  9.              Do While Not EOF(1)    ' 執行迴圈直到檔尾為止。
  10.                 i = i + 1
  11.                 Input #1, MyString     ' 將資料讀入變數中。
  12.                 .InsertLines i, MyString
  13.             Loop
  14.             Close #1    ' 關閉檔案。
  15.        End With  '
  16.   End With
  17. End Sub
複製代碼
文字檔 d:\ClassTest.txt
  1. Option Explicit
  2. Public WithEvents MyNewGoNextButton1 As MSForms.CommandButton
  3. Private MyForms As Object
  4. Private Sub MyNewGoNextButton1_Click()
  5. With MyNewGoNextButton1.Parent.MultiPage_Step
  6. If .Value = .Pages.Count - 1 Then
  7. .Value = 0
  8. Else
  9. .Value = .Value + 1
  10. End If
  11. MsgBox MyForms.Caption & "  " & .Pages(.Value).Caption
  12. End With
  13. End Sub
  14. Property Set Set_Form(PP As Object)
  15. Set MyForms = PP
  16. MyForms.Caption = "Test " & Time
  17. End Property
複製代碼
  1. Private Sub Report_Make_Form1()
  2.     Dim MyNewForm3  As Variant, i As Integer, MyString As String
  3.     Set MyNewForm3 = ThisWorkbook.VBProject.VBComponents.Add(3)
  4.     With MyNewForm3
  5.          With .CodeModule
  6.             .DeleteLines 1
  7.              Close #1
  8.              Open "d:\Report_Make_Form1.txt" For Input As #1
  9.              Do While Not EOF(1)    ' 執行迴圈直到檔尾為止。
  10.                 i = i + 1
  11.                 Input #1, MyString     ' 將資料讀入變數中。
  12.                 .InsertLines i, MyString
  13.             Loop
  14.             Close #1    ' 關閉檔案。
  15.        End With
  16.        '
  17.        '繼續的程式碼
複製代碼
文字檔 d:\Report_Make_Form1.txt
  1. Option Explicit
  2. Dim Class_obj As New ClassTest
  3. Private Sub UserForm_Initialize()
  4.     Set Class_obj.MyNewGoNextButton1 = GoNext_Btn
  5.     Set Class_obj.Set_Form = Me
  6. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)