1

Тема: VBScript: имитация переменного числа аргументов процедуры/функции

Иногда необходимо использовать переменное число аргументов у процедуры/функции (то есть, когда заранее неизвестно, каково будет число аргументов). Напрямую такое сделать (как, скажем, в jscript), по-видимому, невозможно, но можно сымитировать подобное поведение, передавая в процедуру/функцию массив с произвольным количеством элементов, которые и будут служить «аргументами» данной процедуры/функции:

Option Explicit

Dim arrArgs

SomeSub Array(10)
SomeSub Array(10, 0.5)
SomeSub Array(10, 0.5, "Some string value")
SomeSub Array(10, 0.5, "Some string value", True)

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub SomeSub(ByRef arrArgs)
    Dim i
    
    WScript.Echo
    WScript.Echo "Количество аргументов: ", UBound(arrArgs) + 1
    WScript.Echo "------------------------------------------"
    WScript.Echo "#", vbTab, "Тип", vbTab, "Значение"
    WScript.Echo "------------------------------------------"
    
    For i = LBound(arrArgs) To UBound(arrArgs)
        WScript.Echo CStr(i + 1), vbTab, TypeName(arrArgs(i)), vbTab, arrArgs(i)
    Next
    
    WScript.Echo "------------------------------------------"
End Sub
'=============================================================================

Точно так же можно передавать и аргументы объектного типа:

Option Explicit

Dim arrArgs
Dim objFSO

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

SomeSub Array(10, "Some string value", objFSO, CreateObject("WScript.Shell"), Nothing)

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub SomeSub(ByRef arrArgs)
    Dim i
    
    WScript.Echo
    WScript.Echo "Количество аргументов: ", UBound(arrArgs) + 1
    WScript.Echo "------------------------------------------"
    WScript.Echo "#", vbTab, "Тип", vbTab, "Значение"
    WScript.Echo "------------------------------------------"
    
    For i = LBound(arrArgs) To UBound(arrArgs)
        If IsObject(arrArgs(i)) Then
            WScript.Echo CStr(i + 1), vbTab, TypeName(arrArgs(i)), vbTab, "Object"
        Else
            WScript.Echo CStr(i + 1), vbTab, TypeName(arrArgs(i)), vbTab, arrArgs(i)
        End If
    Next
    
    WScript.Echo "------------------------------------------"
End Sub
'=============================================================================

Автор идеи — Dmitrii.

2 (изменено: ingvar68, 2009-07-23 11:45:35)

Re: VBScript: имитация переменного числа аргументов процедуры/функции

Я давно и практически везде пользуюсь Dictionary

Set dP = CreateObject("Scripting.Dictionary")
dP("P1")=Now
dP("P2")="Привет"
Set dP("d$P1")=CreateObject("Scripting.Dictionary")
dP("d$P1")("P1")="Dictionary In Dictionary"

'для примера
'rst.Open "select * from ddeTVS_TVS_RIU9",cnn
'Set dP("rst$P1")=rst
'

RC=FUNC(dP)
MsgBox RC
RC=FUNC(" I=4:B=6:T=""TEXT"" ")
MsgBox RC


Function FUNC(WHAT)
If IsObject(WHAT) Then
   For Each Key In WHAT.Keys
       If InStr(1,Key,"d$") Then
          MsgBox WHAT(Key)("P1")
       End If
       If InStr(1,Key,"rst$") Then
          MsgBox WHAT(Key).RecordCount
       End If
   Next
   FUNC=WHAT.Count
  Else
   Execute WHAT
   MsgBox "I=" & I
   MsgBox "B=" & B
   FUNC=T
End If 
End Function