Topic Những câu hỏi về code, xin giải thích các code... đã quá dài nên mình đóng nó lại và mở topic khác
Tất cả những bài viết liên quan đến việc nhờ giải thích, xử lý và gỡ rối code VBA, các bạn vui lòng đăng tại đây!
Cảm ơn
em co code ben dưới hiện tại sử dụng tìm kiếm được 2 file giờ e muốn thêm 1 file nữa ví dụ tên file đó là "3.xls" thầy thêm code giùm với
Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode.Value = 13 Then
With Sheet1
If Len(TextBox1.Text) = 0 Then
.Range("A2:K20").ClearContents
Exit Sub
End If
1 Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
cn.Open ("Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 8.0")
.Range("A2:K20").ClearContents
2 .Range("A2").CopyFromRecordset cn.Execute("select * from [EXCEL 8.0;Database=" & ThisWorkbook.Path & "\1.xls].[A1:K] where [SO]=" & Sheet1.TextBox1.Text & " Union all select * from [EXCEL 8.0;Database=" & ThisWorkbook.Path & "\2.xls].[A1:K] where [SO]=" & Sheet1.TextBox1.Text)
End With
End If
End Sub
Bạn xem thử!
Column headings: By default, it is assumed that the first row of your Excel data source contains columns headings that can be used as field names. If this is not the case, you must turn this setting off, or your first row of data "disappears" to be used as field names. This is done by adding the optional HDR= setting to the Extended Properties of the connection string. The default, which does not need to be specified, is HDR=Yes. If you do not have column headings, you need to specify HDR=No; the provider names your fields F1, F2, etc. Because the Extended Properties string now contains multiple values, it must be enclosed in double quotes itself, plus an additional pair of double quotes to tell Visual Basic to treat the first set of quotes as literal values, as in the following example (where extra spaces have been added for visual clarity).
E có 1 form, và các TextBox trong đó, dùng 1 button để kiểm tra xem TextBox nào để trống thì báo. Nhưng chẳng nhẽ bao nhiu TextBox là bấy nhiêu Code. Xin nhờ các A/c giúp cho code gọn hơn ạ. E xin cảm ơn !
Mã:
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
TextBox1.BackStyle = 1
TextBox1.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
If TextBox2 = "" Then
TextBox2.BackStyle = 1
TextBox2.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
If TextBox3 = "" Then
TextBox3.BackStyle = 1
TextBox3.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
End Sub
E có 1 form, và các TextBox trong đó, dùng 1 button để kiểm tra xem TextBox nào để trống thì báo. Nhưng chẳng nhẽ bao nhiu TextBox là bấy nhiêu Code. Xin nhờ các A/c giúp cho code gọn hơn ạ. E xin cảm ơn !
Mã:
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
TextBox1.BackStyle = 1
TextBox1.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
If TextBox2 = "" Then
TextBox2.BackStyle = 1
TextBox2.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
If TextBox3 = "" Then
TextBox3.BackStyle = 1
TextBox3.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
End If
End Sub
Private Sub CommandButton1_Click()
Dim Tb
For Each Tb In UserForm1.Controls
If UCase(TypeName(Tb)) = "TEXTBOX" Then
If Tb = "" Then
Tb.BackStyle = 1
Tb.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
End If
End If
Next Tb
End Sub
Private Sub CommandButton1_Click()
Dim Tb
For Each Tb In UserForm1.Controls
If UCase(TypeName(Tb)) = "TEXTBOX" Then
If Tb = "" Then
Tb.BackStyle = 1
Tb.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
End If
End If
Next Tb
End Sub
Nếu form của bạn nhiều textbox, có cái yêu cầu không để trống, cái có thể để trống thì bạn có thể dùng đoạn code dưới.
Chịu khó test từng textbox không được để trống thôi.
Mã:
Private Sub CheckTextBoxEmpty(txt As MSForms.TextBox)
If Len(Trim$(txt.Text)) = 0 Then
txt.BackStyle = 1
txt.BackColor = RGB(255, 128, 128)
txt.SetFocus
Err.Raise vbObjectError + 1, "", "KHONG DUOC DE TRONG " & txt.Name
End If
End Sub
Private Sub CommandButton1_Click()
On Error GoTo ErrHandler
CheckTextBoxEmpty TextBox1
CheckTextBoxEmpty TextBox2
CheckTextBoxEmpty TextBox3
MsgBox "All textboxes OK :)"
' Your code here
Exit Sub
ErrHandler:
MsgBox Err.Description, vbCritical Or vbOKOnly, "Error"
End Sub
Đoạn code của bạn PacificPR sẽ bị lỗi là nếu có bao nhiêu textbox rỗng thì Excel sẽ quăng MsgBox bao nhiêu lần.
MsgBox này tôi đã cố tránh trong code của tôi. Lúc đầu dùng function return Boolean thì do Excel VBA không có tính năng kiểm tra tắt điều kiện logic nên bị MsgBox nhiều lần. Vì vậy tôi mới dùng cách raise Err.
Mạo muội code lại code của bạn PacificPR như sau, dùng cách duyệt qua các TextBox, TextBox nào có Tag property khác rỗng thì check nó có empty hay không. Cách dùng Tag property này chúng tôi hay dùng hồi xưa.
Mã:
Private Function CheckTextBoxEmptyByTag(frm As MSForms.UserForm) As Boolean
Dim ctl As Control
CheckTextBoxEmptyByTag = False
For Each ctl In frm.Controls
If TypeName(ctl) Like "TextBox" And Len(ctl.Tag) <> 0 Then
If Len(Trim$(ctl.Text)) = 0 Then
ctl.BackStyle = 1
ctl.BackColor = RGB(255, 128, 128)
ctl.SetFocus
MsgBox "KHONG DUOC DE TRONG TEXTBOX " & ctl.Tag, vbCritical Or vbOKOnly, "Error"
CheckTextBoxEmptyByTag = True
Exit Function
End If
End If
Next
End Function
Private Sub CommandButton1_Click()
If CheckTextBoxEmptyByTag(UserForm1) = True Then Exit Sub
MsgBox "All textboxes OK :)"
End Sub
Vãi, bao nhiêu năm rồi mới ngồi gõ lại code, mà là code Vê Bê mới ngán chứ, báo lỗi tùm lum
Có gì bỏ qua, đừng cười em nhé
Không đơn giản là câu hỏi "nó đâu mất tiu" đâu bạn ạ. Đấy là bài học kinh nghiệm cho bạn đấy. Bài ở trên có người đã nói cho bạn biết rồi. Hi vọng bạn hiểu.
Private Sub CommandButton1_Click()
Dim Tb
For Each Tb In UserForm1.Controls
If UCase(TypeName(Tb)) = "TEXTBOX" Then
If Tb = "" Then
Tb.BackStyle = 1
Tb.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
End If
End If
Next Tb
End Sub
Nếu form của bạn nhiều textbox, có cái yêu cầu không để trống, cái có thể để trống thì bạn có thể dùng đoạn code dưới.
Chịu khó test từng textbox không được để trống thôi.
Mã:
Private Sub CheckTextBoxEmpty(txt As MSForms.TextBox)
If Len(Trim$(txt.Text)) = 0 Then
txt.BackStyle = 1
txt.BackColor = RGB(255, 128, 128)
txt.SetFocus
Err.Raise vbObjectError + 1, "", "KHONG DUOC DE TRONG " & txt.Name
End If
End Sub
Private Sub CommandButton1_Click()
On Error GoTo ErrHandler
CheckTextBoxEmpty TextBox1
CheckTextBoxEmpty TextBox2
CheckTextBoxEmpty TextBox3
MsgBox "All textboxes OK :)"
' Your code here
Exit Sub
ErrHandler:
MsgBox Err.Description, vbCritical Or vbOKOnly, "Error"
End Sub
Đoạn code của bạn PacificPR sẽ bị lỗi là nếu có bao nhiêu textbox rỗng thì Excel sẽ quăng MsgBox bao nhiêu lần.
MsgBox này tôi đã cố tránh trong code của tôi. Lúc đầu dùng function return Boolean thì do Excel VBA không có tính năng kiểm tra tắt điều kiện logic nên bị MsgBox nhiều lần. Vì vậy tôi mới dùng cách raise Err.
Mạo muội code lại code của bạn PacificPR như sau, dùng cách duyệt qua các TextBox, TextBox nào có Tag property khác rỗng thì check nó có empty hay không. Cách dùng Tag property này chúng tôi hay dùng hồi xưa.
Mã:
Private Function CheckTextBoxEmptyByTag(frm As MSForms.UserForm) As Boolean
Dim ctl As Control
CheckTextBoxEmptyByTag = False
For Each ctl In frm.Controls
If TypeName(ctl) Like "TextBox" And Len(ctl.Tag) <> 0 Then
If Len(Trim$(ctl.Text)) = 0 Then
ctl.BackStyle = 1
ctl.BackColor = RGB(255, 128, 128)
ctl.SetFocus
MsgBox "KHONG DUOC DE TRONG TEXTBOX " & ctl.Tag, vbCritical Or vbOKOnly, "Error"
CheckTextBoxEmptyByTag = True
Exit Function
End If
End If
Next
End Function
Private Sub CommandButton1_Click()
If CheckTextBoxEmptyByTag(UserForm1) = True Then Exit Sub
MsgBox "All textboxes OK :)"
End Sub
Vãi, bao nhiêu năm rồi mới ngồi gõ lại code, mà là code Vê Bê mới ngán chứ, báo lỗi tùm lum
Có gì bỏ qua, đừng cười em nhé
Không đơn giản là câu hỏi "nó đâu mất tiu" đâu bạn ạ. Đấy là bài học kinh nghiệm cho bạn đấy. Bài ở trên có người đã nói cho bạn biết rồi. Hi vọng bạn hiểu.
Em chào anh chị, em có một vấn đề cần anh, chị giúp đỡ ạ. Hiện tại em có danh sách khoảng 15 xưởng, hàng ngày em đều phải cập nhập kế hoạch xuống cho các xưởng, mỗi lần cập nhật mất khá nhiều thời gian. Phương pháp hiện tại em đang dùng là chọn lần lượt tên các xưởng trong listbox và đẩy dữ liệu đi. Em muốn hỏi anh chị là có cách nào chỉ cần chạy marco 1 lần dữ liệu tự động đẩy lần lượt đến các xưởng mà không phải chọn lần lượt trong listbox không ạ. Mong anh chị gợi ý phương pháp làm cho em ạ. Em cảm ơn.
Private Sub CommandButton1_Click()
Dim Tb
For Each Tb In UserForm1.Controls
If UCase(TypeName(Tb)) = "TEXTBOX" Then
If Tb = "" Then
Tb.BackStyle = 1
Tb.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
End If
End If
Next Tb
End Sub
E có 1 form, và các TextBox trong đó, dùng 1 button để kiểm tra xem TextBox nào để trống thì báo. Nhưng chẳng nhẽ bao nhiu TextBox là bấy nhiêu Code. Xin nhờ các A/c giúp cho code gọn hơn ạ. E xin cảm ơn !
Mã:
Private Sub CommandButton1_Click()
If TextBox1 = "" Then
TextBox1.BackStyle = 1
TextBox1.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
If TextBox2 = "" Then
TextBox2.BackStyle = 1
TextBox2.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
If TextBox3 = "" Then
TextBox3.BackStyle = 1
TextBox3.BackColor = RGB(255, 128, 128)
MsgBox "KHONG DUOC DE TRONG"
Exit Sub
End If
End Sub
Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?
Em đoán nhà họ đặt cái màu đỏ choét đó để kiểm soát. Nhưng có bài #1367 thì không cần cái đó nữa. Chị #1368 chả mắng cho còn rồi( Mà cái Bà đó khó tính mà vẫn đẹp gái thế mới sợ chứ ... )
Giả sử có 2 textbox, và chúng đều rỗng, khi click phát textbox1 đỏ choét, sau đó người dùng nhập liệu textbox1. Click phát nữa thì cả hai textbox cùng đỏ choet ( do textbox2 lúc này vẫn rỗng). Có nên chăng ta phải khôi phục màu của các textbox trước khi tô màu cho cái textbox rỗng đầu tiền?