Nhờ hướng dẫn (gợi ý) giải quyết vấn đề bằng VBA

Liên hệ QC
Đã dùng form thì xử lý trên form trước khi OK, ai lại làm ngược, OK xong mới xử lý rec.
Vậy thì bắt lỗi ngay sự kiện AfterUpdate của các controls, nhập không phải ngày, không phải số, chi chạy code nhập liệu bắt lỗi ô trống. Nhưng nhiều khi người ta không cần nhập đủ thông tin anh à... Thôi thì tùy người sử dụng vậy.
 
Sorry Tùng, hôm nay mới đọc được topic này.

Gởi các bác đang giúp Tùng, he he, biết là nói nhiều mất vui nhưng các bác tập trung giúp em tùng hiểu được cách làm trước đừng nóng vội nhảy sang ADO, có quá nhiều thông tin cần phải tìm hiểu. Đặc biệt là ADO cũng có quá nhiều chuyện hiểu.

Em thấy đây là các vấn đề rất hay vì nó toàn chuyện của bất kỳ người mới bắt đầu học VBA nào cũng gặp phải.

- Vấn đề về ngày và DTPicker: Tùng không nên quá cầu toàn về chuyện này em nắm bắt được bao nhiêu thì nắm.
- Vấn đề combobox: hãy suy nghĩ về việc làm sao đưa giá trị vào nó và lấy giá trị ra chắc là hiểu rồi phải không
- Ô số và định dạng số: cái này cũng có nhiều vấn đề chứ không chỉ là chuyện là định dạng đâu.

Hãy đọc code của bác Sealand trước đi nhé. Không quá dài, giải quyết được vấn đề. Hiểu đi rồi hỏi thêm.

OverAC
 
E chưa biết dùng DTPicker nên lấy tạm của a SeaLand gán vào file thử. A HD thêm giúp e làm sao khi chọn ngày xong thì con trỏ nhảy đến CB01. Cám ơn Anh.

Vì người dùng có thói quen sau khi nhập xong thường nhấn Enter, nhưng DTPicker không hỗ trợ. Vậy là ta bắt luôn phím đó ở sự kiện Keydown như sau:

Mã:
Private Sub DTPicker_KeyDown(KeyCode As Integer, ByVal Shift As Integer)
If KeyCode = 13 Then
KeyCode = 0
SendKeys ("{TAB}")
End If
End Sub
 
@ Sealand

Chạy file của Anh nó báo lỗi

PHP:
Private Sub TextBox4_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Me.TextBox4 = Format(Me.TextBox4, "#,##0")
End Sub

Cho hỏi nguyên nhân ở đâu ah.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Lỗi nó báo sao vậy Tùng?

Thử cái này xem sao?
PHP:
Private Sub TextBox4_Change()
Me.TextBox4 = Format(Me.TextBox4, "#,##0")
End Sub
 
Lần chỉnh sửa cuối:
Anh Bình ơi, code của anh đặt ở sự kiện change là không ổn rồi vì mỗi thay đổi hàm Format đều chuyển giá trị Textbox thành chuỗi. Khi ta thêm số và nó format là lỗi ngay anh ạ.


P/s:Xin lỗi, mình nhầm trường hợp có định dạng số thập phân.

Chạy file của Anh nó báo lỗi

Đáng lẽ bạn phải báo lỗi ra sao mới biết đường tìm chớ.
 
Lần chỉnh sửa cuối:
Anh Bình ơi, code của anh đặt ở sự kiện change là không ổn rồi vì mỗi thay đổi hàm Format đều chuyển giá trị Textbox thành chuỗi. Khi ta thêm số và nó format là lỗi ngay anh ạ.
Em chạy không lỗi anh ơi. không biết có phải do chạy bằng Excel2010?

Mà nếu có lỗi như anh nói, thì: Me.TextBox4 = Format(Cdbl(Me.TextBox4), "#,##0")
 
Minh viết không chuẩn, không phải lỗi về code mà lỗi về nhập dữ liệu. Khi nhập con trỏ luôn ở phần thập phân rất khó nhập phần nguyên anh Bình à.
Thực sự mình cũng chưa tìm ra cách để tạo ô nhập số mãn ý. Đây là 1 nhu cầu của dân Kế toán tránh sai sót khi nhập dữ liệu. Thôi thì từng vấn đề trên form theo yêu cầu của Tùng ta nên lần lượt tranh luận giải quyết tốt để vừa giúp Tùng vừa học tập luôn.Mong mọi người cởi mở tham gia.
Vậy yêu cầu của việc tạo ô nhận số như sau:
-Chỉ nhận các số từ 0-9,-(âm). Nếu nhập không hợp lệ phát tiếng Beep.
-Định dạng: có phân nhóm hàng ngàn và có 2 số thập phân.
-Khi nhập dữ liệu không phải dùng chuột hay phím di chuyển.
 
Minh viết không chuẩn, không phải lỗi về code mà lỗi về nhập dữ liệu. Khi nhập con trỏ luôn ở phần thập phân rất khó nhập phần nguyên anh Bình à.

Em xin "cố chấp" mà sửa code vậy :)

Mã:
Private Sub TextBox4_change()
Dim DecSpe, ThoSpe
DecSpe = Application.DecimalSeparator
ThoSpe = Application.ThousandsSeparator

If InStr(1, Me.TextBox4, DecSpe) Then
    Me.TextBox4 = Format(Me.TextBox4, "#" & ThoSpe & "###" & DecSpe & "########")
Else
    Me.TextBox4 = Format(Me.TextBox4, "#" & ThoSpe & "##0")
End If

End Sub
 
Minh viết không chuẩn, không phải lỗi về code mà lỗi về nhập dữ liệu. Khi nhập con trỏ luôn ở phần thập phân rất khó nhập phần nguyên anh Bình à.
Thực sự mình cũng chưa tìm ra cách để tạo ô nhập số mãn ý. Đây là 1 nhu cầu của dân Kế toán tránh sai sót khi nhập dữ liệu. Thôi thì từng vấn đề trên form theo yêu cầu của Tùng ta nên lần lượt tranh luận giải quyết tốt để vừa giúp Tùng vừa học tập luôn.Mong mọi người cởi mở tham gia.
Vậy yêu cầu của việc tạo ô nhận số như sau:
-Chỉ nhận các số từ 0-9,-(âm). Nếu nhập không hợp lệ phát tiếng Beep.
-Định dạng: có phân nhóm hàng ngàn và có 2 số thập phân.
-Khi nhập dữ liệu không phải dùng chuột hay phím di chuyển.

Theo yêu cầu, Em tạo 1 sub kiểm số như sau (Cho nhập số và dấu -):
Mã:
 Sub KiemSo()
If TypeName(Me.ActiveControl) = "TextBox" Then
    With Me.ActiveControl
        If Not IsNumeric(.Value) And .Value <> vbNullString And .Value <> "-" Then
            Beep
            MsgBox "Xin loi, ban phai nhap so"
            .Value = vbNullString
        End If
    End With
End If
End Sub
Trong TextBox khi nhập liệu mình kiểm số như sau:
Mã:
Private Sub TextBox4_Change()
KiemSo
End Sub
Định dạng lại số sau khi nhập liệu vào TextBox
Mã:
Private Sub TextBox4_AfterUpdate()
TextBox4.Value = Format(TextBox4.Value, "#,##0.00")
End Sub


File đính kèm
 

File đính kèm

@ Sealand

Chạy file của Anh nó báo lỗi

PHP:
Private Sub TextBox4_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Me.TextBox4 = Format(Me.TextBox4, "#,##0")
End Sub

Cho hỏi nguyên nhân ở đâu ah.
Vấn đề là Tùng đã nhập cái gì vào TB4 đó. và báo lỗi thế nào.
Còn chỉ cho phép nhập số vào thì dùng
PHP:
Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
  Case Asc("0") To Asc("9"), Asc("-")
  Case Asc(".")
    If InStr(1, Me.TextBox4.Text, ".") > 0 Then
      KeyAscii = 0
    End If
  Case Else
    KeyAscii = 0
End Select

End Sub
Cái này copy của Bác Duyệt từ lâu lắm rồi. Còn caulacbovb thì nhiều lắm
PHP:
Private Sub TextBox4_KeyPress(KeyAscii  As Integer)
 If InStr("1234567890" + Chr$(vbKeyBack), Chr$(KeyAscii)) = 0 Then
  KeyAscii = 0
  Beep
 End If
End Sub
hay
PHP:
If IsNumeric(Chr(KeyAscii)) <> True Then KeyAscii = 0
 
Không biết chủ topic đã "tiếp chiêu" đến đâu rồi mà lặng mất vậy ta?
- Đưa dữ liệu vào Combo.
- Định dạng ngày, số
- Nhập liệu vào sheet.
- Xóa trống các Controls sau khi nhập.
 
Lần chỉnh sửa cuối:
/_ắm cha con khó lấy chồng đó mà!

HaiDuong0.jpg
HaiDuong0.jpg
HaiDuong0.jpg
HaiDuong0.jpg
HaiDuong0.jpg
 
Không biết chủ topic đã "tiếp chiêu" đến đâu rồi mà lặng mất vậy ta?
- Đưa dữ liệu vào Combo.
- Định dạng ngày, số
- Nhập liệu vào sheet.
- Xóa trống các Controls sau khi nhập.

Báo cáo các Thầy, tối nay em sẽ cho ra mắt sản phẩm đầu tay, (phải coi ngày nữa chứ).
 
Để xem chú Tùng "mần ăn" làm sao với "đứa con đầu lòng" đây!

Hai Lúa Miền Tây đã viết:
Không biết chủ topic đã "tiếp chiêu" đến đâu rồi mà lặng mất vậy ta?
- Đưa dữ liệu vào Combo.
- Định dạng ngày, số
- Nhập liệu vào sheet.
- Xóa trống các Controls sau khi nhập.

Hôm nay có độ nhậu nhưng không quên nhiệm vụ là phải học VBA (cho dù biết mới chút chút).

Mong rằng các Anh Chị chỉ bảo dạy thêm, có lẽ đây là bài đầu tiên trong đời tính tới thời điểm này em post bài có chút "mùi" VBA.
 

File đính kèm

Hay nhất cái này. he he.
Mã:
Sub TenConTrol()
Dim ctr As Control
For Each ctr In NHAPLIEU.Controls
   If TypeOf ctr Is MSForms.TextBox Or TypeOf ctr Is MSForms.ComboBox Then
  ctr.Value = ""
   End If
Next
End Sub
 
Hôm nay có độ nhậu nhưng không quên nhiệm vụ là phải học VBA (cho dù biết mới chút chút).

Mong rằng các Anh Chị chỉ bảo dạy thêm, có lẽ đây là bài đầu tiên trong đời tính tới thời điểm này em post bài có chút "mùi" VBA.
Lần đầu "làm chuyện ấy" như thế là ngon rồi
Ẹc... Ẹc...
Lưu ý chổ này:
Mã:
.Range("E" & LastRowData) = TextBox4
Kết quả số tiền ra toàn là Text, hổng phải Number
Và:
Mã:
TextBox4 = Format(TextBox4, "#,##0")
Hổng phải máy nào cũng dùng dấu phẩy làm dấu phân cách ngàn đâu nha!
Cố gắng lần sau "làm chuyện ấy" có kinh nghiệm hơn ha!
 
Hay nhất cái này. he he.
Mã:
Sub TenConTrol()
Dim ctr As Control
For Each ctr In NHAPLIEU.Controls
   If TypeOf ctr Is MSForms.TextBox Or TypeOf ctr Is MSForms.ComboBox Then
  ctr.Value = ""
   End If
Next
End Sub
Tôi thử dùng for each trên để gán dữ liệu vào 1Arr trước khi gán ="".
Không biết thuật toán trên liệu có dư lắm.
PHP:
Option Explicit
Dim i&, iPos&, LastRow&
Dim sTxt$
Dim Dic As Object
Dim ArrTmp, Arr(1 To 5)

Private Sub ComboNCC_Enter()
SendKeys ("%{DOWN}")
End Sub

Private Sub TextBox1_AfterUpdate()
TextBox1 = Format(TextBox1, "dd/mm/yyyy")
End Sub
Private Sub UserForm_Initialize()
ArrTmp = Array("TextBox1", "ComboNCC", "TextBox3", "TextBox5", "TextBox4")
Set Dic = CreateObject("Scripting.Dictionary")
For i = LBound(ArrTmp) To UBound(ArrTmp)
  Dic.Add ArrTmp(i), i + 1
Next i
LastRow = Sheet2.Range("A65000").End(xlUp).Row
ComboNCC.RowSource = "'" & Sheet2.Name & "'!A2:b" & LastRow
End Sub
Private Sub ComboNCC_afterUpdate()
TextBox3 = ComboNCC.Column(1)
End Sub
Private Sub TextBox4_Change()
TextBox4 = Format(TextBox4, "#,##0")
End Sub
Private Sub CommandButton1_Click()
LastRow = Sheet3.Range("a50000").End(xlUp).Row + 1
LayConTrol
With Sheets("Data")
  .Cells(LastRow, 1).Resize(, 5) = Arr
End With
Erase Arr
End Sub
Sub LayConTrol()
i = 0
Dim Ctr As Control
For Each Ctr In NHAPLIEU.Controls
  If TypeOf Ctr Is MSForms.TextBox Or TypeOf Ctr Is MSForms.ComboBox Then
    i = i + 1
    sTxt = Ctr.Name
    iPos = Dic.Item(sTxt)
    Arr(iPos) = Ctr.Value
    Ctr.Value = ""
  End If
Next
Arr(5) = Arr(5) * 1
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
NDU hướng dẫn giúp.
 

File đính kèm

Web KT

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

Back
Top Bottom