Попытка запустить определенный макрос на основе текущего значения ячейки - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь настроить рабочую книгу, которая позволяет мне регистрировать данные в ячейках на одном листе на других листах в зависимости от дня недели.По сути это еженедельный трекер с отдельным листом для каждого дня недели.У меня есть отдельные макросы для перемещения нужных данных из «текущего» листа в любой другой день недели, и каждый из них работает по своему усмотрению.

Редактировать: я привязываю этот макрос к кнопке наосновной лист, а не с помощью горячей клавиши или списка.

Sub Lookup()
    Dim day As String

    day = ThisWorkbook.Sheets("Data").Cells(2, "x").Value2

    If day = "Mon" Then
        Call Mon

    ElseIf day = "Tue" Then
        Call Tue

    ElseIf day = "Wed" Then
        Call Wed

    ElseIf day = "Thu" Then
        Call Thu

    ElseIf day = "Fri" Then
        Call Fri
    End If
End Sub

Я пытаюсь создать отдельный макрос, который просматривает данные в определенной ячейке на определенном листе (используя «Now ()»функция в определенной ячейке, отформатированная, чтобы показать только день недели) и просто хотите, чтобы он посмотрел на эти данные и запустил соответствующий макрос.Как и сейчас, он останавливается на первом шаге с ошибкой

«Ошибка компиляции: ожидаемая функция или переменная»

Редактировать: я понял, что если она у меня естьСсылка на ячейку, где я вручную набрал в любой день, это работает.Таким образом, похоже, что макрос смотрит только на формулу, а не на результат.Изменение формулы в ячейке на

=TEXT(NOW(),"ddd")

решило проблему.Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Я предполагаю, что вам нужно отформатировать вывод, с которым вы сравниваете, чтобы запустить макрос. Вы утверждаете, что у вас есть =NOW() в ячейке, и это, например, не вернет Mon. Таким образом, вы можете использовать метод Format для получения искомого результата.

Вот способ проверить, что то, что находится в ячейке X2, на самом деле является датой, и что дата выпадает на пн-пт (исключая выходные дни), так что вы можете вызывать свои макросы пн-пт, передавая их в Application.Run :

Sub Lookup()

    Dim lWeekday As Long

    With ThisWorkbook.Worksheets("Data").Range("X2")
        On Error Resume Next
        lWeekday = WorksheetFunction.Weekday(.Value, 16)
        On Error GoTo 0
        Select Case (IsDate(.Value)) And (lWeekday > 2) 'Verify date and that it is Mon-Fri
            Case True:  Application.Run Format(.Value, "ddd")
            Case Else:  MsgBox "Invalid date: [" & .Value & "]", , "Error"
        End Select
    End With

End Sub
0 голосов
/ 11 июля 2019

Вы можете передать значение String в Application.Run, чтобы сократить код до

Sub Lookup()
    Dim day As String

    day = ThisWorkbook.Sheets(8).Cells(2, "x").Value

    Application.Run day
End Sub

, а затем с помощью Sheets(8).cells(2,"x") добавить проверку данных в ячейку со значением списка Mon, Tue, Wed, Thu, Friили какими бы ни были ваши имена макросов, чтобы пользователь мог выбирать только из определенного списка вариантов.

Кроме того, вам нужно явно ссылаться на свой лист вместо ссылки на его положение.

т.е.

day = ThisWorkbook.Sheets(8).Cells(2, "x").Value

становится

day = ThisWorkbook.Sheets("YourSheetNameHere").Cells(2, "x").Value2

или обрабатываете его в своем макросе

Sub Lookup()
    Dim day As String
    Dim ValidSubs As Variant
    Dim RunSub As Boolean: RunSub = False
    Dim c

    ValidSubs = Array("Mon", "Tue", "Wed", "Thu", "Fri")

    day = ThisWorkbook.Sheets(8).Cells(2, "x").Value

    For Each c In ValidSubs
        If c = day Then
            RunSub = True
            Exit For
        End If
    Next c

    If RunSub Then
        Application.Run day
    Else
        MsgBox "You have selected an invalid choice - only the following are allowed:" & vbNewLine & Join(ValidSubs, vbNewLine)
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...