#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, и я приму этот ответ .. эта идея слишком хороша..