Оператор Case, для цикла и if … else в VBA

#excel #vba

#excel #vba

Вопрос:

В столбце выше у меня есть уникальная дата.

У меня есть выпадающий список, в котором можно выбрать что угодно.. таким образом, он имеет 8 перестановок (2 ^ 3)..Итак, я хочу извлечь вероятную дату на основе выбора..Предположим, если я выберу год как 2020, а день как 19, тогда я извлеку вероятную дату, которая соответствует обоим условиям..Как на картинке выше…

Прямо сейчас я использую 8, если elseif-=…end, если statment … и для loop..Is есть какой-либо другой способ выполнить ту же работу?? Я хотел написать функцию, которая будет принимать (day, month, year, lastrow) в качестве параметра и вычисляться на основе вероятной даты..Кто-нибудь может подсказать мне, как это сделать?

Теперь мой код:

 Public Sub ProbableDate(CaseNo As Integer, lastrow As Long)
Dim sh As Worksheet, sh1 As Worksheet
Set sh1 = Worksheets("Dashboard")
Set sh = Worksheets("Logical operation")
Dim Y As String, M As String, D As String
Y = sh1.Cells(4, 1).Value
M = sh1.Cells(4, 2).Value
D = sh1.Cells(4, 3).Value
Dim L As Long, i As Long
L = 2
With sh
    .Range("H2:H1048576").Clear
    For i = 2 To lastrow
        Select Case CaseNo
            Case 1
                If Year(.Cells(i, 2).Value) = Y Then
                            .Cells(L, 8).Value = .Cells(i, 2).Value
                            L = L   1
                End If
           Case 2
                If MonthName(Month(.Cells(i, 2).Value)) = M Then
                            .Cells(L, 8).Value = .Cells(i, 2).Value
                            L = L   1
                End If
           Case 3
                If Day(.Cells(i, 2).Value) = D Then
                            .Cells(L, 8).Value = .Cells(i, 2).Value
                            L = L   1
                End If
           Case 4
                If Year(.Cells(i, 2).Value) = Y And MonthName(Month(.Cells(i, 2).Value)) = M Then
                            .Cells(L, 8).Value = .Cells(i, 2).Value
                            L = L   1
                End If
           Case 5
                If Year(.Cells(i, 2).Value) = Y And Day(.Cells(i, 2).Value) = D Then
                            .Cells(L, 8).Value = .Cells(i, 2).Value
                            L = L   1
                End If
           Case 6
                If Day(.Cells(i, 2).Value) = D And MonthName(Month(.Cells(i, 2).Value)) = M Then
                            .Cells(L, 8).Value = .Cells(i, 2).Value
                            L = L   1
                End If
           Case 7
                If Day(.Cells(i, 2).Value) = D And MonthName(Month(.Cells(i, 2).Value)) = M And Year(.Cells(i, 2).Value) = Y Then
                            .Cells(L, 8).Value = .Cells(i, 2).Value
                            L = L   1
                End If
        Case Else
            MsgBox "Wrong Info"
        End Select
    Next i
End With
End Sub
  

Комментарии:

1. Проверьте это сейчас, пожалуйста.

Ответ №1:

Вы можете упростить свой код, используя двоичную таблицу подстановки. Каждый CaseNo соответствует определенному набору результатов true / false для проверки дня, месяца и года. Они отличаются от вашего исходного отображения, вот новая карта:

CaseNo DMY

 0 сбой
 1 D
 2 M
 3 DM
 4 Y
 5 D Y
 6 МОЙ
 7 DMY

И код:

 With sh
    .Range("H:H").Clear
    For i = 2 To lastrow
        OK = 0
        If Day(.Cells(i, 2).Value) = D Then OK = OK   1
        If MonthName(Month(.Cells(i, 2).Value)) = M Then OK = OK   2
        If Year(.Cells(i, 2).Value) = Y Then OK = OK   4
        
        If OK = CaseNo Then
            .Cells(L, 8).Value = .Cells(i, 2).Value
            L = L   1
        Else
            MsgBox "Wrong Info"
        End If
    Next i
End With
  

Комментарии:

1. Спасибо… Я попробую .. Эта идея так хороша.. Мне нравится идея..

2. Я думаю, что Elseif OK = 0, тогда msgbox не требуется, поскольку он отображает сообщение каждый раз, когда данные не совпадают… Спасибо.. Пожалуйста, добавьте ключевое слово then, и я приму этот ответ .. эта идея слишком хороша..