У меня есть два сабвуфера, и я хочу передать значения от одного к другому.
Option Explicit
Sub Test()
Call HandleInput(ActiveSheet.Range("A1:C4"), 4, 2)
End Sub
Sub HandleInput(rng As Range, rowNumber As Long, colNumber As Long)
Debug.Print rng.Cells(rowNumber, colNumber).Value
End Sub
Однако иногда я хочу применить ту же процедуру в том же диапазоне, но с другим rownumber
и другим colnumber
. Я мог бы просто вызвать sub снова с новыми значениями, и сейчас это кажется самым простым вариантом, но я все еще хочу знать, есть ли умный способ обработать его с дополнительными параметрами в HandleInput
:
Sub HandleInput(rng As Range, rowNumber As Long, colNumber As Long, Optional rowNumber2 As Long, _
Optional colNumber2 As Long, Optional rowNumber3 As Long, Optional colNumber3 As Long)
...
End Sub
Это заставило меня задуматься:
Могу ли я как-то сказать VBA, что, если предоставляется rowNumber2
, значение для colNumber2
также должно быть передано? Я знаю, что мог бы попробовать это с IsMissing()
и переключить тип данных на Variant
:
Sub HandleInput(rng As Range, rowNumber As Long, colNumber As Long, Optional rowNumber2 As Variant,
_ Optional colNumber2 As Variant, Optional rowNumber3 As Variant, Optional colNumber3 As Variant)
If Not IsMissing(rowNumber2) Then
If IsMissing(colNumber2) Then
MsgBox "Please enter a value for colNumber2."
End
End If
End If
End Sub
Для этого требуется множество операторов if, также в другом направлении (If NOT IsMissing(colNumber2) Then
). И это только ухудшается, если более двух переменных должны быть связаны вместе. Любое вычисление, которое я пытаюсь использовать в качестве обходного пути, выдает ошибку («Несоответствие типов»), когда отсутствует одно значение, например, я пытался:
If IsError(rowNumber2 * colNumber2) Then
MsgBox "Error, please supply both rowNumber2 and colNumber2"
End If
Есть ли для этого встроенная функция? Единственное решение, которое я придумал, - это ввести значения по умолчанию, которые, как я знаю, не будут происходить «естественно»: