2016-10-21 1 views
1

Word VBA에서 코드를 자동으로 저장하고 텍스트가 아닌 텍스트로 된 문서의 이름을 문서로 지정하려고합니다. 다행히 형식화가 표준화되어 있으며 저장 방법을 이미 알고 있습니다. 다른 곳에서 정규식을 테스트하여 내가 찾고있는 것을 끌어낼 수 있는지 확인했습니다. 문제는 일치 된 문을 추출하여 문자열로 변환하고 개체에 저장해야하기 때문에 (문서의 이름을 지정하는 코드에 전달할 항목이 있으므로)VBA 정규식을 사용하여 텍스트를 추출한 다음 문자열로 변수에 저장합니다.

내가 일치 할 필요는 문서의 일부는 라인의 끝을 통해 "프로그램"의 시작부터, 아래이며, 다음과 같습니다

프로그램 : 프로그램 이름 (ABR)

내가 이것을 위해 일한 정규식은 "프로그램 : [^ \ n]"

코드는 내가 지금까지 가지고 있지만, 활성 문서에서 정규식을 실행하는 방법을 모르겠다 변환 문자열로 출력하고 객체에 저장합니다.

Sub RegExProgram() 

Dim regEx 
Dim pattern As String 

Set regEx = CreateObject("VBScript.RegExp") 
regEx.IgnoreCase = True 
regEx.Global = False 
regEx.pattern = "Program\:[^\n]" 

(missing code here) 

End Sub 

어떤 아이디어라도 환영하며, 이것이 간단하다면 나는 유감스럽게 생각합니다. 이것은 내 첫 번째 VBA 프로젝트이며 찾을 수있는 대부분의 리소스는 추출 된 텍스트를 문자열로 저장하지 않고 정규 표현식을 사용하여 대체하는 것이 좋습니다. 고맙습니다!

+0

, 그것을 해결하지 않았다 내 가장 큰 문제는 ... 나는 텍스트를 대체하고 싶지 않아, 나는 그것을 추출하고 문자열로 개체에 저장 싶습니다. 또한 셀 또는 워크 시트 내에서 작업하는 데 Excel을 사용하지 않고 있으므로 regEx.test() 또는 regEx.Execute()를 사용할 때 Word를 사용하므로 참조 할 위치를 알 수 없습니다. – schradera

+0

문자열에있는 "프로그램 이름 (abr)"부분이 문서에 따라 다른 내용이 될 것이라고 가정합니다. –

+0

@Pat_Jones 예, 다를 것입니다. 위의 정규식을 예제 문서와 온라인 정규식 검사기를 사용하여 테스트 한 결과 작동하는 것 같습니다. "프로그램 : ..."에서 줄 끝까지 모든 것을 포착합니다. – schradera

답변

3

이 시도 : 당신은 RegExp 클래스 here에 대한 설명서를 찾을 수 있습니다

.

Dim regEx as Object 
Dim matchCollection As Object 
Dim extractedString As String 

Set regEx = CreateObject("VBScript.RegExp") 
With regEx 
    .IgnoreCase = True 
    .Global = False ' Only look for 1 match; False is actually the default. 
    .Pattern = "Program: ([^\r]+)" ' Word separates lines with CR (\r) 
End With 

' Pass the text of your document as the text to search through to regEx.Execute(). 
' For a quick test of this statement, pass "Program: Program Name (abr)" 
set matchCollection = regEx.Execute(ActiveDocument.Content.Text) 

' Extract the first submatch's (capture group's) value - 
' e.g., "Program Name (abr)" - and assign it to variable extractedString. 
extractedString = matchCollection(0).SubMatches(0) 
  • 난 당신이 행의 끝을 통해Program: 후 모든 을 캡처 할 가정을 기준으로 정규식을 수정 한; 귀하의 원래 정규식은 Program:<space>을 캡처했을 것입니다.

    • [^\r]+ (모든 문자를. 줄의 끝을 통해) 묶는 (...)에서 무엇 전체 패턴에서 관심의 문자열을 선택적으로 추출 할 수 있습니다 (캡처 그룹 일명) 소위 표현식를 정의 캡처.
  • .Execute() 방법은, 어떤 당신은 항상 일치하는 수집 (Match 객체)를 반환에서 검색 할 문자열을 전달합니다.
    코드에서 .Global 속성이 False으로 설정되었으므로이 경우 출력 컬렉션은 (최대로) 항목 (색인에서 0)을 갖습니다.

  • 정규 표현식은 (우리의 경우 1) 표현식을 가지고있는 경우 경기 콜렉션의 각 항목은 각 부분 식에 대해 하나 개의 항목이있는 비어 있지 않은 .SubMatches 수집을 가지고 있지만, .SubMatches 항목이 문자열이 있습니다 , 아니 Match 개체.

  • Match objects 속성 .FirstIndex, .LengthValue (캡처 된 문자열)이있다. .Value 속성은 기본값 인 속성이기 때문에 .Value 속성을 참조하지 않고 개체 자체에 액세스하면 충분합니다 (예 : 캡처 된 문자열에 전체적으로 액세스하려면 matchCollection(0).Value을 자세히 표시하는 대신) 바로 가기를 사용할 수 있습니다 "프로그램". matchCollection(0) 방금로 시작하는 문자열을 찾고 있다면

+1

이것은 내가 찾고있는 것과 정확히 같습니다. 월요일 아침에 그것을 시도하기 위해 기다릴 수 없어. 고마워요 @ mklement0 – schradera

+0

정확히 내가 뭘 필요하지만, 하나의 문제를 찾는 중 ... 그것은 라인 (또는 다른 라인이나 캐리지 리턴)의 끝에 멈추지 않습니다. 출력을 두 번 확인하기 위해 추출 된 변수를 메시지 상자에 붙여 넣었습니다. 테스터에서 테스트했기 때문에 regEx가 옳다는 것을 알고 있습니다. 어떤 아이디어? 나는 이스케이프 캐릭터가 바른 길과 모든 것을 통과하게 만들었다. 나는 당신이 내가 사용하고있는 것을 볼 수 있도록 복사 및 붙여 넣기를하고 있습니다. .pattern = "Program : ([^ \ n] +)" – schradera

+0

죄송합니다! 그것들은 캐리지 리턴이며 \ n이 아니라 \ n 필요합니다. 그러나 당신의 코드는 완벽했기 때문에 그것이 작동하지 않는 실수였습니다. 감사! – schradera

1

(다시 대조적으로, .SubMatches 항목 문자열은 있습니다) 및 라인의 끝에서에 가고 싶다 정규 표현식이 필요하지 않습니다.

Public Sub ReadDocument() 

Dim aLine As Paragraph 
Dim aLineText As String 

Dim start As Long 

For Each aLine In ActiveDocument.Paragraphs 

    aLineText = aLine.Range.Text 
    start = InStr(aLineText, "Program:") 

    If start > 0 Then 
     my_str = Mid(aLineText, start) 
    End If 

Next aLine 

End Sub 

이 코드는 일치하는 행이 발견되면 문서를 한 행씩 읽고 "my_str"변수에 일치 항목을 저장합니다.

+0

이 간단한 경우에'RegExp' 객체를 _need_하지 않아도되지만, 필요할 때 더 강력한 일치를 제공한다는 점을 감안할 때 왜 사용하지 않을까요? 은 더 짧은 코드를 생성합니다. VBA 코드를 루프 할 필요가 없습니까? – mklement0

+1

모든 것이 사실이라면 원하는대로 OP를 다른 옵션으로 제공하십시오. 그게 전부입니다. –

+0

흥미 롭습니다. 마침내 정규 표현식을 배우게되어 흥분을 감추지 못하고 잠시 나마 목록에 올랐지 만 나는 다른 관점에서도 사물을 볼 수있는 것을 좋아합니다. 고마워요 @PatJones – schradera

1

Lazier 버전 : 만약 내가 올바르게 기억

a = Split(ActiveDocument.Range.Text, "Program:") 
If UBound(a) > 0 Then 
    extractedString = Trim(Split(a(1), vbCr)(0)) 
End If 

가 Word에서 단락 vbCr로 끝 (\r하지 \n)이 정규 표현식을 만드는 방법의 좋은 설명을 동안