2017-11-24 1 views
0

메모장에서 XML 파일을 생성하는 루프를 만들려고합니다. 머리말과 꼬리말뿐만 아니라 XML 파일을 만드는 것도 좋습니다. 내가 갖고있는 문제는 스크립트를 유연하게 만드는 것입니다. 스크립트는 입력 데이터 라인의 수를 변화시키면서 주기적으로 실행됩니다. 내가 현재 가지고있는 스크립트는 올바른 사용자 수에 대해 작동하는 XML 파일을 생성하지만 입력 된 데이터는 첫 번째 입력 행에서 반복됩니다. 나는 이것에 대한 내 두뇌를 쌓아 왔고 여기와 다른 사이트에서 수색했지만 내가 적용 할 수있는 것을 찾지 못했습니다. 나는 일반적으로 VBA를 사용하여 .xlsx 파일을 생성하므로 메모장에서 작업하는 것이 내 안락 영역에서 약간 벗어납니다. 나는 "Dim i As Integer"를 사용해 보았지만 Range ("D10"& i)와 아무데도 가지 않았습니다. 어떤 도움도 받으실 수 있습니다.Excel VBA에서 메모장에서 XML 파일을 채우는 루프 만들기

코드

Sub Macro1() 

    ' Macro1 Macro 

    unique = Range("C1").Value 
    creation = Range("C2").Value 
    Users = Range("C10:C1010").Cells.SpecialCells(xlCellTypeConstants).Count 
    Total = Range("c4").Value 
    batch = Range("C3").Value 
    valuedate = Range("C6").Value 
    myfilename = batch 
    masterfile = "C:\temp\TEXTFILE.XML" 
    'LastRow = Range("C10", Range("C10").End(xlDown)).Rows.Count 

    Dim src As String, dst As String, fl As String 
    Dim rfl As String 

    FileNum = FreeFile ' next free filenumber 
    'Open "C:\Temp\TEXTFILE.TXT" For Output As #FileNum ' creates the new file 

    Open "C:\temp\TEXTFILE.XML" For Output As #1 

    'Header Script (no issue) 
    ' Set numrows = number of rows of data. 
    NumRows = Range("C10", Range("C10").End(xlDown)).Rows.Count 

    '  ' Select cell C10. 
    Range("C10").Select 

    '  ' Establish "For" loop to loop "numrows" number of times. 
    For x = 1 To NumRows 
     '   ' Insert your code here. 
     ' generate line specific data 

     Print #FileNum, "   " & "<CdtTrfTxInf>" & vbNewLine & 
     "   " & "<XXXXX>" & vbNewLine & 
     "    " & "<XXXXXXX>"; Format(Month(valuedate), "00") & Format(Day(valuedate), "00") & "-01<XXXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXX>" & vbNewLine & _ 
     "    " & "<XXXXXXXX" & """XXXXX""" & ">" & Range("D10").Value & 
     "<XXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXX>" & vbNewLine & _ 
     "    " & "<XXXXXXXXX>" & vbNewLine & _ 
     "     " & "<XXXXXX>" & Range("H10").Value & "<XXXXXXX>" & vbNewLine & _ 
     "    " & "<XXXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXXXX>" & vbNewLine & _ 
     "    " & "<XXXXXX>" & Range("C10").Value & "<XXXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXXXX>" & vbNewLine & _ 
     "    " & "<XXXXXXXX>" & vbNewLine & _ 
     "     " & "<XXXXXXXX>" & Range("G10").Value & "<XXXXXXX>" & vbNewLine & _ 
     "    " & "<XXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXXXX>/XXXXXXXXXX/R/<XXXXXXXXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXXX>" & vbNewLine & _ 
     "    " & "<XXXXXXXX>" & Range("E10").Value & "<XXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXXX>" & vbNewLine & _ 
     "   " & "<XXXXXXXXXXXXX>" 
    Next 
End Sub 
+0

스프레드 시트의 자리 표시자를 사용하여 해당 행이 이미 내 보낸 적이 있는지 여부를 표시하고, 내 보내지 않은 경우 플래그를 표시하며, 해당 행을 내보내고 플래그를 추가하지 않는지 확인하는 방법은 어떨까요? 그 기록. – Xabier

+0

닫기 : 범위 ("D"및 10 + i).값 – jkpieterse

답변

0

몇 가지 힌트 :

  • 항상 Option Explicit를 사용하여 변수를 선언 아래의 스크립트를 참조하십시오. 필요한 정보를 구조화하기 위해 Type을 사용할 수 있습니다.

  • 범위, 시트 또는 통합 문서에 대한 정규화 된 참조를 사용하십시오.

  • 단일 값의 범위를 반복하지 마십시오. 배열이 훨씬 빠릅니다.

나는 코드를 쉽게 읽을 수 있도록 당신이 예를 들어, 배열 값을 얻으려면, 열 번호를 얻을 수있는 도우미 함수를 사용 열 "H"(= 8)에서 :

V (X, s2Col ("H")) 물론

당신은 또한 당신의 모듈로 v(x, 8)

선언 헤드를 사용할 수 있습니다

Option Explicit 
Type TValues 
    unique As Variant 
    creation As Variant 
    Users As Long 
    Total As Variant 
    batch As Variant 
    valuedate As Variant 
End Type 
Dim MyValues As TValues 

Main 프로 시저

Sub Macro1() 
' Purpose: create xml from sheet information using a 1-based 2-dim datafield array 
Dim src As String, dst As String, fl As String 
Dim rfl As String 
Dim v     ' variant (to receive one based 2dim data field array) 
Dim oWs As Worksheet ' worksheet 
Dim myfilename As String 
Dim masterfile As String 
Dim s   As String 
Dim FileNum As Long 
Dim numRows As Long 
Dim x   As Long 
Set oWs = ThisWorkbook.Worksheets("MySheet") 
With MyValues 
    .unique = oWs.Range("C1").value 
    .creation = oWs.Range("C2").value 
    .Users = oWs.Range("C10:C1010").Cells.SpecialCells(xlCellTypeConstants).Count 
    .Total = oWs.Range("c4").value 
    .batch = oWs.Range("C3").value 
    .valuedate = oWs.Range("C6").value 

    myfilename = .batch 
    masterfile = "C:\temp\TEXTFILE.XML" 
'LastRow = Range("C10", Range("C10").End(xlDown)).Rows.Count 

FileNum = FreeFile ' next free filenumber 
'Open "C:\Temp\TEXTFILE.TXT" For Output As #FileNum ' creates the new file 
Open "D:\temp\TEXTFILE.XML" For Output As #1 

'Header Script (no issue) 
' ... 
' Set numrows = number of rows of data. 
    numRows = Range("C10", oWs.Range("C10").End(xlDown)).Rows.Count 
' create a one based 2-dim datafield array 
    v = oWs.Range("A10:H" & numRows + 9).value  ' plus 9 rows for information header 

' loop throug array 
For x = 1 To numRows 
    ' 

    s = "   " & "<CdtTrfTxInf>" & vbNewLine & "   " & "<XXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXXX>" & Format(Month(.valuedate), "00") & Format(Day(.valuedate), "00") & "-01<XXXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXX>" & vbNewLine & "   " & "<XXXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXXXX" & """XXXXX""" & ">" & v(x, s2Col("D")) & "<XXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXXXXX>" & vbNewLine & _ 
    "     " & "<XXXXXX>" & v(x, s2Col("H")) & "<XXXXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXX>" & v(x, s2Col("C")) & "<XXXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXXXX>" & vbNewLine & _ 
    "     " & "<XXXXXXXX>" & v(x, s2Col("G")) & "<XXXXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXXXX>/XXXXXXXXXX/R/<XXXXXXXXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXXX>" & vbNewLine & _ 
    "    " & "<XXXXXXXX>" & v(x, s2Col("E")) & "<XXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXXX>" & vbNewLine & _ 
    "   " & "<XXXXXXXXXXXXX>" 
    Print #FileNum, s 
Next 
End With ' Type MyValues 
' don't forget to add a closing tag to receive a well formed XML file, e.g. ... 
' Print #FileNum, "</root>" 
' 
' close text file 
Close #FileNum 
End Sub 

도우미 기능 (cf. 위의 힌트)

가 주어진 열 문자에서 열 수를 가져옵니다 :

Public Function s2Col(ByVal sCol As String) As Long 
' Purpose: return column number, e.g. "H" -> 8 
    s2Col = Range(sCol & ":" & sCol).Column 
End Function 

주 물론

는 XML 파일을 만들 수있는 다른 방법 (예를 들어,이 MSXML2.DomDocument60를 참조 존재 XMLDOM 메소드를 통한 객체).

+0

이것은 몇 가지 수정 사항과 함께 치료를했습니다. 당신의 도움을 주셔서 감사합니다! –