Không nhập được số thập phân trong Textbox

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

moihocvba

Thành viên thường trực
Tham gia
16/8/20
Bài viết
211
Được thích
50
Em chào anh chị, nhờ anh chị giúp em bài này với ạ, em nghiên cứu cả buổi không ra.
Trong userform có 3 Textbox, txtSoLuong, txtDonGia, txtThanhTien, em muốn khi nhập vào ô txtSoLuong thì ô txtThanhTien = txtSoLuong*txtDonGia còn khi nhập vào ô txtThanhTien thì txtSoLuong = txtThanhTien/txtDonGia.
Em viết code như này chạy được rồi, nhưng không nhập được số thập phân vào ô txtSoLuong, mong mọi người giúp em với ạ. Em cám ơn rất nhiều!

Mã:
Option Explicit
Private Sub txtSoLuong_Change()
    On Error Resume Next
    If IsNumeric(txtSoLuong) = True Then
        Application.EnableEvents = False
        txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
        Application.EnableEvents = True
    End If
End Sub
Private Sub txtDonGia_Change()
On Error GoTo BaoLoi
    Me.txtDonGia = Format(txtDonGia, "#,##0")
    If txtDonGia = "" Then txtDonGia = 0
    txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
    Exit Sub
BaoLoi:
    txtThanhTien = 0
End Sub
Private Sub txtThanhTien_Change()
    On Error Resume Next
   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Application.EnableEvents = False
    txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
    Exit Sub
    Application.EnableEvents = True
End Sub


Private Sub UserForm_Initialize()
txtDonGia = 20000
End Sub
 

File đính kèm

  • Vi du form (4).xlsm
    17.3 KB · Đọc: 12
Em chào anh chị, nhờ anh chị giúp em bài này với ạ, em nghiên cứu cả buổi không ra.
Trong userform có 3 Textbox, txtSoLuong, txtDonGia, txtThanhTien, em muốn khi nhập vào ô txtSoLuong thì ô txtThanhTien = txtSoLuong*txtDonGia còn khi nhập vào ô txtThanhTien thì txtSoLuong = txtThanhTien/txtDonGia.
Em viết code như này chạy được rồi, nhưng không nhập được số thập phân vào ô txtSoLuong, mong mọi người giúp em với ạ. Em cám ơn rất nhiều!

Mã:
Option Explicit
Private Sub txtSoLuong_Change()
    On Error Resume Next
    If IsNumeric(txtSoLuong) = True Then
        Application.EnableEvents = False
        txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
        Application.EnableEvents = True
    End If
End Sub
Private Sub txtDonGia_Change()
On Error GoTo BaoLoi
    Me.txtDonGia = Format(txtDonGia, "#,##0")
    If txtDonGia = "" Then txtDonGia = 0
    txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
    Exit Sub
BaoLoi:
    txtThanhTien = 0
End Sub
Private Sub txtThanhTien_Change()
    On Error Resume Next
   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Application.EnableEvents = False
    txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
    Exit Sub
    Application.EnableEvents = True
End Sub


Private Sub UserForm_Initialize()
txtDonGia = 20000
End Sub
Nó bị logic chỗ này giới hạn chăng?
Bạn sửa chút như phía dưới xem!
PHP:
Private Sub txtThanhTien_Change()
    On Error Resume Next
'   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Me.txtThanhTien = Me.txtThanhTien
    Application.EnableEvents = False
    txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
    Exit Sub
    Application.EnableEvents = True
End Sub
 
Upvote 0
Em chào anh chị, nhờ anh chị giúp em bài này với ạ, em nghiên cứu cả buổi không ra.
Trong userform có 3 Textbox, txtSoLuong, txtDonGia, txtThanhTien, em muốn khi nhập vào ô txtSoLuong thì ô txtThanhTien = txtSoLuong*txtDonGia còn khi nhập vào ô txtThanhTien thì txtSoLuong = txtThanhTien/txtDonGia.
Em viết code như này chạy được rồi, nhưng không nhập được số thập phân vào ô txtSoLuong, mong mọi người giúp em với ạ. Em cám ơn rất nhiều!

Mã:
Option Explicit
Private Sub txtSoLuong_Change()
    On Error Resume Next
    If IsNumeric(txtSoLuong) = True Then
        Application.EnableEvents = False
        txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
        Application.EnableEvents = True
    End If
End Sub
Private Sub txtDonGia_Change()
On Error GoTo BaoLoi
    Me.txtDonGia = Format(txtDonGia, "#,##0")
    If txtDonGia = "" Then txtDonGia = 0
    txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
    Exit Sub
BaoLoi:
    txtThanhTien = 0
End Sub
Private Sub txtThanhTien_Change()
    On Error Resume Next
   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Application.EnableEvents = False
    txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
    Exit Sub
    Application.EnableEvents = True
End Sub


Private Sub UserForm_Initialize()
txtDonGia = 20000
End Sub
Tính toán vòng quanh kiểu không xác định con gà hay cái trứng có trước thì Excel bí là phải
 
Upvote 0
Nó bị logic chỗ này giới hạn chăng?
Bạn sửa chút như phía dưới xem!
PHP:
Private Sub txtThanhTien_Change()
    On Error Resume Next
'   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Me.txtThanhTien = Me.txtThanhTien
    Application.EnableEvents = False
    txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
    Exit Sub
    Application.EnableEvents = True
End Sub
Nếu như vầy thì thành tiền nó ko định dạng số ngăn cách hàng nghìn được ạ
Bài đã được tự động gộp:

Tính toán vòng quanh kiểu không xác định con gà hay cái trứng có trước thì Excel bí là phải
Ca này khó nên em mới nhờ hỗ trợ ạ.
Ví dụ như khi bán xăng đầu, người ta có thể mua theo số lượng lít, hoặc mua theo số tiền chẵn (ví dụ đổ 100k) nó tự tính ra số lít.
Cho nên có lúc nhập vào số lượng, có lúc nhập vào ô thành tiền.
Anh biết làm thế nào không hướng dẫn em với ạ!
 
Upvote 0
Nếu như vầy thì thành tiền nó ko định dạng số ngăn cách hàng nghìn được ạ
Bài đã được tự động gộp:


Ca này khó nên em mới nhờ hỗ trợ ạ.
Ví dụ như khi bán xăng đầu, người ta có thể mua theo số lượng lít, hoặc mua theo số tiền chẵn (ví dụ đổ 100k) nó tự tính ra số lít.
Cho nên có lúc nhập vào số lượng, có lúc nhập vào ô thành tiền.
Anh biết làm thế nào không hướng dẫn em với ạ!
Dùng 1 nút bấm khi cần tính ngược thành tiền ra số lượng. Còn không thì format txtsoluong đó 2 con số thập phân.
 
Upvote 0
Do dùng sai sự kiện nên mới bị tham chiếu vòng. Cả chục sự kiện cứ gì phải dùng sự kiện Change?

Mã:
Private Sub txtSoLuong_Change()
    If IsNumeric(txtSoLuong) = True Then
        Application.EnableEvents = False
        txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
        Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
        Application.EnableEvents = True
    End If
End Sub
'----------'
Private Sub txtDonGia_Change()
    Me.txtDonGia = Format(txtDonGia, "#,##0")
    If txtDonGia = "" Then txtDonGia = 0
    txtThanhTien = CDbl(Val(txtSoLuong)) * CDbl(txtDonGia)
   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Exit Sub
End Sub
'------------'
Private Sub txtThanhTien_AfterUpdate()
   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Application.EnableEvents = False
    txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
    Exit Sub
    Application.EnableEvents = True
End Sub
Thậm chi có thể bỏ bớt EnableEvent các kiểu và On Error các kiểu
 
Lần chỉnh sửa cuối:
Upvote 0
Do dùng sai sự kiện nên mới bị tham chiếu vòng. Cả chục sự kiện cứ gì phải dùng sự kiện Change?

Mã:
Private Sub txtSoLuong_Change()
    If IsNumeric(txtSoLuong) = True Then
        Application.EnableEvents = False
        txtThanhTien = CDbl(txtSoLuong) * CDbl(txtDonGia)
        Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
        Application.EnableEvents = True
    End If
End Sub
'----------'
Private Sub txtDonGia_Change()
    Me.txtDonGia = Format(txtDonGia, "#,##0")
    If txtDonGia = "" Then txtDonGia = 0
    txtThanhTien = CDbl(Val(txtSoLuong)) * CDbl(txtDonGia)
   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Exit Sub
End Sub
'------------'
Private Sub txtThanhTien_AfterUpdate()
   Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
    Application.EnableEvents = False
    txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
    Exit Sub
    Application.EnableEvents = True
End Sub
Thậm chi có thể bỏ bớt EnableEvent các kiểu và On Error các kiểu
Dạ em cám ơn anh rất nhiều!
Khi em nhập 2 ô Đơn giá và Thành tiền như thế này:
1677719445301.png

Sau khi nhập xong, After Update nó thành ra thế này ạ, phải chỉnh lại thế nào, mong anh chỉ giúp:
1677719491784.png

Em làm file bán giá xăng nên giá hơi lẻ lẻ vậy.
 
Upvote 0
Dạ em cám ơn anh rất nhiều!
Khi em nhập 2 ô Đơn giá và Thành tiền như thế này:
View attachment 287054

Sau khi nhập xong, After Update nó thành ra thế này ạ, phải chỉnh lại thế nào, mong anh chỉ giúp:
View attachment 287055

Em làm file bán giá xăng nên giá hơi lẻ lẻ vậy.
Đàng nào rồi nó cũng tham chiếu vòng mà, cái này tính ra cái kia, làm tròn rồi tính ngược lại. Tôi nghĩ bạn không nên làm như thế mà hãy cho tính tự động 1 chiều thôi (lấy giá tiền chẵn làm chuẩn). Chiều ngược lại thì bấm nút thủ công.
 
Upvote 0
Đàng nào rồi nó cũng tham chiếu vòng mà, cái này tính ra cái kia, làm tròn rồi tính ngược lại. Tôi nghĩ bạn không nên làm như thế mà hãy cho tính tự động 1 chiều thôi (lấy giá tiền chẵn làm chuẩn). Chiều ngược lại thì bấm nút thủ công.
Trong sheet Excel có lệnh Application.EnableEvents = False để khi nhập ở ô này thì sự kiện ô khác không chạy, trên Userform không làm được như vậy hả anh?
 
Upvote 0
Trong sheet Excel có lệnh Application.EnableEvents = False để khi nhập ở ô này thì sự kiện ô khác không chạy, trên Userform không làm được như vậy hả anh?
Application.EnableEvents không có tác dụng với các controls, tôi thường dùng biến để điều khiển.
--
Code sau tôi chỉ sửa lại code của bạn để hoạt động theo mô tả của bạn, chưa bẫy lỗi các trường hợp khác.
Mã:
Option Explicit
Private bDisableEvent As Boolean
Private Sub txtSoLuong_Change()
    On Error Resume Next
    If Not bDisableEvent Then
        If IsNumeric(txtSoLuong) = True Then
            bDisableEvent = True
            txtThanhTien = Format(CDbl(txtSoLuong) * CDbl(txtDonGia), "#,##0")
            bDisableEvent = False
        End If
    End If
End Sub
Private Sub txtDonGia_Change()
    If Not bDisableEvent Then
        bDisableEvent = True
        If txtDonGia = "" Then
            txtDonGia = 0
        Else
            Me.txtDonGia = Format(txtDonGia, "#,##0")
        End If
        txtThanhTien = Format(CDbl("0" & txtSoLuong) * CDbl(txtDonGia), "#,##0")
        bDisableEvent = False
    End If
End Sub
Private Sub txtThanhTien_Change()
    If Not bDisableEvent Then
        bDisableEvent = True
        txtSoLuong = Round(CDbl(txtThanhTien) / CDbl(txtDonGia), 2)
        Me.txtThanhTien = Format(Me.txtThanhTien, "#,##0")
        bDisableEvent = False
    End If
End Sub

Private Sub UserForm_Initialize()
txtDonGia = 20000
End Sub
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Đàng nào rồi nó cũng tham chiếu vòng mà, cái này tính ra cái kia, làm tròn rồi tính ngược lại. Tôi nghĩ bạn không nên làm như thế mà hãy cho tính tự động 1 chiều thôi (lấy giá tiền chẵn làm chuẩn). Chiều ngược lại thì bấm nút thủ công.
Chỉ là do cứ dùng sự kiện Change. Gõ phím mỗi ký tự, xóa, paste từ nơi khác vào, gán bằng code, .... đều là change. Hơi 1 tí là chạy code.
Dùng các sự kiện khác như BeforeUpdate, AfterUpdate, Exit, ... thì chỉ chạy 1 lần lúc rời khỏi Textbox. Gán bằng code từ xa thì đâu có vào đâu mà ra khỏi, nên code không chạy.
Ghi chú:
Ngay cả 3 sự kiện "ra khỏi textbox" cũng có sự khác nhau, tùy trường hợp mà chọn 1.
 
Lần chỉnh sửa cuối:
Upvote 0
Đàng nào rồi nó cũng tham chiếu vòng mà, cái này tính ra cái kia, làm tròn rồi tính ngược lại. Tôi nghĩ bạn không nên làm như thế mà hãy cho tính tự động 1 chiều thôi (lấy giá tiền chẵn làm chuẩn). Chiều ngược lại thì bấm nút thủ công.
Chuyện này là do thớt không có kinh nghiệm về "phát sinh bán hàng lẻ". Trong khi ghi phát sinh bán hàng lẻ thế này, cuối ngày tổng lại sẽ có rất nhiều chênh lêchleecjueecs vố ý hay cố tình sai giá đương nhiên lad sẽ xảy ra.
Vì vậy, người lập phần mềm phải liên hệ chặt chẽ với người ngỷ (hoặc người chịu trách nhiệm về hệ thống bán) để GHI LẠI chính xác từng bước của quy trình và lô gic của chúng. Tôi nhấn mạnh điểm "ghi lại". Có nhiều phần mềm, toi phải ghi lại mấy trang giấy, về nhà túm lại thành một file Word vài trang. Hôm sau in ra đưa cho thân chủ hỏi xem có đúng ý chưa.

Làm kiểu thô (kiểm toán sai ráng chịu) như thớt thì trước mát có 3 thông số liên hệ chặt chẽ với nhau.
1. Với hai thông số thì tính ra thứ ba.
2. Thay đổi một thì sẽ thay đổi một trong hai cồn lại. Vì vậy, phải có chỗ xác định cho biết ưu tiên thay đổi., ví dụ tôi thay ddoooir 2 thì 1 hay 3 sẽ thay đổi theo? và nếu tôi đổi 3 thì 1 hay 2 sẽ đổi theo?
3. Trong ứng dụng này không có ghi lại thằng nào là thằng được người dùng vào cuối cùng, buộc thàng kia phải thay theo?
Ứng dụng này, thực ra có rất nhiều lỗ hổng mà tôi bảo đảm chỉ chay vài tuần là nát bét.

Ở đây, thớt không hỏi quy trình mà chỉ hỏi dạng thâu và dạng hiển thị trên form. Để trả lời câu hỏi nay, phải biết đầu vào của thớt ra sao (đã giao ước sẵn với người dùng - cái này thuộc về input mask), và thớt muốn đầu ra của ra sao (tùy ý, tự điều chỉnh - miến sao ra đúng ). Thớt dùng hàm ép kiểu và format hơi nhiều mà có biết chúng hoạt động ra sao hay không? Về nghiên cứu chúng lại trước đã.
 
Upvote 0
Chuyện này là do thớt không có kinh nghiệm về "phát sinh bán hàng lẻ". Trong khi ghi phát sinh bán hàng lẻ thế này, cuối ngày tổng lại sẽ có rất nhiều chênh lêchleecjueecs vố ý hay cố tình sai giá đương nhiên lad sẽ xảy ra.
Vụ này tôi biết. Người chạy xe ghé dổ xăng có 2 dạng là đổ theo lít (hoặc đổ đầy bình), và người đổ chẵn tiền (xe máy đổ 5 chục, bẩy chục, xe ô tô đổ 3 trăm, năm trăm). Giá bán không đổi nên điều chỉnh (tính toán) lại. Số lượng (lít) chắc là quy ước làm tròn 2 con thập phân (không format)
 
Upvote 0
Vụ này tôi biết. Người chạy xe ghé dổ xăng có 2 dạng là đổ theo lít (hoặc đổ đầy bình), và người đổ chẵn tiền (xe máy đổ 5 chục, bẩy chục, xe ô tô đổ 3 trăm, năm trăm). Giá bán không đổi nên điều chỉnh (tính toán) lại. Số lượng (lít) chắc là quy ước làm tròn 2 con thập phân (không format)
Dạ chú nói đúng lắm ạ, con đang thuộc trường hợp này.
Con đã áp dụng code của anh huuthang_bd vào và đã chạy được rồi ạ. Trong lúc chạy có lỗi gì không thì con sẽ phản hồi ạ.
Con cám ơn chú ptm0412, cám ơn anh huuthang_bd và mọi người đã hỗ trợ ạ!
Cám ơn rất nhiều!
 
Upvote 0
Dạ chú nói đúng lắm ạ, con đang thuộc trường hợp này.
Con đã áp dụng code của anh huuthang_bd vào và đã chạy được rồi ạ.
Mặc dù code huuthang_bd chạy rồi nhưng cũng nên cân nhắc đổi sang dùng sự kiện khác, rất giới hạn dùng sự kiện Change
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom