Thử.Nhờ mọi người giúp đỡ.
Trong file đính kèm. Nhờ mọi người viết lại Code ngắn và hiệu quả hơn.
(Trong file Code đang làm theo kiểu ghi Macro nên hơi dài)
Sub hensui()
Const T As String = "#01#02#05#08#"
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
If InStr(T, sh.Name) > 0 Then
sh.Activate
Call DaChon
Else
sh.Activate
Call KhongChon
End If
Next
End Sub
Nhờ mọi người giúp đỡ.
Trong file đính kèm. Nhờ mọi người viết lại Code ngắn và hiệu quả hơn.
(Trong file Code đang làm theo kiểu ghi Macro nên hơi dài)
Sub ABC()
Dim ws As Worksheet
Set ws = ActiveSheet
If ws.Name = "01" Or ws.Name = "02" Or ws.Name = "05" Or ws.Name = "08 " Then
MsgBox "Da Chon dung Sheet"
Else
MsgBox "Khong thuc hien tren Sheet nay"
End If
End Sub
Bác nhanh quá. Cảm ơn bác trước.Thử.
Mã:Sub hensui() Const T As String = "#01#02#05#08#" Dim sh As Worksheet For Each sh In ThisWorkbook.Worksheets If InStr(T, sh.Name) > 0 Then sh.Activate Call DaChon Else sh.Activate Call KhongChon End If Next End Sub
Cảm ơn Bác nhé. Kiểm tra qua thấy đang ổn. Để em áp dụng vào cái file thực tế xem.Không biết phải ý bạn thế này khôngMã:Sub ABC() Dim ws As Worksheet Set ws = ActiveSheet If ws.Name = "01" Or ws.Name = "02" Or ws.Name = "05" Or ws.Name = "08 " Then MsgBox "Da Chon dung Sheet" Else MsgBox "Khong thuc hien tren Sheet nay" End If End Sub
Hoặc thử thế này:Bác nhanh quá. Cảm ơn bác trước.
Nhưng, nhờ Bác xem lại:
1. Code chỉ cần thực hiện ở 1 Sheet bất kỳ thôi. (Code của Bác nó lại duyệt qua hết các Sheet đã chọn)
(Thích Sheet nào thì tạo Button ở Sheet đó)
2. Cái này em sai từ trước, nhờ Bác xem lại. Tên Sheet bằng chữ thôi ko phải bằng số.
Bài đã được tự động gộp:
Cảm ơn Bác nhé. Kiểm tra qua thấy đang ổn. Để em áp dụng vào cái file thực tế xem.
Trân trọng!
Sub NT()
Dim Ws As Worksheet, Txt As String
For Each Ws In Sheets(Array("01", "02", "05", "08"))
Txt = Txt & vbCrLf & Ws.Name
Next
MsgBox "Sheet da duyet la: " & Txt
End Sub
Cảm ơn rất nhiều.Rỗi quá,nên vẻ:
PHP:Sub GPE() Dim wS As Worksheet Const ShName As String = "01,02,05,08,GPE.COM" Set wS = ActiveSheet If InStr(ShName, wS.Name) Then MsgBox "Da Chon Dúng Sheet" Else MsgBox "Không Thuc Hiên Trên Sheet Này" End If End Sub
Xin được cảm ơn.Hoặc thử:
PHP:Sub Kiemtra2() Select Case ActiveSheet.Name Case "01", "02", "05", "08" Call DaChon Case Else Call KhongChon End Select End Sub
Xin được cảm ơn sự giúp đỡ.Hoặc thử thế này:
Mã:Sub NT() Dim Ws As Worksheet, Txt As String For Each Ws In Sheets(Array("01", "02", "05", "08")) Txt = Txt & vbCrLf & Ws.Name Next MsgBox "Sheet da duyet la: " & Txt End Sub
Xin được cảm ơn và Trân trọng!Hoặc thử:
PHP:Sub Kiemtra2() Select Case ActiveSheet.Name Case "01", "02", "05", "08" Call DaChon Case Else Call KhongChon End Select End Sub
Thuần thục cách dùng Case rồi nhỉ ....Select Case ActiveSheet.Name
Case "01", "02", "05", "08"
...
Chỉ cần UCase3. Dùng Select Case - như bài #7
Cách dễ thêm thắt (vài trị) nhất, nếu chỉ thuần muốn dò chuỗi.
Nếu muốn phân biệt hoa/thường thì hơi cực hơn.
Sự khác nhau là Select Case dùng cho điều kiện chỉ là 1 biến, If Then có thể And Or vài ba biến. Nếu chỉ 1 biến thì đương nhiên Case ngon hơn, ví dụGPE có truyền thống ít dùng cái này. Thậm chí tôi nhớ có đọc ở đâu đấy trong GPE nói rằng Select Case không hiệu quả bằng If-Then-Else.
1. Nếu cần nhiều điều kiện khác nhau thì người ta có thể dùng Select Case TrueSự khác nhau là Select Case dùng cho điều kiện chỉ là 1 biến, If Then có thể And Or vài ba biến. Nếu chỉ 1 biến thì đương nhiên Case ngon hơn, ví dụ
Case 5 to 8, 11, 17
Case "a" to "z", "X", "W"
Điểm 1: Tôi mới thấy lần đầu , mà cũng chưa từng thấy áp dụng, trong công việc cũng chưa phải dùng, để tôi tìm chủ đề để áp dụng thử1. Nếu cần nhiều điều kiện khác nhau thì người ta có thể dùng Select Case True
...
2. Select Case x : Case 1, 2, 3 khác với If x=1 or x=2 or x=3 chỗ nào?
...
Select Case 2
Case fa, fb, fc
Mười mấy năm làm việc tôi chỉ mới viết nhiều thủ tục con chứ chưa viết nhiều hàm con con thật, vì ít có nhu cầu....
Điểm khác biệt tôi nêu ra ở điều 2 là rất quan trọng. Chỉ vì quý vị ở GPE này không quen viết hàm con cho nên không để ý.
Ở bài #12 tôi đã gợi ý cho cái mẹo nho nhỏ: dùng hàm con....
À, anh cho hỏi: Nếu Select Case True với 2, 3 điều kiện thì có phải quay về And or và sẽ phải xét hết từng điều kiện như mục 2 chữ đỏ?
Select Case True
Case (a < 0 Or a > 10) and b = "Yes"
Điều gì làm cho anh bạn vba này càng học càng khó hiểu thế bác Vẹt.Điểm khác biệt tôi nêu ra ở điều 2 là rất quan trọng.
Cho em hỏi ngu chút nhé Thật sự nào giờ chưa bao giờ dùng tới chổ màu đỏ và cũng không hiểu tại sao lại là true? ý nghĩa là gì? Áp dụng thực tế ra sao? Anh có thể giải thích để hiểu thêm với.1. Nếu cần nhiều điều kiện khác nhau thì người ta có thể dùng Select Case True
Select Case vốn không nằm trong số lệnh căn bản của Basic.Cho em hỏi ngu chút nhé Thật sự nào giờ chưa bao giờ dùng tới chổ màu đỏ và cũng không hiểu tại sao lại là true? ý nghĩa là gì? Áp dụng thực tế ra sao? Anh có thể giải thích để hiểu thêm với.
Cảm ơn anh, bài viết rất chi tiết. Hôm nay lại hiểu cái hay này nửa.Select Case vốn không nằm trong số lệnh căn bản của Basic.
Nó chỉ là một trong những lệnh thêm sau này để chạy đua theo Switch của các ngôn ngữ ra đầu thập niên 70's. Và do vậy nó hy sinh tốc độ để đổi lại sự uyển chuyển.
Điển hình, C buộc rằng biểu thức của switch phải tính ra được trị số nguyên, và các Case's phải là hằng số. Trình dịch C sẽ chuyển các cases thành dạng labls (để có thể goto). Lệnh switch trong C vì vậy có nhiều giới hạn nhưng xử lý rất nhanh, có lẽ không thua if-else.
Trái lại, select trong VB/VBA/VBS ra sau cho nên Microsoft đã cân nhắc và chọn lấy sự uyển chuyển. Biểu thức của Select nhận một giá trị variant và có thể so sánh với các cases một cách tuỳ tiện (lưu ý rằng trong VBS, mọi biến đều là variant). True là một trị căn bản, vì vậy có thể dùng làm biểu thức cho select.
Ví dụ:
If a = 1 And b = 2 Then
...
ElseIf a = 3 and b = 4 Then
...
End If
Có thể thay bằng:
Select Case True
Case a = 1 And b = 2 ' biểu thức này trả về Boolean, có thể so sánh được với trị true của select trên
...
Case a = 3 And b = 4
...
End Select
Nếu nói về sự rõ rệt lẫn tốc độ thì không bằng IF ở trên, nhưng đây là trường hợp ví dụ đơn giản. Thỉnh thoảng ta có thể gặp trường hợp mà Select trông rõ hơn. Hay như tôi có đề cập ở các bài trước, nếu ccá code gọin hàm thì có thể giảm được số lần gọi, và làm chủ được thứ tự gọi.
Chú: hằng số True được dùng rộng rãi đối với dân lập trình kinh nghiệm. Điển hình là vòng lặp vô tận, dùng để thay hế lẹnh Goto.
Do While True
...
If dkGiDo Then Exit Do
Loop
Tương đương với:
DWTru:
...
If Not dkGiDo Then Goto DWTru
Người đọc code quen sẽ thấy lợi điểm của vòng lặp vô tận là nó xác định rõ rệt cái khối lệnh trong vòng lặp. Cut/Paste đưa vào chỗ khác dễ dàng hơn.
Lúc viết bài #17, tôi suy nghĩ chưa ra trường hợp Select Case True tốt hơn If (già rồi, hơi lẫn, chờ một lúc mới nhớ).Cảm ơn anh, bài viết rất chi tiết. Hôm nay lại hiểu cái hay này nửa.
Dùng Select Case True, chổ Case có điều kiện hoặc nếu đã thỏa mãn điều kiện 1 rồi thì không cần xét điều kiện 2. trong khi If cũng 2 điều kiện nhưng khi điều kiện 1 thỏa mãn rồi nó vẫn xét tiếp điều kiện 2. Em hiểu như thế có đúng không vậy?Lúc viết bài #17, tôi suy nghĩ chưa ra trường hợp Select Case True tốt hơn If (già rồi, hơi lẫn, chờ một lúc mới nhớ).
Chạy thử lần lượt từng sub t và tt sau, bạn sẽ thấy là
"Case fa = 1 And fb = 2, fa = 3 And fb = 4" cũng xét ra kết quả giống như "If fa = 1 And fb = 2 Or fa = 3 And fb = 4". Nhưng trường hợp đầu gọi hàm fa và fb chỉ một lần, trường hợp sau gọi 2 lần.
Sub t()
Select Case True
Case fa = 1 And fb = 2, fa = 3 And fb = 4
MsgBox "SELECTED"
End Select
End Sub
Sub tt()
If fa = 1 And fb = 2 Or fa = 3 And fb = 4 Then
MsgBox "SELECTED"
End If
End Sub
Function fa()
MsgBox "fa"
fa = 1
End Function
Function fb()
MsgBox "fb"
fb = 2
End Function