2014-05-25 2 views
1

시나리오 - OutFolder에는 생성 된 날짜 시간 (20140524110115, 20140524110120, 20140524110122 등)에 따라 이름이 지정된 XML 파일이 들어 있습니다. ID 및 작업 태그 값을 기반으로 파일의 이름을 바꾸고 싶습니다 (또한 중복을 확인하십시오).FSO 파일 이름 바꾸기 코드가 두 번 실행됩니다.

문제 - 다음 코드를 실행하면 루프가 폴더의 파일 수보다 두 배 이상 실행됩니다. 현재 폴더에는 67 개의 파일이 있고 루프는 134 번 실행됩니다. 따라서 파일은 루프가 두 번 실행되는 이유는 무엇

 
ID11_New_1.xml 
ID11_Used_1.xml 
ID12_New_1.xml 
ID12_Sold_1.xml 
... and so on 

를 기다리고 있었다

 
ID11_New_2.xml 
ID11_Used_2.xml 
ID12_New_2.xml 
ID12_Sold_2.xml 
... and so on 

로 이름이 변경? 당신이 중복 테스트 폴더가 올바른 (내가 폴더를 포함 모르는)이지만, 어쩌면 THER 첫 번째 줄에 당신이 OutFolder을 변경해야하는 경우

Sub Test(OutFolder) 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    Set xmlDoc = CreateObject("Microsoft.XMLDOM") 
    xmlDoc.SetProperty "SelectionLanguage", "XPath" 
    xmlDoc.Async = False 
    Set objFiles = objFSO.GetFolder(OutFolder).Files 
    i = 1 

    For Each FileXML In objFiles 
     Debug.Print i 
     xmlDoc.Load (FileXML.Path) 
     Set varID = xmlDoc.GetElementsByTagName("Id") 
     Set varAction = xmlDoc.GetElementsByTagName("Action") 
     If varID.Length > 0 And varAction.Length > 0 Then 'if file is of correct format 
      FileCtr = 1 
      varFileName = varID(0).Text & "_" & varAction(0).Text & "_" & FileCtr & ".xml" 
      'check for duplicates 
      While objFSO.FileExists(objFSO.BuildPath(OutFolder, varFileName)) 
       varFileName = varID(0).Text & "_" & varAction(0).Text & "_" & FileCtr & ".xml" 
       FileCtr = FileCtr + 1 
      Wend 
      'FileXML.Name = varFileName 
      With objFSO 
       .MoveFile .BuildPath(FileXML.ParentFolder, FileXML.Name), .BuildPath(FileXML.ParentFolder, varFileName) 
      End With 
     End If 
     i = i + 1 
    Next 
End Sub 
+1

동시에 개체를 반복하면서 개체 집합의 콘텐츠를 변경하지 않는 것이 좋습니다. 소스 파일 이름을 먼저 콜렉션에 덤프 한 다음 처리하십시오. –

답변

0
While objFSO.FileExists(objFSO.BuildPath(OutFolder, varFileName)) 
    FileCtr = FileCtr + 1 
    varFileName = varID(0).Text & "_" & varAction(0).Text & "_" & FileCtr & ".xml" 
Wend 

그리고 정말 확실 FileXML.ParentFolder

+0

작동하지 않았습니다 ... 여전히 동일한 결과가 나타납니다. _2 이름을 가진 134 개의 루프 및 파일. 매크로를 실행하기 전에 폴더에는 날짜 시간이있는 파일이 이름으로 포함되어 있습니다. 나는 그들의 파일 (ID와 행동)을 기반으로이 파일의 이름을 같은 폴더에 바란다. 따라서 OutFolder는 FileXML.ParentFolder입니다. –

+1

@PankajJaju, 입력 및 출력 폴더가 같고'.Files' 콜렉션이 정적이 아니기 때문에 (즉, 콜렉션에 포함 된 파일의 이름을 바꿀 때), 파일을 다시 처리하게됩니다. 따라서 다른 폴더를 사용하거나 파일의 이름이 변경되었는지 확인하십시오. –