-
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 ThentxtSotientamungVND = txtTonggiatriPOcoVAT * txtGiatriphantramtamungtxtSotientamungUSD = 0ElseIf txtDongtienthanhtoan = "VND" And cboxVAT_TU = False ThentxtSotientamungVND = txtGiatriPO * txtGiatriphantramtamungtxtSotientamungUSD = 0ElseIf txtDongtienthanhtoan <> "VND" And cboxVAT_TU = True ThentxtSotientamungUSD = txtTonggiatriPOcoVAT * txtGiatriphantramtamungtxtSotientamungVND = 0ElseIf txtDongtienthanhtoan <> "VND" And cboxVAT_TU = False ThentxtSotientamungUSD = txtGiatriPO * txtGiatriphantramtamungtxtSotientamungVND = 0End IfIf txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanVND = 0End IfIf txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotientamungVNDEnd IfIf txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotientamungVND + txtSotienthanhtoanL1VNDEnd IfIf txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VNDEnd IfIf txtDongtienthanhtoan = "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan = "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanVND = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VNDEnd IfIf 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” ThentxtSotiencanthanhtoanVND = txtSotienthanhtoanL1VND + txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanUSD = 0End IfIf txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 = “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotientamungVNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotientamungVND + txtSotienthanhtoanL1VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung <> “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotientamungVND + txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VND + txtSotienthanhtoanL3VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 <> “Da thanh toan” And txtThanhtoanL3 = “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotienthanhtoanL1VND + txtSotienthanhtoanL2VNDEnd IfIf txtDongtienthanhtoan <> "VND" And txtTamung = “Da thanh toan” And txtThanhtoanL1 <> “Da thanh toan” And txtThanhtoanL2 = “Da thanh toan” And txtThanhtoanL3 <> “Da thanh toan” ThentxtSotiencanthanhtoanUSD = txtSotienthanhtoanL1VND + txtSotienthanhtoanL3VNDEnd IfEnd If -
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 -
RE: Câu lệnh VBA không chạy
ongke0711 > 27-04-23, 12:18 AM
-
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
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 Long, b As Long, c As Long, d As 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: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ã:Dim a, b, c, d As Integer
- 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 Long, b As Long, c As Long, d As 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: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ã:Dim a, b, c, d As Integer
- 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.