Chỉ định sai tên sheet-Cần mọi người giúp đỡ.

Trạng thái
Không mở trả lời sau này.

vietnamese

Yêu THVBA
Chào mọi người, mình là thành viên mới và cũng đăng tìm hiểu VBA. Mình bị đang bị một lỗi mà mình không biết xử lý ntn, hướng đi ra sao, mog mọi người có thế chia sẻ và giúp đỡ.
Hiện tại mình đang viết một một cái Data Entry để phục vụ công việc.
Khi mình chạy CT thì bị lỗi error 380 như hình <3>
Mình set như này không biết có ảnh hưởng gì không <2>
Khi mình debug thì bị lỗi <Object variable or With block variable not set>

p/s: Code thì mình học từ 1 anh Ấn, và mod trên nhu cầu của mình thôi.

Bạn cần đăng nhập để thấy hình ảnh

Bạn cần đăng nhập để thấy hình ảnh

Bạn cần đăng nhập để thấy hình ảnh
 

NhanSu

SMod
Thành viên BQT
Bạn cần upload file và cả code lên thì mọi người mới dễ xem. Nhìn hình thế này khó lắm.
 

NhanSu

SMod
Thành viên BQT
Bạn không nên quoute cả bài viết, chỉ cần tag tên là đủ. Ngoài ra bạn nên up cả code lên, nếu lỗi đơn giản, nhìn ra được trên điện thoại thì sẽ được trợ giúp nhanh hơn.
 

vietnamese

Yêu THVBA
NhanSu: Mình cảm ơn lời nhắc, vì là lần đầu đăng bài nên có chút thiếu xót.

file code .txt :

code:
Mã:
Option Explicit

Sub Reset()

    Dim iRow As Long
    Dim idem  As Long
    Dim sName As String
    Dim aaa As String
 
  
  
    idem = 4
     
    aaa = frmForm.cmbSheet.Value
                                                              
    For idem = 1 To 4
        sName = Worksheets("Sheet2").Range("A" & idem + 1).Value
        If aaa = sName Then Exit For
    Next idem
  
  
    iRow = ThisWorkbook.Sheets(sName).Range("A" & Application.Rows.Count).End(xlUp).Row
                                
                                

       With frmForm
  
        .txtID.Value = ""
        .txtName.Value = ""
        .optMale.Value = False
        .optFemale.Value = False
      
        .cmbSheet.Value = ""
      
      
        .cmbDepartment.Clear  ' Xoa gia tri dot luu trc
      
      
        ' Add data for choose of cmb Department (combobox)
        .cmbDepartment.AddItem "HR"
        .cmbDepartment.AddItem "Operation"
        .cmbDepartment.AddItem "Training"
        .cmbDepartment.AddItem "Quality"
      
        .txtCity.Value = ""
        .txtCountry.Value = ""
      
        .lstDatabase.ColumnCount = 9
        .lstDatabase.ColumnHeads = True 'create header for listbox
      
        .lstDatabase.ColumnWidths = "30,60,75,40,60,45,55,70,70"
      
      

      
        If iRow > 1 Then
            .lstDatabase.RowSource = "sName!A2:I" & iRow
        Else
            .lstDatabase.RowSource = "sName!A2:I2"
        End If
  
    End With
  
    MsgBox "reset " & iRow



End Sub


Sub Submit()

    Dim sh As Worksheet
    Dim iRow, iRow2 As Long
    Dim sName As String
    Dim idem As Long
  
    idem = 4
  
    For idem = 1 To 4
      
        sName = Worksheets("Sheet2").Range("A" & idem + 1).Value
      
        If frmForm.cmbSheet.Value = sName Then Exit For
      
    Next idem
  
    MsgBox sName
  
    iRow2 = [CountA(sName!A:A)] + 1
  
    MsgBox iRow2
          
    Set sh = ThisWorkbook.Sheets(sName)
    iRow = sh.Range("A" & Application.Rows.Count).End(xlUp).Row + 1
  
  
  
    MsgBox "submit " & iRow
  

  
    With sh
  
        .Cells(iRow, 1) = iRow - 1
      
        .Cells(iRow, 2) = frmForm.txtID.Value
      
        .Cells(iRow, 3) = frmForm.txtName.Value
      
        .Cells(iRow, 4) = IIf(frmForm.optFemale.Value = True, "Female", "Male")
      
        .Cells(iRow, 5) = frmForm.cmbDepartment.Value
      
        .Cells(iRow, 6) = frmForm.txtCity.Value
      
        .Cells(iRow, 7) = frmForm.txtCountry.Value
      
        .Cells(iRow, 8) = Application.UserName
      
        .Cells(iRow, 9) = [Text(Now(), "DD-MM-YYYY HH:MM:SS")]
      
  
    End With


End Sub


Sub Show_Form()
  
        frmForm.Show

End Sub
 
Sửa lần cuối bởi điều hành viên:

NhanSu

SMod
Thành viên BQT
Bạn sửa chỗ
Mã:
If iRow > 1 Then
            .lstDatabase.RowSource = "sName!A2:I" & iRow
        Else
            .lstDatabase.RowSource = "sName!A2:I2"
        End If
thành
Mã:
If iRow > 1 Then
            .lstDatabase.RowSource = sName & "!A2:I" & iRow
        Else
            .lstDatabase.RowSource = sName & "!A2:I2"
        End If
Không biết còn chỗ nào nữa. Code bạn cần đưa vào thẻ code nhé.
 

tuhocvba

Administrator
Thành viên BQT
@vietnamese : Bạn lưu ý phải sử dụng thẻ Code khi viết code trên forum. Xin xem mục 4 trong .
 

vietnamese

Yêu THVBA
@tuhocvba : Cảm ơn ad nhắc nhở. Sẽ lưu ý khi đăng bài a.
@NhanSu : Cảm ơn bác đã phản hồi. Mình đã sửa và vẫn bị lỗi bác ơi

Khi mình chạy tay Reset(), lỗi dòng 10
Khi mình chạy tay Submit(), lỗi dòng 91

Cùng 1 lỗi là frmForm.cmbSheet.value = <Object variable or With block variable not set>
Mặc dù mình đã thay đổi cách truyền dữ liệu

Mã:
Option Explicit
Sub Reset()
    Dim iRow As Long
    Dim idem  As Long
    Dim sName As String
    Dim aaa As String

    idem = 4

    aaa = frmForm.cmbSheet.Value  '///// error phan nay
                                                          
    For idem = 1 To 4
        sName = Worksheets("Sheet2").Range("A" & idem + 1).Value

        If aaa = sName Then Exit For

    Next idem

    iRow = ThisWorkbook.Sheets(sName).Range("A" & Application.Rows.Count).End(xlUp).Row
                                            
       With frmForm

        .txtID.Value = ""

        .txtName.Value = ""

        .optMale.Value = False

        .optFemale.Value = False

        .cmbSheet.Value = ""

        .cmbDepartment.Clear  

        .cmbDepartment.AddItem "HR"

        .cmbDepartment.AddItem "Operation"

        .cmbDepartment.AddItem "Training"

        .cmbDepartment.AddItem "Quality"

        .txtCity.Value = ""

        .txtCountry.Value = ""

      
        .lstDatabase.ColumnCount = 9

        .lstDatabase.ColumnHeads = True 'create header for listbox


        .lstDatabase.ColumnWidths = "30,60,75,40,60,45,55,70,70"

      
        If iRow > 1 Then

            .lstDatabase.RowSource = "sName!A2:I" & iRow

        Else

            .lstDatabase.RowSource = "sName!A2:I2"

        End If

    End With


    MsgBox "reset " & iRow


End Sub


Sub Submit()

    Dim sh As Worksheet

    Dim iRow, iRow2 As Long

    Dim sName As String

    Dim idem As Long

    idem = 4

    For idem = 1 To 4

        sName = Worksheets("Sheet2").Range("A" & idem + 1).Value

        If frmForm.cmbSheet.Value = sName Then Exit For     '///// error phan nay

    Next idem

    MsgBox sName


    Set sh = ThisWorkbook.Sheets(sName)

    iRow = sh.Range("A" & Application.Rows.Count).End(xlUp).Row + 1


    MsgBox "submit " & iRow


    With sh
        .Cells(iRow, 1) = iRow - 1
        .Cells(iRow, 2) = frmForm.txtID.Value
        .Cells(iRow, 3) = frmForm.txtName.Value
        .Cells(iRow, 4) = IIf(frmForm.optFemale.Value = True, "Female", "Male")
        .Cells(iRow, 5) = frmForm.cmbDepartment.Value
        .Cells(iRow, 6) = frmForm.txtCity.Value
        .Cells(iRow, 7) = frmForm.txtCountry.Value
        .Cells(iRow, 8) = Application.UserName
        .Cells(iRow, 9) = [Text(Now(), "DD-MM-YYYY HH:MM:SS")]
    End With

End Sub


Sub Show_Form()
        frmForm.Show
End Sub
 

vietnamese

Yêu THVBA
@NhanSu : mình sửa trên code đang chạy, vì code mình gửi lên đã chỉnh sửa lại để cho gọn lại bác ơi. Còn mình reply bác là chính code đã gọn lại cho đỡ rối ấy.
 

vietnamese

Yêu THVBA
@NhanSu : 2 hình ảnh này bác.

Bạn cần đăng nhập để thấy hình ảnh


Bạn cần đăng nhập để thấy hình ảnh
 

NhanSu

SMod
Thành viên BQT
Code lúc mình sửa là đã show được form rồi, chạy thủ tục reset được, hiện ra form và msgbox thông báo reset 2. Như vậy bạn bị lỗi là do đoạn code khác không có trong file đã gửi.
 

NhanSu

SMod
Thành viên BQT
Bạn gửi lại file bạn đang làm mà lỗi lên xem. Hoặc nếu có ultraview nhắn mình thử.
 

vietnamese

Yêu THVBA
@NhanSu Hiện tại mình viết kiểu If else if else (chạy static variable) thì chạy đúng theo nhu cầu. Nhưng khi Chạy dynamic thì lại bị lỗi như trên. Nên mình đang test lại (dynamic variable) trên một chương trình mới trong 1 WB mới để xem ntn. Cảm ơn bác nhiều nhé, nếu Có lỗi gì phát sinh thì mình sẽ Cập nhật ngay trên Line này để cùng Mod theo dõi hoặc giúp đỡ a.
 

vietnamese

Yêu THVBA
@NhanSu : Chào Bác, hiện tại mình đã fix đc rồi. Mình sẽ up code bên dưới để mọi người cùng tham Khảo.

Lỗi thao tác, chu trình -->> Cách sử lý, là mình viết 1 Hàm function để thực hiện nhiệm vụ tìm ra sheet cần lưu và thêm 1 sub Reset phụ .( Trước là do cùng 1 Sub Reset).

Lỗi thuộc tính như hình bên trên (frmForm.cmbSheet.value = <Object variable or With block variable not set>) thì mình vẫn chưa tìm đc nguyên nhân do sao. Kể cả khi Xóa hết code cũ, copy code mới và đã sửa thuộc tính cho đúng code vẫn xuất hiện lỗi như vậy. Bó tay. --->>> Cách xử lý là thực hiện trên 1 WB mới.




Mã:
Private Sub cmdReset_Click()

    Dim i As VbMsgBoxResult
    
    i = MsgBox("Co muon reset khong?", vbYesNo + vbInformation)
    
    If i = vbNo Then Exit Sub
    
    Call Reset
    
End Sub


Private Sub cmdSave_Click()

    Dim i As VbMsgBoxResult
    
    i = MsgBox("Co muon luu lai khong?", vbYesNo + vbInformation)
    
    If i = vbNo Then Exit Sub
    
    Call Save
    
    Call Reset

End Sub

Private Sub UserForm_Initialize()
    Call Reset1
End Sub

Option Explicit

Sub Save()
    Dim sh As Worksheet
    Dim hang As Long
    Dim SheetName As String
    Dim i As Long
    
    i = iSearchSheet()

    SheetName = Worksheets("Support").Range("B" & (i + 3)).Value
    
    Set sh = ThisWorkbook.Sheets(SheetName)
    
    hang = sh.Range("C" & Application.Rows.Count).End(xlUp).Row + 1
    
    MsgBox hang
    
    With sh
    
        .Cells(hang, 3) = hang - 2
        .Cells(hang, 4) = frmForm.cmbNCC.Value
        .Cells(hang, 5) = frmForm.txtSanPham.Value
        .Cells(hang, 6) = frmForm.txtSoLuong.Value
        .Cells(hang, 7) = frmForm.txtDonGia.Value
  
    End With
    

End Sub

Sub Reset()
    Dim hang As Long
    Dim SheetName As String
    Dim i As Long
    
            
        i = iSearchSheet()
    
        SheetName = Worksheets("Support").Range("B" & (i + 3)).Value
    
        MsgBox SheetName
    
        hang = Worksheets(SheetName).Range("C" & Application.Rows.Count).End(xlUp).Row
    
        With frmForm
        
            .txtSanPham.Value = ""
            .txtSoLuong.Value = ""
            .txtDonGia.Value = ""
            
            .cmbSheet.Value = ""
            
            Worksheets("Support").Range("B3", Worksheets("Support").Range("B" & Application.Rows.Count).End(xlUp)).Name = "TimSheet"
            
            .cmbSheet.RowSource = "TimSheet"
            

            .cmbNCC.Value = ""
            
            Worksheets("Support").Range("D3", Worksheets("Support").Range("D" & Application.Rows.Count).End(xlUp)).Name = "NCC"
            
            .cmbNCC.RowSource = "NCC"
        
        
            .lstData.ColumnCount = 5
            .lstData.ColumnHeads = True
            .lstData.ColumnWidths = "30,50,70,40,40"
        
            If hang > 1 Then
                .lstData.RowSource = SheetName & "!C3:G" & hang
            Else
                .lstData.RowSource = SheetName & "!C3:G3"
            End If
              
        End With
      
End Sub

Sub Reset1()
    With frmForm
    
        .txtSanPham.Value = ""
        .txtSoLuong.Value = ""
        .txtDonGia.Value = ""
        
        Sheet2.Range("B3", Sheet2.Range("B" & Application.Rows.Count).End(xlUp)).Name = "TimSheet"
        
        .cmbSheet.RowSource = "TimSheet"
              
        Sheet2.Range("D3", Sheet2.Range("D" & Application.Rows.Count).End(xlUp)).Name = "NCC"
        
        .cmbNCC.RowSource = "NCC"

    End With

End Sub
Sub ShowForm()
    frmForm.Show
End Sub
Function iSearchSheet() As Long
    Dim i As Integer
    Dim a As String
    
    For i = 0 To 10
        a = Worksheets("Support").Range("B" & (i + 3)).Value
        If frmForm.cmbSheet.Value = a Then
            iSearchSheet = i
            Exit Function
        End If
    Next i
    
End Function
 

NhanSu

SMod
Thành viên BQT
Vì code đã thay đổi, bạn gửi file lên (nhớ chạy thử code trước khi gửi) và nêu rõ lỗi xuất hiện trong trường hợp nào.
 

vietnamese

Yêu THVBA
@NhanSu Cảm ơn Mod phản hồi, mình bổ sung bên dưới đây.

File mới :
File cũ :

Vì Giao diện của code mới là mình demo để test nên có chút thay đổi giữa các file, Nhưng nguyên lý nhu cầu mình cần là: Dùng để Lưu data khi nhập vài Sheet được chọn (combobox.value).
Vì do Khi Reset thì combobox.value đã bằng ="", nên khi quét của Ct thì xảy ra lỗi. Vì thế Mình đã viết 1 Function để trả về 1 con số, khi nào cần nhiệm vụ để Kiểm tra giá trị thì mình cần.
 

tuhocvba

Administrator
Thành viên BQT
Bạn có đồng ý tài trợ diễn đàn một khoản phí để chúng tôi duy trì diễn đàn, từ đó bạn tiếp tục nhận hỗ trợ trong topic này hay không?
 
Trạng thái
Không mở trả lời sau này.
Top