0

これはコードです:

'creates the msxml object
Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")
Dim retVal

'load the xml data of the script
retVal=xmlDoc.load(argFilePath)

Dim fso, folder, sFolder
Dim xmlDataPath, curNode

'get input folder
Set curNode=xmlDoc.selectSingleNode("//ScriptXmlData/inputFilePath")
Dim inputFolder, outputFolder, hotLoc
inputFolder=CSTR(curNode.text)

'location of jdf files
sFolder=inputFolder

'creating file getting object
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(sFolder)

Dim amount, fName, arrC, i
i=0

'loop for getting amounts
For each folderIdx In folder.files
    If fso.GetExtensionName(folderIdx.Name) = "jdf" Then

        'increase array size
        Redim arrC(i)

        'get folder name
        fName=folderIdx.Name

        'get file path
        xmlDataPath = sFolder+"\"+fName

        'load the xml data of the script
        retVal = jdfDoc.load(xmlDataPath)

        'get amount
        Set curNode = jdfDoc.selectSingleNode("//jdf:JDF/jdf:ResourceLinkPool/jdf:ComponentLink")
        amount = curNode.getAttribute("Amount")

        'Create array that holds amount
        arrC(i)=amount
        i=i+1

    End If
Next

wscript.echo arrC(0)
wscript.echo arrC(1)
wscript.echo arrC(2)

問題は、arrC がループを終了すると、その値の一部が失われることです。たとえば、ループ内の配列は次のとおりです。

arrC(0)=100
arrC(1)=150
arrC(2)=200

コードの最後のテストのように、ループを抜けると、その値は次のようになります。

arrC(0)=""
arrC(1)=""
arrC(2)=200

誰か説明してくれませんか?

ありがとうございました!

4

1 に答える 1

2

ReDimキーワードなしで使用すると、配列の要素を保持しませんPreserve。行を変更する

Redim arrC(i)

の中へ

Redim Preserve arrC(i)

ところで、インデックス変数は必要ありません。をループの外で空の配列として初期化するarrCと、上限をインデックスとして使用できます。

ReDim arrC(-1)

For Each folderIdx In folder.files
  If fso.GetExtensionName(folderIdx.Name) = "jdf" Then
    ...
    ReDim Preserve arrC(UBound(arrC)+1)
    arrC(UBound(arrC)) = amount
  End If
Next

ただし、ReDim Preserve実際には新しい配列を作成し、古い配列から既存の要素をコピーするため、配列のサイズが大きくなるとパフォーマンスが低下します。代わりに配列リストを使用することもできます:

Set arrC = CreateObject("System.Collections.ArrayList")

For Each folderIdx In folder.files
  If fso.GetExtensionName(folderIdx.Name) = "jdf" Then
    ...
    arrC.Add amount
  End If
Next
于 2013-08-04T14:18:09.860 に答える