• Câu lệnh VBA không chạy
  • Câu lệnh VBA không chạy

    hoat > 26-04-23, 04:40 PM

    Xin chào toàn thể anh chị em.
    Mình có 1 form nhập liệu có các text box và check box như sau:
    Text box:  txtGiatriPO,  txtTonggiatriPOcoVAT,  txtDongtienthanhtoan,  txtSotiencanthanhtoanVND,  txtSotiencanthanhtoanUSD, ......
    và 1 check box:  cboxVAT_TU.
    Mình muốn viết sự kiên cho check box:  cboxVAT_TU để tính số tiền cho 2 tex box:  txtSotiencanthanhtoanVND,  txtSotiencanthanhtoanUSD
    với các điều kiện như sau:
    Nếu  txtDongtienthanhtoan = "VND" thì  txtSotiencanthanhtoanUSD = 0
    Nếu txtDongtienthanhtoan = "VND" và txtTamung = “Da thanh toan” và txtThanhtoanL1 = “Da thanh toan” và txtThanhtoanL2 = “Da thanh toan” và txtThanhtoanL3 = “Da thanh toan” thì  txtSotiencanthanhtoanVND = 0
    Nếu txtDongtienthanhtoan = "VND" và txtTamung = “Da thanh toan” và txtThanhtoanL1 = “Da thanh toan” và txtThanhtoanL2 = “Da thanh toan” và txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotienthanhtoanL3VND
    ...... cư lần lượt như vậy. Mình đã viết đoạn mã VBA sau mà không tính được, nhờ anh chị em xem giúp

    Private Sub cboxVAT_TU_Click()
    If txtDongtienthanhtoan = "VND" And cboxVAT_TU = True Then
        txtSotientamungVND = txtTonggiatriPOcoVAT * txtGiatriphantramtamung
        txtSotientamungUSD = 0
        ElseIf txtDongtienthanhtoan = "VND" And cboxVAT_TU = False Then
        txtSotientamungVND = txtGiatriPO * txtGiatriphantramtamung
        txtSotientamungUSD  = 0
    Else
        If txtDongtienthanhtoan <> "VND" And cboxVAT_TU = True Then
        txtSotientamungUSD  = txtTonggiatriPOcoVAT * txtGiatriphantramtamung
        txtSotientamungVND = 0
        ElseIf txtDongtienthanhtoan <> "VND" And cboxVAT_TU = False Then
        txtSotientamungUSD  = txtGiatriPO * txtGiatriphantramtamung
        txtSotientamungVND = 0
    End If
     
    If txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanVND = 0
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotientamungVND
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotientamungVND + txtSotienthanhtoanL1VND
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND
        End If
        If txtDongtienthanhtoan = "VND" And txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanVND = txtSotienthanhtoanL1VND + txtSotienthanhtoanL3VND
        End If
    If txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = 0
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotientamungVND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotientamungVND + txtSotienthanhtoanL1VND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND
        End If
        If txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” Then
        txtSotiencanthanhtoanUSD = txtSotienthanhtoanL1VND + txtSotienthanhtoanL3VND
    End If
    End If
     
    End Sub
  • RE: Câu lệnh VBA không chạy

    cpucloi > 26-04-23, 05:56 PM

    Bạn lẳng cái demo lên mọi người giúp, nhìn code của bạn hoa hết mắt rồi big green
  • RE: Câu lệnh VBA không chạy

    ongke0711 > 27-04-23, 12:18 AM

    (26-04-23, 04:40 PM)hoat Đã viết: Xin chào toàn thể anh chị em.
    Mình có 1 form nhập liệu có các text box và check box
    ....

    Nếu là code thì bạn đưa vô khung code cho nó dễ nhìn chứ viết như vậy đọc mệt lắm.
    Có cái icon [Mã] hoặc [PHP] trên thanh menu khung soạn thảo đó.
  • RE: Câu lệnh VBA không chạy

    hoat > 27-04-23, 10:45 AM

    (26-04-23, 05:56 PM)cpucloi Đã viết: Bạn lẳng cái demo lên mọi người giúp, nhìn code của bạn hoa hết mắt rồi big green

    Cảm ơn anh chị em đã góp ý.
    Mục đích của mình là tính tổng tiền cho 2 text box: txtSotiencanthanhtoanVND và txtSotiencanthanhtoanNT (do mình có 2 loại tiền là DND và ngoại tệ).
    Nếu các text box: txtTinhtrangthanhtoanTU, txtTinhtrangthanhtoanL1, txtTinhtrangthanhtoanL2, txtTinhtrangthanhtoanL3 bằng " Da Thanh Toan" thì
    txtSotiencanthanhtoanVND = 0
    txtSotiencanthanhtoanNT = 0

    Nếu: txtTinhtrangthanhtoanTU, txtTinhtrangthanhtoanL1, txtTinhtrangthanhtoanL2, txtTinhtrangthanhtoanL3 khác " Da Thanh Toan" và txtDongtienthanhtoan = "VND"thì
     txtSotiencanthanhtoanVND  = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VND

    Nếu: txtTinhtrangthanhtoanTU, txtTinhtrangthanhtoanL1, txtTinhtrangthanhtoanL2, txtTinhtrangthanhtoanL3 khác " Da Thanh Toan" và txtDongtienthanhtoan <> "VND" thì
     txtSotiencanthanhtoanNT  = txtSotientamung + txtSotienthanhtoanL1 + txtSotienthanhtoanL2 + txtSotienthanhtoanL3

    Mình viết đoạn code này mà khi nhập các số vào chạy nó ra bằng 0, nhờ mọi người xem giúp
    Mã:
    Sub tongCP()
        Dim a, b, c, d As Integer
        If txtTinhtrangthanhtoanTU = "Da thanh toan" Then
        a = 0
        Else
        If txtTinhtrangthanhtoanTU <> "Da thanh toan" And txtDongtienthanhtoan = "VND" Then
        a = txtSotientamungVND
        Else
        If txtTinhtrangthanhtoanTU <> "Da thanh toan" And txtDongtienthanhtoan <> "VND" Then
        a = txtSotientamung
       
       
        If txtTinhtrangthanhtoanL1 = "Da thanh toan" Then
        b = 0
        Else
        If txtTinhtrangthanhtoanL1 <> "Da thanh toan" And txtDongtienthanhtoan = "VND" Then
        b = txtSotienthanhtoanL1VND
        Else
        If txtTinhtrangthanhtoanL1 <> "Da thanh toan" And txtDongtienthanhtoan <> "VND" Then
        b = txtSotienthanhtoanL1
       

        If txtTinhtrangthanhtoanL2 = "Da thanh toan" Then
        c = 0
        Else
        If txtTinhtrangthanhtoanL2 <> "Da thanh toan" And txtDongtienthanhtoan = "VND" Then
        c = txtSotienthanhtoanL2VND
        Else
        If txtTinhtrangthanhtoanL2 <> "Da thanh toan" And txtDongtienthanhtoan <> "VND" Then
        c = txtSotienthanhtoanL2
       
       
        If txtTinhtrangthanhtoanL3 = "Da thanh toan" Then
        d = 0
        Else
        If txtTinhtrangthanhtoanL3 <> "Da thanh toan" And txtDongtienthanhtoan = "VND" Then
        d = txtSotienthanhtoanL3VND
        Else
        If txtTinhtrangthanhtoanL3 <> "Da thanh toan" And txtDongtienthanhtoan <> "VND" Then
        d = txtSotienthanhtoanL3
       
        txtSotiencanthanhtoanVND = a + b + c + d
        txtSotiencanthanhtoanNT = a + b + c + d
        End If
        End If
        End If
        End If
        End If
        End If
        End If
        End If
        End If
        End If
        End If
        End If
       
    End Sub
  • RE: Câu lệnh VBA không chạy

    ongke0711 > 27-04-23, 12:05 PM

    (27-04-23, 10:45 AM)hoat Đã viết: Mục đích của mình là tính tổng tiền cho 2 text box: txtSotiencanthanhtoanVND và txtSotiencanthanhtoanNT (do mình có 2 loại tiền là DND và ngoại tệ).
    ...

    Bạn thử code này xem.

    Mã PHP:
    Sub tongCP()
        Dim a As LongAs LongAs LongAs Long
        
    If txtTinhtrangthanhtoanTU "Da thanh toan" And txtTinhtrangthanhtoanL1 "Da thanh toan" And txtTinhtrangthanhtoanL2 "Da thanh toan" And txtTinhtrangthanhtoanL3 "Da thanh toan" Then
            txtSotiencanthanhtoanVND 
    0
            txtSotiencanthanhtoanNT 
    0
        
    Else
            Select Case txtDongtienthanhtoan.Value
                
    Case "VND"
                    txtSotiencanthanhtoanVND Nz(txtSotientamungVND) + Nz(txtSotienthanhtoanL1VND) + Nz(txtSotienthanhtoanL2VND) + Nz(txtSotienthanhtoanL3VND)
                    txtSotiencanthanhtoanNT 0
                
    Case Else  'NT'
                    txtSotiencanthanhtoanNT Nz(txtSotientamung) + Nz(txtSotienthanhtoanL1) + Nz(txtSotienthanhtoanL2) + Nz(txtSotienthanhtoanL3)
                    txtSotiencanthanhtoanVND 0
            End Select
        End 
    If
    End Sub 


    - Không khai báo kiểu: 
    Mã:
    Dim a, b, c, d As Integer
    Vì chỉ có cái biến "d" cuối cùng được khai báo kiểu Integer, còn lại là kiểu Variant hết. Kiểu Variant sẽ chiếm bộ nhớ và xử lý sẽ lâu hơn là khai báo tường mình 1 kiểu.
    - Máy tính bây giờ khai báo kiểu Long sẽ chạy tối ưu hơn Integer.
    - Xem lại các textbox tình trạng thanh toán. Thay vì dùng chuỗi "Da thanh toan" dễ phát sinh sai khi so sánh chuỗi như code ở trên thì đổi qua Number 1, 0 (True/False) sẽ chính xác hơn, nhanh hơn.
  • RE: Câu lệnh VBA không chạy

    hoat > 27-04-23, 12:36 PM

    (27-04-23, 12:05 PM)ongke0711 Đã viết:
    (27-04-23, 10:45 AM)hoat Đã viết: Mục đích của mình là tính tổng tiền cho 2 text box: txtSotiencanthanhtoanVND và txtSotiencanthanhtoanNT (do mình có 2 loại tiền là DND và ngoại tệ).
    ...

    Bạn thử code này xem.

    Mã PHP:
    Sub tongCP()
        Dim a As LongAs LongAs LongAs Long
        
    If txtTinhtrangthanhtoanTU "Da thanh toan" And txtTinhtrangthanhtoanL1 "Da thanh toan" And txtTinhtrangthanhtoanL2 "Da thanh toan" And txtTinhtrangthanhtoanL3 "Da thanh toan" Then
            txtSotiencanthanhtoanVND 
    0
            txtSotiencanthanhtoanNT 
    0
        
    Else
            Select Case txtDongtienthanhtoan.Value
                
    Case "VND"
                    txtSotiencanthanhtoanVND Nz(txtSotientamungVND) + Nz(txtSotienthanhtoanL1VND) + Nz(txtSotienthanhtoanL2VND) + Nz(txtSotienthanhtoanL3VND)
                    txtSotiencanthanhtoanNT 0
                
    Case Else  'NT'
                    txtSotiencanthanhtoanNT Nz(txtSotientamung) + Nz(txtSotienthanhtoanL1) + Nz(txtSotienthanhtoanL2) + Nz(txtSotienthanhtoanL3)
                    txtSotiencanthanhtoanVND 0
            End Select
        End 
    If
    End Sub 


    - Không khai báo kiểu: 
    Mã:
    Dim a, b, c, d As Integer
    Vì chỉ có cái biến "d" cuối cùng được khai báo kiểu Integer, còn lại là kiểu Variant hết. Kiểu Variant sẽ chiếm bộ nhớ và xử lý sẽ lâu hơn là khai báo tường mình 1 kiểu.
    - Máy tính bây giờ khai báo kiểu Long sẽ chạy tối ưu hơn Integer.
    - Xem lại các textbox tình trạng thanh toán. Thay vì dùng chuỗi "Da thanh toan" dễ phát sinh sai khi so sánh chuỗi như code ở trên thì đổi qua Number 1, 0 (True/False) sẽ chính xác hơn, nhanh hơn.

    Cảm ơn ongke0711, lúc nãy mình chưa mô tả hết ý, còn các trường hợp khác chứ không phải có 2 trường hợp:
    txtTinhtrangthanhtoanTU = "Da thanh toan" And txtTinhtrangthanhtoanL1 <> "Da thanh toan" And txtTinhtrangthanhtoanL2 <> "Da thanh toan" And txtTinhtrangthanhtoanL3 <> "Da thanh toan"
    txtSotiencanthanhtoanVND = Nz(txtSotienthanhtoanL1VND) + Nz(txtSotienthanhtoanL2VND) + Nz(txtSotienthanhtoanL3VND)

    txtTinhtrangthanhtoanTU = "Da thanh toan" And txtTinhtrangthanhtoanL1 = "Da thanh toan" And txtTinhtrangthanhtoanL2 <> "Da thanh toan" And txtTinhtrangthanhtoanL3 <> "Da thanh toan"
    txtSotiencanthanhtoanVND = Nz(txtSotienthanhtoanL2VND) + Nz(txtSotienthanhtoanL3VND)

    Muốn thêm các trường hợp như vậy thì mình phải thêm như thế nào.
  • RE: Câu lệnh VBA không chạy

    ongke0711 > 27-04-23, 12:55 PM

    (27-04-23, 12:36 PM)hoat Đã viết: Cảm ơn ongke0711, lúc nãy mình chưa mô tả hết ý, còn các trường hợp khác chứ không phải có 2 trường hợp:
    txtTinhtrangthanhtoanTU = "Da thanh toan" And txtTinhtrangthanhtoanL1 <> "Da thanh toan" And txtTinhtrangthanhtoanL2 <> "Da thanh toan" And txtTinhtrangthanhtoanL3 <> "Da thanh toan"
    txtSotiencanthanhtoanVND = Nz(txtSotienthanhtoanL1VND) + Nz(txtSotienthanhtoanL2VND) + Nz(txtSotienthanhtoanL3VND)

    txtTinhtrangthanhtoanTU = "Da thanh toan" And txtTinhtrangthanhtoanL1 = "Da thanh toan" And txtTinhtrangthanhtoanL2 <> "Da thanh toan" And txtTinhtrangthanhtoanL3 <> "Da thanh toan"
    txtSotiencanthanhtoanVND = Nz(txtSotienthanhtoanL2VND) + Nz(txtSotienthanhtoanL3VND)

    Muốn thêm các trường hợp như vậy thì mình phải thêm như thế nào.

    Vấn đề này cũng đơn giản, quan trọng là bạn phải biết kết hợp nhiều cách xử lý khác nhau vô, thay vì chỉ xử lý tất cả trường hợp trên code. Cái này nó liên quan nhiều đến cách bạn quản lý dữ liệu, xây dụng bảng dữ liệu phù hợp để lưu trữ các thông tin phát sinh.
    - Vẫn giữa nguyên cái thủ tục TongCP() ở trên. Thay đổi tên textbox một chút.
    - Tạo thêm cột phụ trong Table: [SoTienTamUngVNDCL], [SoTienThanhToanL1VNDCL],....
       (CL: Còn lại).
    - Khi hạng mục nào "Da Thanh toan" thì gán số tiền Còn Lại =0 cho textbox tương ứng và ngược lại, lưu luôn xuống Table để có thông tin lưu trữ.
    - Trong Form, tạo thêm các textbox có source là các "số tiền còn lại", cho ẩn đi.
    - Trong thủ tục TongCP(), đổi tên các textbox thành tên các textbox số tiền còn lại.

    Sẽ còn nhiều cách xây dựng bảng quản lý dữ liệu tốt hơn nhưng hiện thời tôi chưa nghĩ ra.
    Xây dựng CSDL tốt thì việc code, truy vấn sẽ rất nhẹ nhàng. Tôi thấy nếu bạn tổ chức lại csdl thì có thể không cần viết code cho việc này, không cần gọi code mỗi khi mở Form mà chỉ cần tạo Query là được rồi.
     Đã có nhưng ứng dụng kế toán dùng phần lớn Query chứ không có nhiều code VBA vẫn chạy tốt và rất nhanh.