Không thể nhân hoặc công 2 Textbox trên UserForm (1 người xem)

  • Thread starter Thread starter bebeen
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

bebeen

Thành viên thường trực
Tham gia
13/2/12
Bài viết
213
Được thích
24
Chào cả nhà! Lâu lém rùi em không sờ đến VBA, giờ em thiết lập code nhân và cộng các textbox trên userform mà không sao để nó thực hiện được. Em gửi lên đây nhờ mọi người xem cho em nhé! Nguyên nhân lỗi của em là ở đâu nhé!?
Mã:
Private Sub TextBox2_Change()
    On Error Resume Next
    With NhapLieu
        .TextBox3.Value = .TextBox1.Value * .TextBox2.Value
        .TextBox4.Value = .TextBox1.Value + .TextBox3.Value 'Sao cong thuc nay khong duoc?
    End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Chào cả nhà! Lâu lém rùi em không sờ đến VBA, giờ em thiết lập code nhân và cộng các textbox trên userform mà không sao để nó thực hiện được. Em gửi lên đây nhờ mọi người xem cho em nhé! Nguyên nhân lỗi của em là ở đâu nhé!?
Mã:
Private Sub TextBox2_Change()
    On Error Resume Next
    With NhapLieu
        .TextBox3.Value = .TextBox1.Value * .TextBox2.Value
        .TextBox4.Value = .TextBox1.Value + .TextBox3.Value 'Sao cong thuc nay khong duoc?
    End With
End Sub

bạn tham khảo bài này sẽ rõ: :-=
[h=1]Code Công thức "cộng, trừ, nhân, chia"[/h]
 
Upvote 0
Sau khi xem link của bạn @Phucbugis nhưng mình cũng hiểu lém! Có cách nào đơn giản hơn không nhỉ? Chỉ là nhân 2 Textbox với nhau thui mà?
 
Upvote 0
Sau khi xem link của bạn @Phucbugis nhưng mình cũng hiểu lém! Có cách nào đơn giản hơn không nhỉ? Chỉ là nhân 2 Textbox với nhau thui mà?
Muốn tính toán trên UserForm, các bạn thêm trước hàm Val() vào các controls, chẳng hạn:

TextBox3 = Val(TextBox1) * Val(TextBox2)
 
Upvote 0
Sau khi xem link của bạn @Phucbugis nhưng mình cũng hiểu lém! Có cách nào đơn giản hơn không nhỉ? Chỉ là nhân 2 Textbox với nhau thui mà?

Nếu tôi không lầm thì ...

Nguyên tắc là:
1. Nếu bạn dùng trong TextBox ký tự dấu thập phân như thiết lập trong Control Panel thì bạn luôn nhân được và nhân đúng. Tức nếu trong CP thiết lập "," và bạn dùng "," hoặc thiết lập "." và bạn dùng "." thì luôn được.
2. Nếu trong CP thiết lập "." là dấu thập phân thì bạn dùng trong TextBox dấu "," cũng được.

Kết luận: Nếu bạn dùng trong TextBox ký tự dấu thập phân như thiết lập trong Control Panel thì bạn luôn nhân được và nhân đúng.

3. Thay cho TextBox1.Value + TextBox3.Value thì bạn dùng 1 * TextBox1.Value + TextBox3.Value

Dùng hàm Val trong những trường hợp này không là giải pháp. Tôi dùng thiết lập trong CP là dấu phẩy ",". Trên sheet tôi dùng dấu phẩy khi nhập số, vì ngược lại thì nó thành Text. Nếu trong TextBox tôi cũng dùng dấu phẩy "," thì

Mã:
TextBox1.Value = 1,5
TextBox2.Value = 3,4
=> TextBox3 = Val(TextBox1.Value) * Val(TextBox2.Value) = 1 * 3 = 3
Trong khi đó 1,5 * 3,4 = 5,1
Tương tự cho phép cộng.
 
Upvote 0
Nhằm đảm bảo các vấn đề về số, kể cả các bạn thay đổi trong Control Panel (dĩ nhiên khi nhập số cũng là như thiết lập), thì tôi sử dụng hàm này:

Mã:
Function NumRes(ByVal MyNum As String) As Double
    On Error Resume Next
    NumRes = CDbl(MyNum)
End Function

Đặt hàm trên trong một Module nào đó, và cách sử dụng như thế này:

TextBox3 = NumRes(TextBox1) * NumRes(TextBox2)

%#^#$ Bảo hành 10 năm kakaka
 
Upvote 0
Nhằm đảm bảo các vấn đề về số, kể cả các bạn thay đổi trong Control Panel (dĩ nhiên khi nhập số cũng là như thiết lập), thì tôi sử dụng hàm này:

Mã:
Function NumRes(ByVal MyNum As String) As Double
    On Error Resume Next
    NumRes = CDbl(MyNum)
End Function

Đặt hàm trên trong một Module nào đó, và cách sử dụng như thế này:

TextBox3 = NumRes(TextBox1) * NumRes(TextBox2)

%#^#$ Bảo hành 10 năm kakaka

Nói cho cùng thì phải dùng ký tự thập phân như trong CP để luôn đúng. Mà đã dùng ký tự thập phân như trong CP thì hàm NumRes là thừa. Vì chắc chắn khi đó
Mã:
TextBox3 = TextBox1 * TextBox2

là đủ.

Thế trường hợp không dùng ký tự như trong CP thì sao? Thì lúc đó hàm NumRes cũng không cứu được.

Chẳng hạn nếu có trong CP dấu phẩy "," mà trong TextBox dùng dấu chấm "." thì
Mã:
Với TextBox1 = 1.5, TextBox2 = 3.4
thì TextBox3 = NumRes(TextBox1) * NumRes(TextBox2) = 0

Tại sao?

Tại vì trong hàm
Mã:
Function NumRes(ByVal MyNum As String) As Double
    On Error Resume Next
    NumRes = [COLOR=#ff0000]CDbl(MyNum)[/COLOR]
End Function

chỗ đỏ đỏ sẽ có lỗi. Nhưng do có On Error Resume Next nên lỗi không được thông báo và trước khi hàm trở về thì nó được gán cho giá trị 0.
 
Upvote 0
Nói cho cùng thì phải dùng ký tự thập phân như trong CP để luôn đúng. Mà đã dùng ký tự thập phân như trong CP thì hàm NumRes là thừa. Vì chắc chắn khi đó
Mã:
TextBox3 = TextBox1 * TextBox2

là đủ.

Thế trường hợp không dùng ký tự như trong CP thì sao? Thì lúc đó hàm NumRes cũng không cứu được.

Chẳng hạn nếu có trong CP dấu phẩy "," mà trong TextBox dùng dấu chấm "." thì
Mã:
Với TextBox1 = 1.5, TextBox2 = 3.4
thì TextBox3 = NumRes(TextBox1) * NumRes(TextBox2) = 0

Tại sao?

Tại vì trong hàm
Mã:
Function NumRes(ByVal MyNum As String) As Double
    On Error Resume Next
    NumRes = [COLOR=#ff0000]CDbl(MyNum)[/COLOR]
End Function

chỗ đỏ đỏ sẽ có lỗi. Nhưng do có On Error Resume Next nên lỗi không được thông báo và trước khi hàm trở về thì nó được gán cho giá trị 0.

Hàm Val() sẽ không đúng khi ta thiết lập dấu thập phân từ dấu chấm (.) sang dấu (,). Theo tôi được biết, Hàm này chỉ biết dấu chấm thì phải.

Riêng hàm CDbl nó sẽ chuyển đúng mọi số theo kiểu của hệ thống, điều này khác hẳn với hàm VAL.

Tuy nhiên, cái hay của hàm Val là gặp chuỗi thì nó cho kết quả là 0, và dạng vừa số, vừa chuỗi thì nó lọc số ở đầu và cắt hẳn phần chuỗi ở phía sau (VD: 0123Nghia thì cho ra 123), theo tôi, đặc điểm này rất thú vị!

Và hàm CDbl sẽ phát sinh lỗi nếu gặp dạng chuỗi (bất cứ chuỗi nào) vì thế mới bẫy lỗi cho nó.

Kết luận: Khi nhập số phải nhập đúng với hệ thống để tính toán, và phải hiểu mình nhập cái gì, tính cho cái gì.

Còn khi dùng số khác với định dạng của hệ thống thì phải replace dấu chấm thành dấu phẩy, dấu phẩy thành dấu chấm để nó trở thành dạng số của hệ thống, cho chúng tính xong rồi định dạng lại (nếu muốn).

Nói cho cùng thì phải dùng ký tự thập phân như trong CP để luôn đúng. Mà đã dùng ký tự thập phân như trong CP thì hàm NumRes là thừa. Vì chắc chắn khi đó
Mã:
TextBox3 = TextBox1 * TextBox2

là đủ.

Sẽ không thừa nếu là PHÉP CỘNG!
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm Val() sẽ không đúng khi ta thiết lập dấu thập phân từ dấu chấm (.) sang dấu (,). Theo tôi được biết, Hàm này chỉ biết dấu chấm thì phải.

Riêng hàm CDbl nó sẽ chuyển đúng mọi số theo kiểu của hệ thống, điều này khác hẳn với hàm VAL.

Tuy nhiên, cái hay của hàm Val là gặp chuỗi thì nó cho kết quả là 0, và dạng vừa số, vừa chuỗi thì nó lọc số ở đầu và cắt hẳn phần chuỗi ở phía sau (VD: 0123Nghia thì cho ra 123), theo tôi, đặc điểm này rất thú vị!

Và hàm CDbl sẽ phát sinh lỗi nếu gặp dạng chuỗi (bất cứ chuỗi nào) vì thế mới bẫy lỗi cho nó.

Kết luận: Khi nhập số phải nhập đúng với hệ thống để tính toán, và phải hiểu mình nhập cái gì, tính cho cái gì.



Tôi không hiểu bạn trích bài của tôi để làm gì? Thì tôi đã chả nói thế là gì?

Kết luận: Nếu bạn dùng trong TextBox ký tự dấu thập phân như thiết lập trong Control Panel thì bạn luôn nhân được và nhân đúng

Và thêm nữa. Nếu ta đã
Khi nhập số phải nhập đúng với hệ thống để tính toán

Thì khi đó hàm NumRes là thừa trong
Mã:
TextBox3 = NumRes(TextBox1) * NumRes(TextBox2)

Bạn nên chú ý là tôi và bạn đang trả lời trong chủ đề cụ thể. Mà trong chủ đề cụ thể này thì
1. Nhập không đúng với CP thì Val hay NumRes đều không cứu được.
2. Nhập đúng như CP thì NumRes là thừa.

Sẽ không thừa nếu là PHÉP CỘNG!

Tôi thường đọc rất kỹ bài của người khác. Phản biện mà không đọc kỹ bài của người khác là không tôn trọng họ.

Vì bạn dùng NumRes như là thuốc cho phép nhân nên tôi mới có ý kiến.

Còn khi dùng số khác với định dạng của hệ thống thì phải replace dấu chấm thành dấu phẩy, dấu phẩy thành dấu chấm để nó trở thành dạng số của hệ thống, cho chúng tính xong rồi định dạng lại (nếu muốn).

Cái này thì đúng rồi, không ai bác bỏ cả.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nên chú ý là tôi và bạn đang trả lời trong chủ đề cụ thể. Mà trong chủ đề cụ thể này thì
1. Nhập không đúng với CP thì Val hay NumRes đều không cứu được.
2. Nhập đúng như CP thì NumRes là thừa.
Tôi thường đọc rất kỹ bài của người khác. Phản biện mà không đọc kỹ bài của người khác là không tôn trọng họ.
Vì bạn dùng NumRes như là thuốc cho phép nhân nên tôi mới có ý kiến.

Khi một bài toán cụ thể là phép nhân, thì đã trả lời cụ thể, nhưng chính Thầy là người nói đến định dạng hệ thống, thì phải có bài để trả lời cụ thể việc định dạng hệ thống, cái hàm NumRes của em đâu chỉ phục vụ cho phép nhân?! Nó phải phục vụ cho những dạng số ở các phép tính khác chứ!

Nhưng nhờ sự mở rộng của Thầy thì có lẽ nhiều người sẽ rất quan tâm đấy Thầy ạ. Chúc Thầy vui.
 
Upvote 0

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

Back
Top Bottom