Hỏi cách rút ngắn câu lệnh Select Case (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
6,070
Được thích
7,994
Nghề nghiệp
Làm đủ thứ
Mình có đoạn code cần giữ nguyên giá trị trong mảng Res() nếu j là 6,12,18... như bên dưới
Nếu không thì sẽ xóa giá trị các phần tử trong mảng. Nhìn tới nhìn lui thấy thừa thừa gì đó mà không biết làm sao rút ngắn lại. Các anh chị xem coi có thể dùng một dòng Case thôi được hay không.
Mã:
For j = 1 To UBound(Res, 2)
   Select Case j
      Case 6, 12, 18, 24, 30, 36, 42, 48, 54
      Case Else
      Res(1, j) = Empty
   End Select
Next
 
Mình có đoạn code cần giữ nguyên giá trị trong mảng Res() nếu j là 6,12,18... như bên dưới
Nếu không thì sẽ xóa giá trị các phần tử trong mảng. Nhìn tới nhìn lui thấy thừa thừa gì đó mà không biết làm sao rút ngắn lại. Các anh chị xem coi có thể dùng một dòng Case thôi được hay không.
Mã:
For j = 1 To UBound(Res, 2)
   Select Case j
      Case 6, 12, 18, 24, 30, 36, 42, 48, 54
      Case Else
      Res(1, j) = Empty
   End Select
Next
Anh thử thay khúc trong For Next thành như vậy xem được không?
Mã:
If Not (j <= 54 And j Mod 6 = 0) Then Res(1, j) = ""
 
Upvote 0
Anh thử thay khúc trong For Next thành như vậy xem được không?
Mã:
If Not (j <= 54 And j Mod 6 = 0) Then Res(1, j) = ""
Code chạy tốt. Thuật toán hay vậy mà mình không nghĩ ra. Dạo này bị mài mòn quá xá.

Mình lại sửa lại thế này
If Not j Mod 6 = 0 Then Res(1, j) = ""
 
Upvote 0
Mình có đoạn code cần giữ nguyên giá trị trong mảng Res() nếu j là 6,12,18... như bên dưới
Nếu không thì sẽ xóa giá trị các phần tử trong mảng. Nhìn tới nhìn lui thấy thừa thừa gì đó mà không biết làm sao rút ngắn lại. Các anh chị xem coi có thể dùng một dòng Case thôi được hay không.
Mã:
For j = 1 To UBound(Res, 2)
   Select Case j
      Case 6, 12, 18, 24, 30, 36, 42, 48, 54
      Case Else
      Res(1, j) = Empty
   End Select
Next
Test và biến chế nhé:

Mã:
Sub test()
    For j = 1 To 60
        If j Mod 6 = 0 Then
            Debug.Print "Thoa dk: " & j
        Else
            Debug.Print "Khong thoa dk: " & j
        End If
    Next
End Sub
 
Upvote 0
Test và biến chế nhé:

Mã:
Sub test()
    For j = 1 To 60
        If j Mod 6 = 0 Then
            Debug.Print "Thoa dk: " & j
        Else
            Debug.Print "Khong thoa dk: " & j
        End If
    Next
End Sub
Đúng là cứ đọc một bài lại thấy hay một chút
Mình lại chỉnh thêm xíu

If j Mod 6 <> 0 Then Res(1, j) = Empty
 
Upvote 0
Mình lại sửa lại thế này
If Not j Mod 6 = 0 Then Res(1, j) = ""
Em chỉ là đọc lại thôi mà.
Hoặc vận dụng 50% cách của anh "Vờ" :)
PHP:
Const Pos As String = "|6|12|18|24|30|36|42|48|54|"  ''Như này thì tùy biến hơn chút
For j ...
    If Not (InStr(Pos, "|" & j & "|") >= 1) Then Res(1,j) = ""
    ''If InStr(Pos, "|" & j & "|") < 1 Then Res(1,j) = ""
    ''If Not (j <= 54 And j Mod 6 = 0) Then Res(1,j) = ""
Next j
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Sub GPE()
 If Not (j \ 6 = j / 6 And j Mod 6 = 0) Then
      Res(1, j) = ""
 Else
     MsgBox "Xéo Ngay!", , "Chưa Thử À Nha!"
 End If
End Sub
 
Upvote 0
Thêm 1 cách nữa:
Mã:
Sub test()
    For j = 1 To 60
        Debug.Print IIf(j Mod 6, 0, j)
    Next
End Sub
 
Upvote 0
Mình có đoạn code cần giữ nguyên giá trị trong mảng Res() nếu j là 6,12,18... như bên dưới
Nếu không thì sẽ xóa giá trị các phần tử trong mảng. Nhìn tới nhìn lui thấy thừa thừa gì đó mà không biết làm sao rút ngắn lại. Các anh chị xem coi có thể dùng một dòng Case thôi được hay không.
Mã:
For j = 1 To UBound(Res, 2)
   Select Case j
      Case 6, 12, 18, 24, 30, 36, 42, 48, 54
      Case Else
      Res(1, j) = Empty
   End Select
Next
Thêm một cách nữa
PHP:
Dim TmpRes As Variant
TmpRes = Res
ReDim Res(1 To 1, 1 To UBound(TmpRes, 2))
For j = 6 To UBound(Res, 2) Step 6 'For j = 6 To WorksheetFunction.Min(UBound(Res, 2), 54) Step 6
    Res(1, j) = TmpRes(1, j)
Next
 
Upvote 0
Bài này thực ra chỉ có 2 trường hợp (chia hết và không hết cho 6) nên IF là chuẩn rồi. Nhưng Select như yêu cầu vẫn được.
Mã:
For j = 1 To UBound(res, 2)
    Select Case j Mod 6
        Case Is <> 0
            res(1, j) = Empty
    End Select
Next
 
Upvote 0
Cảm ơn các anh em GPE. Bài toán đã giải. Tuy nhiên nếu trường hợp cần là:
Case 6, 9, 11, 15, 22, 28
Như vậy sẽ không dùng Mod được. Nếu dùng Select Case thì có cách nào rút ngắn lại cho bài số 1 hay không?
 
Upvote 0
Nếu những số không có qui luật thì làm sao rút ngắn được nhỉ.
Mà tôi nghĩ là dãy số có thể dài chứ 6 số thì nghĩ rút gọn gì.
 
Upvote 0
Cảm ơn các anh em GPE. Bài toán đã giải. Tuy nhiên nếu trường hợp cần là:
Case 6, 9, 11, 15, 22, 28
Như vậy sẽ không dùng Mod được. Nếu dùng Select Case thì có cách nào rút ngắn lại cho bài số 1 hay không?
Em cũng đoán là không phải số 'đẹp' có quy luật như thế nên anh thử bài #6 xem. :p
 
Upvote 0
Em cũng đoán là không phải số 'đẹp' có quy luật như thế nên anh thử bài #6 xem. :p
Nhưng đây đang nói về rút gọn chứ không nói về cách khác. Cách khác cũng được nhưng phải gọn hơn. Chứ không gọn hơn thì lăn tăn gì nữa. :D
Đằng nào cũng phải liệt kê hết các số. Mà so với Select thì bài #6 còn dài hơn.
 
Upvote 0
Lệnh Select Case được đặt ra để rút gọn If-ElseIf... khi cần xét nhiều trị của mọt biểu thức.
Trường hợp này đúng là nhiệm vụ của nó.
Nếu bạn tìm được cách nào hiệu quả hơn thì có thể coi như Select Case trở thành thừa thải.
 
Upvote 0
Bài này thực ra chỉ có 2 trường hợp (chia hết và không hết cho 6) nên IF là chuẩn rồi. Nhưng Select như yêu cầu vẫn được.
Mã:
For j = 1 To UBound(res, 2)
    Select Case j Mod 6
        Case Is <> 0
            res(1, j) = Empty
    End Select
Next
Các bài viết đều có cái hay riêng nhưng để đáp ứng cho yêu cầu bài số 1 thì bài này quả thật là quá hay và gọn gàng dễ hiểu nhất
 
Upvote 0
Web KT

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

Back
Top Bottom