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

Просто чтобы прояснить, я знаю, что этот вопрос (или общая проблема) был поднят здесь раньше: я потратил несколько часов на этом этапе в течение нескольких недель, пытаясь решить это самостоятельно. Я прочитал несколько постов о похожих проблемах и опробовал множество решений, предложенных этим и другими сообществами. Кажется, я не могу приспособить какое-либо из этих решений к своим конкретным потребностям, поэтому прошу помощи по этому вопросу.

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

Существует 8 конкретных входных данных, которые должны соответствовать сходным критериям, чтобы считаться действительными (хотя точные значения не являются одинаковыми, то есть минимальные и максимальные значения). Критерии для удовлетворения:

i) должен быть числом

ii) не должно быть меньше минимального значения

iii) не должно превышать максимальное значение

По сути, у меня есть подпрограмма для каждого из этих входов, которая проверяет эти критерии с помощью BeforeUpdate и вызывает другую подпрограмму для внесения видимых изменений в пользовательскую форму, чтобы предупредить пользователя о недопустимой записи (изменить цвет метки и заголовок, текстовое поле или цвет Dropbox и т. д.). Используя AfterUpdate, у меня также есть подпрограмма для каждого из 8 входов, которая отменяет эти изменения после того, как была сделана правильная запись. Это означает, что у меня 24 подпрограммы с практически одинаковым кодом, и я считаю, что должно быть только 3 подпрограммы, которые можно использовать более широко.

Я озадачен последней частью, и уже достаточно долго, что мне нужна помощь кого-то более опытного в создании надежного, профессионального кода VBA, чтобы решить эту проблему. Я уверен, что решение относительно простое и что я, вероятно, слишком много думаю или иным образом усложняю проблему, но ничего из того, что я пробовал, до сих пор не сработало.

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

Вот код, который у меня есть для этих подпрограмм, так как он используется для одного конкретного ввода:

Sub # 1

    Private Sub NumberOfTechs_BeforeUpdate(ByVal CAncel As MSForms.ReturnBoolean)
    If Not IsNumeric(numberOfTechs) Then
       Call NumberOfTechsInvalid("Must be a number!", numberOfTechsLabel, numberOfTechs)
       CAncel = True
    Else
        If numberOfTechs < 1 Then
            Call NumberOfTechsInvalid("Cannot be less than 1!", numberOfTechsLabel, numberOfTechs)
            CAncel = True
        ElseIf numberOfTechs > 6 Then
            Call NumberOfTechsInvalid("Cannot exceed 6!", numberOfTechsLabel, numberOfTechs)
            CAncel = True
        End If
    End If
    End Sub

Sub # 2

    Private Sub NumberOfTechsInvalid(errorCaption As String, targetLabel As Object, targetControl As Object)
    targetLabel.caption = errorCaption
    targetLabel.ForeColor = rgbRed
    targetControl.BackColor = rgbPink
    targetControl.SelStart = 0
    targetControl.SelLength = Len(targetControl)
    End Sub

Sub # 3

    Private Sub NumberOfTechs_AfterUpdate()
    numberOfTechsLabel.ForeColor = Me.ForeColor
    numberOfTechsLabel = "Number Of Techs"
    numberOfTechs.BackColor = rgbWhite

    ' Call next subroutine
    End Sub

Как вы видите, у меня есть комментарий внизу подпункта № 3, который просто говорит "вызовите следующую подпрограмму". Вот где мне трудно сделать эту работу. Я могу передать минимальные и максимальные значения в качестве переменных, а также указать целевой элемент управления и метку, в зависимости от того, какой пользовательский ввод инициирует вызов к sub # 1. У меня проблема с передачей следующей подпрограммы в виде строки. Я попытался поместить эти подпрограммы в их собственный модуль и использовать Application.Run, и я попытался использовать CallByName с этими подпрограммами в коде пользовательской формы. Кажется, ничего не работает, если я не оставлю все как есть (8 входов с этими 3 сабами специально для каждого входа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...