Как вызвать подпрограмму VBA в другом модуле с параметром Range? - PullRequest
1 голос
/ 27 сентября 2019

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

Public Function CleanTable(rangeA As Range)

    Module1.replaceCellWithZero (rangeA)
    Module2.removeAsterisk (rangeA)
End Function 
Public Function ReplaceCellWithZero(rangeA As Range)

    Dim thisCell As Variant
    For Each thisCell In rangeA
        If InStr(thisCell, "<") > 0 Then
            thisCell.Value2 = 0
        End If
    Next thisCell
End Function
Public Function removeAsterisk(rangeA As Range)

    Dim thisCell As Variant
    For Each thisCell In rangeA
        thisCell.Value2 = replace(thisCell, "*", "")
    Next thisCell
End Function

Когда я вызываю функцию CleanTable, кажется, что она ничего не делает.Я не мог найти в чем дело даже с отладкой.Кажется, что он просто останавливается на replaceCellWithZero.

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

Любая помощь будет оценена!

1 Ответ

1 голос
/ 27 сентября 2019

Как я уже писал в своем комментарии, скобка вокруг параметра при вызове подфункции без ключевого слова Call будет оценивать параметр.В вашем случае результатом оценки будет либо содержимое ячейки, если диапазон только одна ячейка, либо это будет массив, содержащий значения диапазона.

Возможно, следующий код поможет прояснитьвыпуск

Option Explicit

Sub printV(v As Variant)

    Dim i As Long, j As Long
    For i = LBound(v) To UBound(v)
        For j = LBound(v, 2) To UBound(v, 2)
            Debug.Print v(i, j)
        Next j
    Next i
End Sub

Sub TestIt()

    Dim rg As Range
    Set rg = Range("A1:B2")

    Debug.Print TypeName((rg)), TypeName(rg)  ' Result is Variant and Range

    ' (rg) - the parewntheses will evaluate the range and the
    ' result is the same as v = rg
    printV (rg)

    ' This call will cause an RTE in the sub
    printV rg

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