0

VBS変数値の割り当てに問題があります。

Dim varName  
varName = function(x, y)
varName = function(x, y)

関数は再帰関数であり、それ自体を呼び出します。

Function function(x, y)
    If IsObject(dicColumnIndices) Then
        function = CInt(dicColumnIndices.Item(y))
    Else
        Set oCDSGrid = %MyAppObject%
        Set dicColumnIndices = CreateObject("Scripting.Dictionary")
        intColumnCount = oCDSGrid.ActiveSheet.Columns.Count
        For i = 0 To intColumnCount - 1
            dicColumnIndices.Add oCDSGrid.ActiveSheet.Columns.Item(i).Label, i
        Next

        function x, y
    End If
End Function

私が見る限り、変数値の割り当ては2回目の試行でのみ発生します。関数が自分自身を再帰的に呼び出すことと関係があると思いました(再帰呼び出しを削除すると問題はなくなります)が、この動作のルーツは何かを学びたいと思います。

StackOverflowとインターネットの両方を調べましたが運がありませんでした。

編集:この問題を解決するために、再帰呼び出しを削除する必要がありました:

Function function(x, y)
If IsObject(dicColumnIndices) Then
    function = CInt(dicColumnIndices.Item(y))
Else
    Set oCDSGrid = %MyAppObject%
    Set dicColumnIndices = CreateObject("Scripting.Dictionary")
    intColumnCount = oCDSGrid.ActiveSheet.Columns.Count
    For i = 0 To intColumnCount - 1
        dicColumnIndices.Add oCDSGrid.ActiveSheet.Columns.Item(i).Label, i
    Next

    function = CInt(dicColumnIndices.Item(y))
End If
End Function

編集2:最後に、MSDNの助けを借りて、間違った部分を取得しました-2回目の呼び出しです

function x, y

値を何も返さないので、次のように変更する必要があります。

function = function x, y

みんな、ありがとう!

4

1 に答える 1

1

関数を関数と呼ぶべきではありません。varnameは変数のひどい名前です。さらに重要な点:VBScriptでは、関数名に割り当てない場合、関数は関数ではありません(何かを返しません)。

  Dim s : s = "abcdefg"
  Dim l : l = recLen(s)
  WScript.Echo "recursive length of", qq(s), "=>", l, CStr(l = Len(s))

  Function recLen(s)
    If "" = s Then
       recLen = 0
    Else
       recLen = 1 + recLen(Mid(s, 2))
    End If
  End Function

(空の文字列の長さは0です。長い文字列の場合は1 +文字列の'テール'の長さです)

更新(AutomatedChaosのおかげで):

Function qq( vStringable )
  qq = """" & vStringable & """"
End Function

アップデートII(コメントでEugeneの質問に答えるため):

何かを返す関数を作成するには、関数と同じ名前の変数に返す値を割り当てる必要があります。元のコードはそうではありませんでした(「関数」という名前が「実際の」名前に置き換えられたとしても)。

于 2012-08-08T12:16:42.337 に答える