Giúp đỡ em code VBA

minhkhoi9492

Thành viên mới
Tham gia ngày
6 Tháng bảy 2015
Bài viết
9
Được thích
0
Điểm
163
Tuổi
27
Em có userform thiết kế sẵn . Yêu cầu là nhập vào 2 số và hiển thị tự động kết quả số thứ 1 chia số thứ 2 . Bác nào giúp em về code bài này với
 

File đính kèm

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
6,277
Được thích
10,344
Điểm
1,860
PHP:
Private Sub TextBox2_Change()

Me!lblKQ.Caption = Format(Me!TextBox1.Value / Me!TextBox2, "###.000")
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:

minhkhoi9492

Thành viên mới
Tham gia ngày
6 Tháng bảy 2015
Bài viết
9
Được thích
0
Điểm
163
Tuổi
27
Cảm ơn bác . Cho mình hỏi thêm là giờ nếu nhập chữ vào thì chương trình đang chạy báo lỗi . Code như thế nào để nó kiểm tra số nhập vào nếu sai hiện thông báo để mình nhập lại ko
Bài đã được tự động gộp:

Gặp số thứ hai 0 hoặc gần 0 là cơ-rát liền.
Xử lí lỗi đó sao vậy bác ?
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,507
Được thích
3,793
Điểm
560
Chưa nói tới chia cho 0 hay nhập chữ. Tôi muốn chia vd. 12 cho 0.3 (0,3) thì không thể gõ được 0.3

Nói chung nếu muốn chia cho số < 1 thì không gõ được số bị chia. Bất lực. :D
 

minhkhoi9492

Thành viên mới
Tham gia ngày
6 Tháng bảy 2015
Bài viết
9
Được thích
0
Điểm
163
Tuổi
27
Chưa nói tới chia cho 0 hay nhập chữ. Tôi muốn chia vd. 12 cho 0.3 (0,3) thì không thể gõ được 0.3

Nói chung nếu muốn chia cho số < 1 thì không gõ được số bị chia. Bất lực. :D
Nếu mà bất lực vậy còn chưa kể còn tính toán vs số âm nữa chắc càng bất lực hơn hả bác . Em nghĩ mãi mà chưa giải quyết được
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,507
Được thích
3,793
Điểm
560
Nếu mà bất lực vậy còn chưa kể còn tính toán vs số âm nữa chắc càng bất lực hơn hả bác . Em nghĩ mãi mà chưa giải quyết được
Thực ra những bài của lớp 1 tôi học quá lâu rồi nên không nhớ hết.

Đại loại là thế này.

Truyền tham số chẳng qua để dễ tùy biến thôi. Nếu tôi viết sub chia không có tham số mà dùng TextBox1, TextBox2 và Label4 trong code của sub chia nhưng vd. bạn có thêm TextBox3, TextBox4 và cũng chia TextBox3 / TextBox4 thì có phải rách việc, có phải méo mặt không. Tóm lại sub chia dùng cho nhiều "cặp chia".
Mã:
Option Explicit

Private Sub chia(ByVal tb1 As MSForms.TextBox, ByVal tb2 As MSForms.TextBox, ByVal lb As MSForms.Label)
    If Not IsNumeric(tb1.Value) Then
        lb.Caption = "Loi so chia"
    ElseIf Not IsNumeric(tb2.Value) Or tb2.Value = 0 Then
        lb.Caption = "Loi so bi chia"
    Else
        lb.Caption = tb1.Value / tb2.Value
    End If
End Sub

'    vi du gan ket qua xuong sheet
Private Sub CommandButton1_Click()
    Sheet1.Range("A1").Value = CDbl(Label4.Caption)
End Sub

Private Sub TextBox1_Change()
    chia TextBox1, TextBox2, Label4
End Sub

Private Sub TextBox2_Change()
    chia TextBox1, TextBox2, Label4
End Sub
 

minhkhoi9492

Thành viên mới
Tham gia ngày
6 Tháng bảy 2015
Bài viết
9
Được thích
0
Điểm
163
Tuổi
27
Ok bác
Thực ra những bài của lớp 1 tôi học quá lâu rồi nên không nhớ hết.

Đại loại là thế này.

Truyền tham số chẳng qua để dễ tùy biến thôi. Nếu tôi viết sub chia không có tham số mà dùng TextBox1, TextBox2 và Label4 trong code của sub chia nhưng vd. bạn có thêm TextBox3, TextBox4 và cũng chia TextBox3 / TextBox4 thì có phải rách việc, có phải méo mặt không. Tóm lại sub chia dùng cho nhiều "cặp chia".
Mã:
Option Explicit

Private Sub chia(ByVal tb1 As MSForms.TextBox, ByVal tb2 As MSForms.TextBox, ByVal lb As MSForms.Label)
    If Not IsNumeric(tb1.Value) Then
        lb.Caption = "Loi so chia"
    ElseIf Not IsNumeric(tb2.Value) Or tb2.Value = 0 Then
        lb.Caption = "Loi so bi chia"
    Else
        lb.Caption = tb1.Value / tb2.Value
    End If
End Sub

'    vi du gan ket qua xuong sheet
Private Sub CommandButton1_Click()
    Sheet1.Range("A1").Value = CDbl(Label4.Caption)
End Sub

Private Sub TextBox1_Change()
    chia TextBox1, TextBox2, Label4
End Sub

Private Sub TextBox2_Change()
    chia TextBox1, TextBox2, Label4
End Sub
Cảm ơn bác . Em chạy thử thấy ok rồi mà em muốn hỏi thêm là giờ có cách nào để chương trình nó biết mình nhập sai số nào nó hiện thông báo lên cho mình biết không bác ?
 

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,258
Được thích
520
Điểm
860
Bạn lòng cái này vào sự kiện textbox change
Mã:
If Not IsNumeric(tb1.Value) Then
        lb.Caption = "khong phai so"
 

minhkhoi9492

Thành viên mới
Tham gia ngày
6 Tháng bảy 2015
Bài viết
9
Được thích
0
Điểm
163
Tuổi
27
Bạn lòng cái này vào sự kiện textbox change
Mã:
If Not IsNumeric(tb1.Value) Then
        lb.Caption = "khong phai so"
Code này nó hiển thị ở chỗ label rồi bác .Ý em là mình đánh sai vào là có hộp thoại hiện lên báo sai chỗ nào luôn cho mình ấy ạ
 

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,258
Được thích
520
Điểm
860
Code này nó hiển thị ở chỗ label rồi bác .Ý em là mình đánh sai vào là có hộp thoại hiện lên báo sai chỗ nào luôn cho mình ấy ạ
Cháu tìm trong diễn đàn sự kiện key up...... Mà vận dụng nhé. Mắt bác kém tay bác run quá không kiếm giùm cháu được :(
 

minhkhoi9492

Thành viên mới
Tham gia ngày
6 Tháng bảy 2015
Bài viết
9
Được thích
0
Điểm
163
Tuổi
27
Mã:
Private Sub chia(ByVal tb1 As MSForms.TextBox, ByVal tb2 As MSForms.TextBox, ByVal lb As MSForms.Label)
    If Not IsNumeric(tb1.Value) Then
        lb.Caption = "Loi so chia"
        MsgBox ("Nhap lai so chia")
        tb1 = ""
    ElseIf Not IsNumeric(tb2.Value) Or tb2.Value = 0 Then
        lb.Caption = "Loi so bi chia"
    Else
        lb.Caption = tb1.Value / tb2.Value
    End If
End Sub
Sao code này em chạy mà bị lỗi nó hiện cái msgbox đến 2 lần liên tục vậy mấy bác ?
 

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,258
Được thích
520
Điểm
860
Tb1.value va tb2.value không phải là số thì nó hiện 2 msgbox là đúng rồi.
 

thuyyeu99

Trùm Nhiều Chuyện
Tham gia ngày
6 Tháng sáu 2008
Bài viết
1,258
Được thích
520
Điểm
860
If tb1 number or tb2 num ber then thông báo. Nếu ban nhét kiểm tra vào sự kiện cua tb thì không cần để cai thông báo vào code Chia. Cái này tùy theo sở thích hay ý đồ của ban
hihih làm chơi thôi chứ ban tìm kiếm trong diễn đàn đi.... Mình khong co ngồi trên máy tính ;)
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
2,507
Được thích
3,793
Điểm
560
Mã:
Private Sub chia(ByVal tb1 As MSForms.TextBox, ByVal tb2 As MSForms.TextBox, ByVal lb As MSForms.Label)
    If Not IsNumeric(tb1.Value) Then
        lb.Caption = "Loi so chia"
        MsgBox ("Nhap lai so chia")
        tb1 = ""
    ElseIf Not IsNumeric(tb2.Value) Or tb2.Value = 0 Then
        lb.Caption = "Loi so bi chia"
    Else
        lb.Caption = tb1.Value / tb2.Value
    End If
End Sub
Sao code này em chạy mà bị lỗi nó hiện cái msgbox đến 2 lần liên tục vậy mấy bác ?
Mục đích bạn gọi MsgBox để làm gì? Thứ nhất bạn đã có thông báo ở Label là "Lỗi số chia", tức lỗi ở TextBox1. Thứ nữa là lỗi chỉ xuất hiện tại TextBox mà bạn đang nhập liệu, tức tại TextBox1. Vậy thì thêm cái thông báo "Nhap lai so chia" để làm gì? Có lỗi thì phải nhập lại, sao phải khuyên nhủ làm gì. Nếu ai cứng đầu không nhập lại thì đó là chuyện của người ta. Người ta không nhập lại có nghĩa là người ta cố tình, bắt tù người ta sao?

MsgBox xuất hiện 2 lần vì khi gặp lỗi thi code thực hiện:
- hiện MsgBox - lần xuất hiện đầu tiên.
- xóa nội dung tb1 = TextBox1
- việc thực hiện bước 2 làm thay đổi nội dung của tb1 = TextBox1 nên sảy ra sự kiện TextBox1_Change. Vì thế code
Mã:
chia TextBox1, TextBox2, Label4
lại được thực hiện. Ở lần gọi sub chia này thì tb1.Value = "", tức Not IsNumeric(tb1.Value) trả về TRUE, do vậy MsgBox lại được gọi lần nữa. Lần này thì tb1 = "" không làm thay đổi nội dung của tb1 vì vốn dĩ khi vào sub chia thì nó đã là "" rồi, vậy sự kiện TextBox1_Change không sảy ra tiếp nữa.

Theo tôi bạn chỉ cần xóa MsgBox. Thông báo đã có tại Label, TextBox đã được xóa nội dung, và trỏ văn bản đang nhấp nháy tại TextBox1 - TextBox đang sẵn sàng chờ nhập liệu, có thể nhập liệu ngay mà không cần phải mất thời gian công sức đóng bất cứ MsgBox nào. Cần gì nữa?

Mã:
Private Sub chia(ByVal tb1 As MSForms.TextBox, ByVal tb2 As MSForms.TextBox, ByVal lb As MSForms.Label)
    If Not IsNumeric(tb1.Value) Then
        lb.Caption = "Loi so chia"
        tb1.Value = Empty
    ElseIf Not IsNumeric(tb2.Value) Or tb2.Value = 0 Then
        lb.Caption = "Loi so bi chia"
        tb2.Value = Empty
    Else
        lb.Caption = tb1.Value / tb2.Value
    End If
End Sub
 
Top Bottom