Giúp đỡ em code VBA

Liên hệ QC

minhkhoi9492

Thành viên mới
Tham gia
6/7/15
Bài viết
9
Được thích
0
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

  • MayTinh.xlsm
    16.4 KB · Đọc: 9
PHP:
Private Sub TextBox2_Change()

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

File đính kèm

  • CoVua01.JPG
    CoVua01.JPG
    37.5 KB · Đọc: 2
Lần chỉnh sửa cuối:
Thanks 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 ?
 
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
 
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
 
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
 
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
Thanks 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 ?
 
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 ạ
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 :(
 
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 ?
 
Tb1.value va tb2.value không phải là số thì nó hiện 2 msgbox là đúng rồi.
 
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 ;)
 
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
 
Web KT
Back
Top Bottom