Phép cộng trong VBA

Liên hệ QC

BNTT

Bùi Nguyễn Triệu Tường
Thành viên danh dự
Tham gia
3/7/07
Bài viết
4,946
Được thích
23,206
Nghề nghiệp
Dạy đàn piano
Tôi gặp một vấn đề như thế này:
Trong form tôi có 2 textbox, dùng để nhập số vào, và 1 textbox để ghi ô tổng cộng.
Ví dụ:
Textbox1 = 1,567
Textbox2 = 6,000
Tôi gài trong VBA như sau:
Sub Textbox1_AfterUpdate ()
TextboxSum.Value = Textbox1.Value + Textbox2.Value
End Sub
Sub Textbox2_AfterUpdate ()
TextboxSum.Value = Textbox1.Value + Textbox2.Value
End Sub

Thì ô TextboxSum có kết quả là 15,676,000 - Nghĩa là bằng ghép 2 cái Textbox1 và Textbox2 lại với nhau.
Nhưng nếu tôi thay bằng:
Sub Textbox1_AfterUpdate ()
TextboxSum.Value = Textbox1.Value - Textbox2.Value * -1
End Sub
Sub Textbox2_AfterUpdate ()
TextboxSum.Value = Textbox1.Value - Textbox2.Value * -1
End Sub
Thì ô TextboxSum có kết quả là 7,676 - Nghĩa là đúng!
Tại sao vậy các bác? VBA không hiểu dấu + sao?
 
Tôi cũng gặp trường hợp như của bác và đã tìm ra được 2 cách giải quyết:
- Cách 1: giống như cách của bác ở trên
- Cách 2: TextboxSum.Value = Textbox1.Value * 1 + Textbox2.Value * 1
Từ cách thứ 2 tôi chỉ lờ mờ nhận thấy rằng hình như giá trị trong Textbox được mặc định dạng text chính vì vậy phải đưa về dạng giá trị bằng cách thêm *1 vào công thức để tính tổng. Còn không thì dấu (+) tương đương với dấu và (&). Tuy nhiên nếu tính các phép trừ (-), nhân (*), chia(/) thì lại không bị. Nên có thể nói cái hiểu ở trên của tôi là chưa chính xác.
Nhờ các cao thủ trên diễn đàn giải thích thêm.
 
Upvote 0
Hình như không phải là Textbox được mặc định dạng text đâu, vì cho dù tôi đã cẩn thận bằng:
(AfterUpdate): Textbox1.value = Format(Textbox1.value, "###.0" )
thì vẫn phải trừ (-) đi (textbox.value) nhân (*) với -1, hoặc làm như bác minhlev thì nó mới hiểu...
 
Upvote 0
minhlev đã viết:
Tôi cũng gặp trường hợp như của bác và đã tìm ra được 2 cách giải quyết:
- Cách 1: giống như cách của bác ở trên
- Cách 2: TextboxSum.Value = Textbox1.Value * 1 + Textbox2.Value * 1
Từ cách thứ 2 tôi chỉ lờ mờ nhận thấy rằng hình như giá trị trong Textbox được mặc định dạng text chính vì vậy phải đưa về dạng giá trị bằng cách thêm *1 vào công thức để tính tổng. Còn không thì dấu (+) tương đương với dấu và (&). Tuy nhiên nếu tính các phép trừ (-), nhân (*), chia(/) thì lại không bị. Nên có thể nói cái hiểu ở trên của tôi là chưa chính xác.
Nhờ các cao thủ trên diễn đàn giải thích thêm.

Giá trị mặc định của Text (text.value) là kiểu text. Mặc dù trong excel nói chung nhiều khi cho phép làm việc với text như là với number, tuy nhiên để sử dụng chuẩn xác thì người ta thường dùng các hàm convert như Val, Cdbl, Cdec . . . để convert text sang number.

Thân!
 
Upvote 0
Xin bổ sung thêm ý kiến của bác Mr_Okebab:
Các thuộc tính Textbox.Text và Textbox.Value đều trả về String.
Các bạn có thể Test thử:
Mã:
Private Sub CommandButton1_Click()
    MsgBox TypeName(TextBox1.Value)
    MsgBox Val(TextBox1.Text) + Val(TextBox2.Text)
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Textbox luôn mặc định giá trị của ô bao giờ cũng là String. Muốn tính toán kiểu number thì phải chuyển sang số bằng cách dùng function val(). Luôn luôn phải làm zậy thì mới đúng nếu ko là nối xâu đó (kiểu như hàm concat() đó)
 
Upvote 0
sinhvienvn2005 đã viết:
Textbox luôn mặc định giá trị của ô bao giờ cũng là String. Muốn tính toán kiểu number thì phải chuyển sang số bằng cách dùng function val(). Luôn luôn phải làm zậy thì mới đúng nếu ko là nối xâu đó (kiểu như hàm concat() đó)

Hàm gì của bác mà . . ghê vậy ???--=0--=0 Đây là hàm CONCATENATE !!!
Còn hàm Val thì không làm việc đúng với số thập phân

Thân!
 
Upvote 0
Hic.... Hic... cũng may là viết chử T... chử bác ấy mà Replace T---->C thì... chắc phải chuyển bài viết cho chú Thuận xử lý trong mục GIẢI TRÍ quá... Mém teo bugi...
 
Upvote 0
Nếu làm việc với số thập phân, nên dùng hàm CDbl để chuyển.
Ví dụ:
Textbox1 = 1,567
Textbox2 = 6,000
TextboxSum.Value =CDbl(TextBox1) + CDbl(TextBox2) cho kết quả
7,567
Các bạn dùng Format(Textbox1.value, "###.0" ) thì nó vẫn là text, chẳng qua là nó thêm dấu ngàn, dấu thập phân vào chuỗi số.
 
Upvote 0
phamduylong đã viết:
Nếu làm việc với số thập phân, nên dùng hàm CDbl để chuyển.
Ví dụ:
Textbox1 = 1,567
Textbox2 = 6,000
TextboxSum.Value =CDbl(TextBox1) + CDbl(TextBox2) cho kết quả
7,567
Các bạn dùng Format(Textbox1.value, "###.0" ) thì nó vẫn là text, chẳng qua là nó thêm dấu ngàn, dấu thập phân vào chuỗi số.

Cảm ơn bác.
Nhưng bác ơi, nếu vậy thì định dạng trong Textbox không có dấu phân cách hàng ngàn nơi...
Em gõ như vầy:
TextboxSum.Value =CDbl(TextBox1) + CDbl(TextBox2) -> TextboxSum.Value = 7567 chứ không ra 7,567 (!)
Muốn sau khi Update nó có dấu phân cách hàng ngàn thì sao?
 
Upvote 0
BNTT đã viết:
Cảm ơn bác.
Nhưng bác ơi, nếu vậy thì định dạng trong Textbox không có dấu phân cách hàng ngàn nơi...
Em gõ như vầy:
TextboxSum.Value =CDbl(TextBox1) + CDbl(TextBox2) -> TextboxSum.Value = 7567 chứ không ra 7,567 (!)
Muốn sau khi Update nó có dấu phân cách hàng ngàn thì sao?

Bác nhầm hay sao ấy chứ :
Thử hàm này xem:
PHP:
Function tam()
    Dim T1 As String, T2 As String
    T1 = "1,567"
    T2 = "6,000"
    tam = CDbl(T1) + CDbl(T2)
End Function

Thấy kết quả là 7,567 mà.

Thân!
 
Upvote 0
Dim T1 As String, T2 As String
T1 = "1,567"
T2 = "6,000"
tam = CDbl(T1) + CDbl(T2)
Thấy kết quả là 7,567 mà.
Xem thêm ví dụ này:
T1 = "1.567"
T2 = "6.000"
tam = CDbl(T1) + CDbl(T2)
Cũng cho cùng kết quả là 7,567
nhưng tam = 1,567 + 6,000 thì VBA báo lỗi
còn tam = 1.567 + 6.000 thì VBA sửa thành tam = 1.567 + 6#
Tôi rút ra kinh nghiệm (chưa chắc đúng!)
1. Khi nhập số vào TextBox, trừ trường hợp bắt buộc phải có số thập phân phải dùng dấu phân cách đúng theo khai báo trong Regional ... Không nên nhập dấu phân cách nhóm ngàn. Khi chuyển đổi, VBA nhận dạng từ text sang số dễ sai khi có các ký tự chen vào số.
2. Khi nhập số trực tiếp trong cân lệnh VBA, chú ý dấu thập phân là dấu chấm (.) và không được nhập dấu ngàn.
câu lệnh tam = 1,567 + 6,000 bị lỗi vì sử dụng dấu phẩy trong số
còn tam = 1.567 + 6.000 thì VBA sửa thành tam = 1.567 + 6# vì VBA hiểu 1.567 là một phẩy năm sáu bảy (theo VN) và 6.0006# vì 3 số 0 phía sau không có nghĩa.

Còn muốn sau khi ra kết quả có dấu chấm ngàn thì dùm hàm format(number,"#,##0") hoặc hàm do mình tự viết
 
Upvote 0
anhtuan1066 đã viết:
Hic.... Hic... cũng may là viết chử T... chử bác ấy mà Replace T---->C thì... chắc phải chuyển bài viết cho chú Thuận xử lý trong mục GIẢI TRÍ quá... Mém teo bugi...
Há há há dạ em cũng bó càng luôn....Chuyển bài qua đi, chuyển bài qua đi... hàng bị văng tùm lum hết rồi, hí hí hí -------->Recycled
Thưởng 2 bác vì đã có sáng kiến....
ChochacitiSpamktvkgdun-1.jpg
 
Upvote 0

File đính kèm

  • Calculator-using-Excel-VBA.xlsm
    33.7 KB · Đọc: 24
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom