Chọn các Sheet chỉ định để thực hiện Code

  • Thread starter Thread starter lenolim
  • Ngày gửi Ngày gửi
Liên hệ QC

lenolim

Thành viên hoạt động
Tham gia
8/9/15
Bài viết
179
Được thích
19
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)
 

File đính kèm

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)
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
 
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)
Mã:
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
Không biết phải ý bạn thế này không
 
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
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:

Mã:
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
Không biết phải ý bạn thế này không
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!
 
Lần chỉnh sửa cuối:
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
 

File đính kèm

  • CV11.jpg
    CV11.jpg
    64.6 KB · Đọc: 3
Lần chỉnh sửa cuối:
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
 
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!
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
 
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
Cảm ơn rất nhiều.
Trân trọng!
Bài đã được tự động gộp:

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.
Trân trọng!
Bài đã được tự động gộ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 sự giúp đỡ.
Trân trọng!
Bài đã được tự động gộp:

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 và Trân trọng!
 
Túm lược các cách tra tên sheet trong một nhóm tên:

1. Hàm InStr
Tốt nhất nếu muốn thêm điều kiện phân biệt chữ hoa/thường.
Tuy nhiên, thực tế nó hơi rắc rối hơn hai bài #2 và #5 một chút. InStr đúng thì phải kèm theo dấu ngăn (delimiter)

2. If (so sánh thẳng chuỗi với từng chuỗi) - như bài #3
Cách dễ nhất và trâu bò nhất.
Có thể dùng Like để dò wildcard
Nếu muốn phân biệt hoa/thường thì phải dùng hàm so sánh.

3. 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.

4. Dùng Not IsError(Application.Match(tên, [ { "tên1", "tên2", "tên3",... } ], 0))
Có thể dò theo wildcard
Tương đối dễ thêm thắt (vài trị)
Nếu muốn phân biệt hoa/thường thì khá cực.
Chú: lệnh/biểu thức [ { } ] có giới hạn là chỉ dùng được cho hằng số. Muốn dùng biến thì phải dùng hàm Array.
 
3. 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.
Chỉ cần UCase
Select Case UCase(ActiveSheet.Name)
Case "GO", "RUN", "AWAY"

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.
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ụ
Case 5 to 8, 11, 17
Case "a" to "z", "X", "W"
 
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ụ
Case 5 to 8, 11, 17
Case "a" to "z", "X", "W"
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? (gạt bỏ vấn đề tốc độ)
Trả lời: điều kiện của Case dừng xét khi đạt chỗ thoả. Điều kiện của If phải xét đủ 3, dù chỉ 1 thoả là đủ.
Nói cách khác:
Có 3 hàm, nếu hàm fa trả về 1, fb trả về 2, fc trả về 3 thì
Select Case 2
Case fa, fb, fc
... ---> hàm fa được gọi, không thoả; fb được gọi kế tiếp, thoả; code sẽ không gọi fc.
If 2 = fa Or 2 = fb Or 2 = fc Then
... ---> cả ba hàm fa, fb, fc sẽ được gọi tuần tự.

Đ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 để ý.
 
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
Điểm 1: Tôi mới thấy lần đầu :D, 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ử
Điểm 2: Tôi có biết về câu hỏi đỏ. Cách dùng xanh cũng mới thấy lần đầu, nhìn có vẻ so sánh ngược trong khi tôi thường dùng so sánh xuôi.
...
Đ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 để ý.
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.
Bài đã được tự động gộp:

À, 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"
 
Lần chỉnh sửa cuối:
...
À, 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"
Ở bài #12 tôi đã gợi ý cho cái mẹo nho nhỏ: dùng hàm con.
Nếu bạn viết một mớ hàm con đại khái như sau
function fa()
msgbox "FA"
fa = 1 ' hoặc bằng cái gì đó để dễ test
end function
function fb()
msgbox "FB"
fb = 2
end function
Nhét chúng vào những vị trí a, b trong code Case trên thì sẽ biết chúng được gọi theo thứ tự ra sao.

Chú: bình thường thì các hàm tôi viết đều thuộc loại "reentrant" (tức là chùng chỉ làm việc riêng, gọi bao nhiêu lần cũng được mà không ảnh hưởng đến code chính)
Nếu hàm sử dụng biến toàn cục, và/hoặc sử dụng byref thì việc chúng được gọi như thế nào rất quan trọng.
ví dụ hàm fa thay đổi một giá trị nào đó mà hàm fb sẽ xét thì thứ tự gọi fa và fb rất quan trọng.
 
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
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.
 
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.
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.
 
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.
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.
 
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.
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
 
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
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?
 
Web KT

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

Back
Top Bottom