2016-08-18 1 views
1

VBA를 사용하여 Word 문서를 구문 분석하여 내용을 배열에 넣을 수있는 방법을 찾으려고합니다. 이 예제에서는 Word 문서에 두 개의 회사가 있으며 (코드 아래에 표시) 필드를 배열에 넣으려고합니다. 스택 오버플로 잘라 붙여VBA Excel - Word 문서의 구분 및 구문 분석 섹션에서 Excel에 데이터를 입력하십시오.

Public Sub ParseCompanies() 

Dim Company_Array(1 To 2) As String 'stores individual company fields 
Dim Companies_Array() 'array for all companies 

Dim oWord As Object, oDoc As Object 
Set oWord = CreateObject("Word.Application") 

Set oDoc = oWord.Documents.Open("C:/Temp/test.docx", Visible:=True) 

Dim singleLine 
Dim lineText As String 

'need to rewrite this section 
For Each singleLine In oDoc.Paragraphs 

    lineText = singleLine.Range.Text 
    Debug.Print lineText  

Next singleLine 


End Sub 

Word 파일 내용 :


회사 : 알라딘 카펫

제품 : 매직 카펫


회사 : 안테나 조개

제품 : 조개


현재 스크립트가이 작업을 수행 할 수있는 효율적인 방법이 있나요 VBA를 디버거 출력

enter image description here

아래에서 볼 수 있습니다 실행하는 방법은? 개개의 회사를 파싱하기 위해 word 문서의 라인이나 섹션 스플리터를 구분하는 방법?

답변

2

솔루션 :

: 출력 데이터를 복사 -I 언급 된 바와 같이하지만 난 다른 결과 -를 얻을 수
경우,이, 일을해야하지 않을 경우, 단지 요소를 조정 배열에 저장되는 변경/제안의
Public Sub ParseCompanies() 

Dim Products_Array() As String 'stores individual company fields 
Dim Companies_Array() As String 'array for all companies 
Dim CounterElements As Long: CounterElements = 1 
Dim CounterParagraphs As Long 

Dim oWord As Object, oDoc As Object 
Set oWord = CreateObject("Word.Application") 
On Error GoTo Err01ParseCompanies 
Set oDoc = oWord.Documents.Open("C:\Users\lz630z\Desktop\Company.docx", visible:=True) 

Dim singleLine 
Dim lineText As String 

'need to rewrite this section 
For CounterParagraphs = 1 To oDoc.Paragraphs.Count 
    If InStr(oDoc.Paragraphs(CounterParagraphs).Range.Text, "Company") Then ReDim Preserve Companies_Array(CounterElements): Companies_Array(CounterElements) = oDoc.Paragraphs(CounterParagraphs + 2) 
    If InStr(oDoc.Paragraphs(CounterParagraphs).Range.Text, "Product") Then ReDim Preserve Products_Array(CounterElements): Products_Array(CounterElements) = oDoc.Paragraphs(CounterParagraphs + 2): CounterElements = CounterElements + 1 

Next CounterParagraphs 

If 1 = 2 Then ' 99. If error 
Err01ParseCompanies: 
MsgBox "Word Error", vbCritical 
End If '99. If error 
Set oDoc = Nothing 
Set oWord = Nothing 
End Sub 

요약
For each이 스크린 샷에 따라 있기 때문에, 여기에 작동하지 않습니다는 FOU 후 2 개 행이 될 것입니다 첫 번째 결과는이 시나리오에서 모든 것을 제어하고 이에 따라 배열의 요소를 저장하는 것이 더 낫습니다. For/To 접근 방식을 변경했습니다. (배열은 지금 정의 된 것으로 가정했습니다.) 크기를 언급 할 때마다 다른 크기가 그에 따라 달라집니다.
IG : Companies_Array (1) 알라딘 카펫 및 Products_Array (1)입니다 매직 카펫이 될 것

0

워드 문서 항목이 진정으로 단락 구분되는 경우에, 당신은 그것을 통해 당신의 배열 한 후 루프를 채우기 위해 Split 방법을 사용할 수 있습니다 데이터를 조작합니다. 예를 들어, 이것은 단지 배열을 채우고 직접 실행 창에 요소 인쇄 :

Public Sub ParseCompanies() 
    Dim wordList() As String 
    Dim i As Long 
    Dim oWord As Word.Application 
    Dim oDoc As Word.Document 

    Set oWord = CreateObject("Word.Application") 
    Set oDoc = oWord.Documents.Open("C:\Users\test\Desktop\Company.docx", Visible:=False) 

    wordList = Split(oDoc.Content.Text, vbCr) 'split using carriage return (paragraphs) 

    For i = 0 To UBound(wordList, 1) 
     Debug.Print wordList(i) 
    Next i 

    oWord.Quit 
End Sub 

나는 큰 파일에이 방법의 성능을 말할 수 없다, 그래서 검사를 요구할 수있다이 고려되기 전에를 실행 가능한 옵션.