Page 1 of 1

Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sat Feb 04, 2012 8:50 pm
by ANUSARA
เมื่อคลิก ComboBox เพื่อเลือก Custom เพื่อให้แสดง UserForm แล้ว VBA error แสดง Debug ที่ UserForm และขึ้น Msg

Run - time error '-2147352571(80020005)':
Type mismatch

ก่อนหน้านี้ใช้งานได้ปกติค่ะ แต่ตอนนี้กลับขึ้น error ค่ะ ไม่ทรายว่าเป็นเพราะเหตุใดคะ
ลองตรวจสอบ ชื่อ Name ชื่อ Sheet แล้วก็ไม่ผิดค่ะ
รบกวนอีกครั้งนะคะ ขอบคุณค่ะ

ตัวอย่าง Code ที่เขียนค่ะ

Code: Select all

Private Sub ComboBox6_Change()
If Range("xIndexEnergy1_Can") = "<--Please click & Select Data-->" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 0#
    ElseIf Range("xIndexEnergy1_Can") = "Electricity " Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 0.5812
    ElseIf Range("xIndexEnergy1_Can") = "Gasoline" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 0.689
    ElseIf Range("xIndexEnergy1_Can") = "Natural Gas " Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 0.0099
    ElseIf Range("xIndexEnergy1_Can") = "Liquefied petroleum gas (LPG)" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 0.27
    ElseIf Range("xIndexEnergy1_Can") = "Diesel_Combustion" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 2.708
    ElseIf Range("xIndexEnergy1_Can") = "Benzene_Combustion" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 2.1896
    ElseIf Range("xIndexEnergy1_Can") = "Bunker Oil" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 0.0926
    ElseIf Range("xIndexEnergy1_Can") = "Coking Coal_Combustion" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 2.6268
    ElseIf Range("xIndexEnergy1_Can") = "Not Calculate" Then
        Sheets("INPUT").Range("xEFEnergyM1_Can").Value = 0#
  End If
  
    If Range("xIndexEnergy1_Can") = "Custom" Then
    With UserForm26
        .Show
    End With
    End If

End Sub
code ใน UserForm

Code: Select all

Private Sub CommandButton1_AddEF_Click()
    Dim iRow As Long
    Dim ws As Worksheet
    Set ws = Worksheets("UsEF_Utility")

    'check for a name
    If Trim(Me.TextBox8_Name_Body.Value) = "" Then
        Me.TextBox8_Name_Body.SetFocus
        MsgBox "Please enter a name of raw material or chemical"
    Exit Sub
    End If

    'check for a CF
    If Trim(Me.TextBox3_CF_Body.Value) = "" Then
     Me.TextBox3_CF_Body.SetFocus
     MsgBox "Please enter a emission factor"
    Exit Sub
  
End If

    If Not IsNumeric(TextBox3_CF_Body) Then
        MsgBox "Please enter numeric."
        Me.TextBox3_CF_Body.Text = "0.00"
        Exit Sub
    End If
    
ListBox1_SelectNewRW.AddItem TextBox8_Name_Body

Answer = MsgBox("Do you want save change?", 1 + 32, "Create record")
    
If Answer = 1 Then

 'find first empty row in database
    iRow = ws.Cells(Rows.Count, 11).End(xlUp).Offset(1, 0).Row

'copy the data to the database
    ws.Cells(iRow, 4).Value = Me.TextBox2.Value
    ws.Cells(iRow, 5).Value = Me.TextBox8_Name_Body.Value
    ws.Cells(iRow, 10).Value = Me.TextBox3_CF_Body.Value
    ws.Cells(iRow, 11).Value = Me.ComboBox1.Value
    ws.Cells(iRow, 12).Value = Me.TextBox4_Source_Body.Value
    ws.Cells(iRow, 13).Value = Me.TextBox5_Year_Body.Value
    ws.Cells(iRow, 14).Value = Me.TextBox15_Location_Body.Value
    ws.Cells(iRow, 15).Value = Me.TextBox7_Comment_Body.Value

'clear the data
    Me.TextBox8_Name_Body.Value = ""
    Me.TextBox3_CF_Body.Value = ""
    Me.TextBox4_Source_Body.Value = ""
    Me.TextBox5_Year_Body.Value = ""
    Me.TextBox15_Location_Body.Value = ""
    Me.TextBox7_Comment_Body.Value = ""
    Me.ComboBox1.Value = ""
'Unload Me

'ElseIf Answer = 2 Then
   ' Unload Me
'Exit Sub

End If
End Sub

Private Sub CommandButton4_Clear_Click()

    Me.TextBox8_Name_Body.Value = ""
    Me.TextBox3_CF_Body.Value = ""
    Me.TextBox4_Source_Body.Value = ""
    Me.TextBox5_Year_Body.Value = ""
    Me.TextBox15_Location_Body.Value = ""
    Me.TextBox7_Comment_Body.Value = ""
    Me.ComboBox1.Value = ""
' Unload Me
End Sub

Private Sub CommandButton3_Exit_Click()
    Unload Me
End Sub

Private Sub CommandButton5_Exit_Click()
    Unload Me
End Sub

Private Sub CommandButton6_Select_Click()
With Worksheets("Input")
       .Range("xIndexEnergy1_Can") = UserForm26.ListBox1_SelectNewRW
       .Range("xEFEnergyM1_Can") = UserForm26.TextBox14_SelectCF
       .Range("xUnitEnergyMachine1_Can") = UserForm26.TextBox21
End With
End Sub

Private Sub CommandButton7_Delete_Click()
    Dim lng As Long
     Answer = MsgBox("Are you sure you want to delete data from database?", 4 + 48, "Delete database")
    
    If Answer = 6 Then
     lng = Application.Match(ListBox1_SelectNewRW.Value, Worksheets("UsEF_Utility").Range("E:E"), 0)
     Worksheets("UsEF_Utility").Rows(lng).Delete
     Unload Me
    ElseIf Answer = 7 Then
    End If

End Sub

Private Sub CommandButton8_AddInputSh_Click()
      With Worksheets("Input")
       .Range("xIndexEnergy1_Can") = UserForm26.TextBox8_Name_Body
       .Range("xEFEnergyM1_Can") = UserForm26.TextBox3_CF_Body
       .Range("xUnitEnergyMachine1_Can") = UserForm26.ComboBox1
     End With
      'ListBox1_SelectNewRW.AddItem TextBox8_Name_Body
End Sub


Private Sub ListBox1_SelectNewRW_Click()
With Worksheets("UsEF_Utility")
      TextBox14_SelectCF.Value = Application.VLookup(Me.ListBox1_SelectNewRW, .Range("E15:Q100"), 6, False)
      TextBox12_SelectSource.Value = Application.VLookup(Me.ListBox1_SelectNewRW, .Range("E15:Q100"), 8, False)
      TextBox11_SelectYear.Value = Application.VLookup(Me.ListBox1_SelectNewRW, .Range("E15:Q100"), 9, False)
      TextBox10_SelectLocation.Value = Application.VLookup(Me.ListBox1_SelectNewRW, .Range("E15:Q100"), 10, False)
      TextBox9_SelectComment.Value = Application.VLookup(Me.ListBox1_SelectNewRW, .Range("E15:Q100"), 11, False)
      'ComboBox1.Value = Application.VLookup(Me.ListBox1_SelectNewRW, .Range("E15:Q100"), 7, False)
      TextBox21.Value = Application.VLookup(Me.ListBox1_SelectNewRW, .Range("E15:Q100"), 7, False)
    End With
End Sub



Private Sub TextBox21_Change()

End Sub

Private Sub UserForm_Initialize()
Dim rall As Range
  Dim r As Range
   With Sheets("UsEF_Utility")
      Set rall = .Range("E15", .Range("E" & Rows.Count).End(xlUp))
   End With
   For Each r In rall
   ListBox1_SelectNewRW.AddItem r ' Change lisbox1 to ListBox1
   Next r
End Sub

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sat Feb 04, 2012 9:06 pm
by snasui
:D แนบไฟล์ตัวอย่างมาด้วยครับ จะได้ช่วยกันทดสอบได้

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 7:16 am
by ANUSARA
แนบไฟล์ตัวอย่างมาแล้วค่ะ

ขอบคุณค่ะ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 9:35 am
by snasui
:D อาจจะเกิดจากการตั้งชื่อ Control เนื่องจากมีการ Copy Code เดียวกันไปใช้กับหลาย Userform สำหรับ Code การ Initialize ควรระบุชื่อ UserForm ที่ต้องการ Assign ค่าให้กับ Control ด้วยเพื่อป้องกันการสับสนครับ

ดูการปรับปรุง Code ตามด้านล่าง

Code: Select all

Private Sub UserForm_Initialize()
    Dim rall As Range
    Dim r As Range
    With Sheets("UsEF_Utility")
    Set rall = .Range("E15", .Range("E" & Rows.Count).End(xlUp))
    End With
    For Each r In rall
        UserForm27.ListBox1_SelectNewRW.AddItem r ' Change lisbox1 to ListBox1
    Next r
End Sub
ส่วนกระทู้นี้ http://www.snasui.com/viewtopic.php?f=3 ... 456#p13456 ได้ผลเป็นอย่างไร ช่วยแจ้งในกระทู้ด้วยครับ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 2:09 pm
by ANUSARA
ได้แก้ไข code ตามที่แนะนำแล้วค่ะ ไม่มีปัญหา Run - time error '-2147352571(80020005)':Type mismatch แล้วค่ะ

แต่ข้อมูลใน database ใน sheet UsEF_Utility ไม่มาขึ้นโชว์ใน Listbox ค่ะ จะมีเพียงข้อมูลทีเพิ่งเพิ่มเท่านั้นค่ะ

ปล.ไม่ได้แนบไฟล์นะคะเนื่องจากส่งไฟล์ไม่ได้ค่ะไม่ทราบว่าเพราะเหตุใดค่ะ

รบกวนอีกครั้งค่ะ ขอบคุณค่ะ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 2:31 pm
by snasui
:tt: แก้ไขคำอธิบายด้านบน เนื่องจาก Initialize นั้นไม่ต้องระบุชื่อ Userform (ใช้ Userform_Initialize ได้เลย) กรณีทีเป็นปัญหาจะทดสอบเพิ่มให้ครับ
snasui wrote: ส่วนกระทู้นี้ viewtopic.php?f=3&t=2025&p=13456#p13456 ได้ผลเป็นอย่างไร ช่วยแจ้งในกระทู้ด้วยครับ
:roll: ตอบตามที่ถามด้วยครับ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 5:05 pm
by snasui
:D เนื่องจากมีการ Add ค่าว่างให้กับ ListBox แล้วทำให้เกิด Error ผมเลยเขียน Code กันค่าว่างออกไป ลองดูตาม code ด้านล่างครับ

Code: Select all

Private Sub UserForm_Initialize()
    Dim rall As Range
    Dim r As Range
    With Sheets("UsEF_Utility")
    Set rall = .Range("E15", .Range("E" & Rows.Count).End(xlUp))
    End With
    For Each r In rall
        If r <> "" Then
            UserForm27.ListBox1_SelectNewRW.AddItem r ' Change lisbox1 to ListBox1
        End If
    Next r
End Sub

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 5:15 pm
by ANUSARA
ลองนำcode ไปแก้ไขแล้ว แต่ยังได้ผลเหมือนเดิมค่ะ ข้อมูลที่เคยเพิ่มไว้ไม่แสดงใน ListBox ค่ะ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 5:31 pm
by snasui
:lol: ภาพด้านล่างคือผลทดสอบที่เครื่องผมครับ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 8:33 pm
by ANUSARA
ลองทำตาม code ที่แนะนำแล้วค่ะ

Code: Select all

Private Sub UserForm26_Initialize()
    Dim rall As Range
    Dim r As Range
    With Sheets("UsEF_Utility")
    Set rall = .Range("E15", .Range("E" & Rows.Count).End(xlUp))
    End With
    For Each r In rall
        If r <> "" Then
            UserForm26.ListBox1_SelectNewRW.AddItem r ' Change lisbox1 to ListBox1
        End If
    Next r
End Sub
แต่ผลยังไม่ได้เลยค่ะ
แนบไฟล์มาให้ลองช่วยดูแล้วนะคะ
รบกวนด้วยค่ะ

ขอบคุณมากค่ะ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 8:40 pm
by snasui
:shock: ลองอ่านที่ผมแนะนำใหม่ รวมทั้งดู Code ที่ผมโพสต์มาให้ใหม่ช้า ๆ อีกรอบ :ard:
snasui wrote: :D อาจจะเกิดจากการตั้งชื่อ Control เนื่องจากมีการ Copy Code เดียวกันไปใช้กับหลาย Userform สำหรับ Code การ Initialize ควรระบุชื่อ UserForm ที่ต้องการ Assign ค่าให้กับ Control ด้วยเพื่อป้องกันการสับสนครับ

ดูการปรับปรุง Code ตามด้านล่าง

Code: Select all

Private Sub UserForm_Initialize()
    Dim rall As Range
    Dim r As Range
    With Sheets("UsEF_Utility")
    Set rall = .Range("E15", .Range("E" & Rows.Count).End(xlUp))
    End With
    For Each r In rall
        UserForm27.ListBox1_SelectNewRW.AddItem r ' Change lisbox1 to ListBox1
    Next r
End Sub
...
snasui wrote: :tt: แก้ไขคำอธิบายด้านบน เนื่องจาก Initialize นั้นไม่ต้องระบุชื่อ Userform กรณีทีเป็นปัญหาจะทดสอบเพิ่มให้ครับ
...
snasui wrote: :D เนื่องจากมีการ Add ค่าว่างให้กับ ListBox แล้วทำให้เกิด Error ผมเลยเขียน Code กันค่าว่างออกไป ลองดูตาม code ด้านล่างครับ

Code: Select all

Private Sub UserForm_Initialize()
    Dim rall As Range
    Dim r As Range
    With Sheets("UsEF_Utility")
    Set rall = .Range("E15", .Range("E" & Rows.Count).End(xlUp))
    End With
    For Each r In rall
        If r <> "" Then
            UserForm27.ListBox1_SelectNewRW.AddItem r ' Change lisbox1 to ListBox1
        End If
    Next r
End Sub

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 9:00 pm
by snasui
:D นอกจากนี้ยังพบว่าในเซลล์ E15 ของชีท UsEF_Utility มีความยาวอักขระถึง 2394 อักขระ ลองลบออกไปก่อน หรือปรับให้เป็นค่าที่ควรจะเป็นแล้วลอง Run Code ดูใหม่ครับ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 9:15 pm
by ANUSARA
ดูอย่างไรคะว่าเซลล์ E15 ของชีท UsEF_Utility มีความยาวอักขระถึง 2394 อักขระ

และลองลบออกไปแล้ว แล้วลอง Run Code ดูใหม่แล้วแต่ยังไม่ได้ค่ะ
ลองดู ชีท UsEF_Utility แล้ว และตั้งให้ format cell เป็น General

สงสัยว่าทำไมบางทีเซลล์ที่เราตั้งให้เป็น General แล้วและพอเปิดมาบางครั้งมันกลายเป็นรูปแบบ Time ค่ะ ไม่ทราบว่าเป็นเพราะเหตุใดคะ

รบกวนช่วยแนะนำด้วยค่ะ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 9:19 pm
by snasui
:D ถ้ามั่นใจว่าได้อ่านตามที่ผมเขียนไปด้านบนอย่างละเอียด โดยเฉพาะอย่างยิ่งทุกบรรทัดของ Code แล้ว ลองส่งไฟล์ที่เป็นตัว Update (ถ้าอ่านครบถ้วนต้องมีการ Update ไม่ใช่เป็น Code เดิม) มาใหม่อีกรอบครับ

เราสามารถใช้ฟังก์ชั่น Len เพื่อนับความยาวในเซลล์ได้ครับ เช่น

=Len(E15)

Enter

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 9:51 pm
by snasui
ANUSARA wrote:สงสัยว่าทำไมบางทีเซลล์ที่เราตั้งให้เป็น General แล้วและพอเปิดมาบางครั้งมันกลายเป็นรูปแบบ Time ค่ะ ไม่ทราบว่าเป็นเพราะเหตุใดคะ
:lol: โดยปกติถ้าไม่มีการ Copy แล้ว Paste จากเซลล์ที่มีรูปแบบเป็นเวลา หรือ กำหนด Code ให้กำหนดรูปแบบเป็นเวลา ก็ไม่ควรจะเปลี่ยนรูปแบบเองครับ หากไม่ได้กำหนดไว้ด้วยวิธีใดวิธีหนึ่งแต่ยังเกิดเหตุการณ์ที่ว่านี้ ถือว่าเป็นความผิดปกติครับ

Re: Run - time error '-2147352571(80020005)':Type mismatch

Posted: Sun Feb 05, 2012 9:58 pm
by ANUSARA
แก้ไขตามที่แนะนำ
ไม่มีปัญหาแล้วนะคะ

ขอบคุณมากๆๆค่ะ