2015-01-28 1 views
2

두 권의 책 (Roman 's Writing Word Macros, Mansfield의 MS Office 용 VBA 마스터 링)을 통해 작업하고 있습니다. 작업 환경에서 Word 2007과 Word 2010을 모두 사용합니다.숫자와 단어 앞의 단어를 계층 구조 머리글

제 문제는 번호가 매겨진 계층 적 머리글에서 영어 문자열 앞에 VBA를 사용하여 매우 짧은 양의 표준화 된 텍스트를 삽입하고 싶습니다. 예를 들어, 내가 가지고있는 것 :

1.1.1 The Quick Brown Fox.

는 내가 원하는 것은 :

1.1.1 (XXXX) 빠른 갈색 여우.

내 가장 기본적인 문제는 내가 상황에 접근하는 방법을 모른다는 것입니다. 나는 계층 적 표목을 가지고 있지만 실제로 "레벨에 관계없이 각 계층 구조 표제로 이동하십시오. 표제의 첫 번째 영어 단어 앞에 자신을 삽입하십시오."XXxx "텍스트를 앞에 붙여 넣으십시오. 표제의 첫 단어. 다음 표제와 나머지 표제로 이동하여 동일한 작업을 수행하십시오. 내 문서는 700 페이지가 넘고 계층 적 표제는 수백 개 있습니다.

단락은 객체이고 그 계층 구조 표제는 다음과 같습니다. 하지만 VBA가 내가 말하고자하는 것을 인식 할 수있는 방법이 전혀 없습니다 .Select 접근법을 성공적으로 사용할 수 없었습니다 .Level 접근법을 사용해 보았지만 지금까지는 표현할 수 없었습니다. VBA 코드를 지능적으로 제공합니다. 모든 항목과 계층 적 제목만을 포함하는 범위를 지정할 수 없었습니다. 특히 삽입물을 가져 오는 방법을 이해하지 못합니다. 이 제목의 첫 번째 영어 단어 앞에서 일어난다.

나는 방금 북마크를 사용하여 보았다. 그러나 북마크하지 않으면 모든 제목으로 이동하여 입력해야합니까? 그럴 경우 내 콘텐츠를 붙여 넣을 수도 있습니다. 나는 혼란 스럽다. 이 부분이 단순한 문제인 것처럼 보이지 않는 것은 흥미로운 일입니다.

+0

각 머리글에서 찾기 및 바꾸기가있을 수 있습니다. – Chrismas007

+0

시도한 코드 중 일부를 추가하는 것이 좋습니다. 아마 당신의 문제에 더 많은 관심을 가지게 될 것입니다. – Chrismas007

+0

감사합니다. Chrismas007. 현재까지 작성한 코딩 시도는 완전히 실패했습니다. Selection을 사용하고 Marco 레코더를 시작점으로 사용하려고 시도한 몇 가지 접근 방법을 시도했습니다. 매크로 레코더 코드가 너무 짧아 매크로 코드를 모든 제목으로 "일반화"하는 방법을 알지 못했습니다. 어떤 경우에도 작동하지 않았습니다. 나는 계속 노력할 것이고 나의 접근법을 보여주기위한 코드를 게시 할 것이다. 나는 당신의 제안에 감사드립니다. 나는 내가 아는 한 "발견"할 것이 없기 때문에 "찾기와 바꾸기"가 어떻게 도움이 될지 모른다. 삽입 지점으로 이동하여 텍스트를 붙여 넣어야합니다. –

답변

0

Word의 개요 수준을 사용한다고 가정하면 (계층 적 머리글 의미라고 생각합니다) 이 상태에 대한 단락.

Sub PrintHeadings() 
Dim objDoc as Document 
Dim objPara as Paragraph 
Set objDoc = ActiveDocument 
For each objPara in objDoc.Content.Paragraphs 
    If objPara.OutlineLevel <> wdOutlineLevelBodyText then 
     Debug.Print objPara.Range.Text 
    End If 
Next objPara 
End Sub 

이 코드는 VBA 직접 실행 창에 본문 텍스트 위의 개요 수준이있는 단락의 내용을 인쇄 할 예를 들어, 나는 제목 1 스타일이 적용되었습니다 내 문서의 단락을 가정하면 . 다른 접근법들도있다. 찾기 및 바꾸기를 사용하여 각각의 윤곽선 레벨을 검색 할 수 있습니다. 이렇게하면 약간의 제어가 가능해집니다. 당신은 당신의 변화가 단어 찾기와 바꾸기에서 캡슐화 될 수있는 어떤 것이되기를 원할 것입니다. 그러나 긴 문서가 있고 너무 많은 제목 수준이 없다면 더 빠를 것입니다. 기본적인 예 :

Sub UnderlineHeadings() 
Dim objDoc as Document 
Set objDoc = ActiveDocument 
With objDoc.Content.Find 
    .ClearFormatting 
    .ParagraphFormat.OutlineLevel = wdOutlineLevel1 
    With .Replacement 
     .ClearFormatting 
     .Font.Underline = wdUnderlineSingle 
    End With 
    .Execute Forward:=True, Wrap:=wdFindContinue, Format:=True, Replace:=wdReplaceAll 
End With 
End Sub 

개요 수준 1.

당신의 모든 텍스트를 강조 할 아마도 그건 당신이 시작하는 것입니다.

+0

크리스티나 감사합니다. 맞습니다 - 제 질문은 Word의 개요 레벨에 적용됩니다 (나는 그것들을 계층 적 표제라고 부름). 나는 당신의 제안 된 접근법을 곧 시도 할 것입니다. 코딩 접근 방식이 적절한 지에 대한 통찰력을 제공해 주셔서 감사합니다. 내 결과를 알려 드리겠습니다. 진심으로 감사드립니다. –

0

몇 달 전에이 질문을했습니다 : "내 문제는 번호가 매겨진 계층 적 제목의 영어 문자열 앞에 VBA를 사용하여 매우 짧은 양의 표준화 된 텍스트를 삽입하려고합니다." "번호가 매겨진 계층 적 제목"은 단어 다중 레벨 목록을 의미했습니다. 내가받은 답변은 높이 평가되었지만 제 질문에 효과적으로 응답하지 않았거나 해결책을 찾지 못했습니다.나는 이것을 다른 사람들이 쓸모가있을 것이라는 희망으로 따라 가게한다.

첫째, 단어 제목의 "숫자"부분은 부적합합니다. 코드를 작성할 때 제목의 "숫자"부분과 "텍스트"부분을 생각할 필요가 없습니다. 나는 삽입하려고하는 텍스트가 영어 텍스트보다 다단계 번호 매기기보다 먼저 삽입 될까봐 두려웠다. 다단계 번호 매기기는 자동으로 무시됩니다. 아래는 두 가지 솔루션입니다.

이 첫 번째 매크로는 원하는 결과를 생성하는 데 성공했습니다. 1.1.1 (FOUO). 이 매크로를 사용하여 각 제목 순서에 대한 개별 매크로를 만들었습니다. 나는 그들을 모두 하나의 매크로로 결합하는 법을 배웠다. 그러나 그들은 개별적으로 작업합니다 (복잡한 단락이 많은 670 페이지 문서의 경우 5 ~ 10 분이 소요될 수 있습니다.).

Public Sub InsertFOUOH1() 
Dim doc As Document 
Dim para As Paragraph 
Dim paraNext As Paragraph 
Dim MyText As String 
Dim H1 As HeadingStyle 

Set doc = ActiveDocument 
Set para = doc.Paragraphs.First 

Do While Not para Is Nothing 
Set paraNext = para.Next 
MyText = "(U//FOUO) " 
If para.Style = doc.Styles(wdStyleHeading1) Then 
para.Range.InsertBefore (MyText) 
End If 
Set para = paraNext 
Loop 
End Sub 

이것은 내가 모든 신체 단락 표시 내 보안을 추가하려면 아래 매크로를 사용

ALL FIRST ORDER 제목 (1, 2, 3 등)에서 작동 :

Public Sub InsertFOUObody() 
'Inserts U//FOUO before all body paragraphs 
Dim doc As Document 
Dim para As Paragraph 
Dim paraNext As Paragraph 
Dim MyText As String 
Set doc = ActiveDocument 
Set para = doc.Paragraphs.First 
Do While Not para Is Nothing 
Set paraNext = para.Next 
MyText = "(U//FOUO) " 
If para.Style = doc.Styles(wdStyleBodyText) Then 
para.Range.InsertBefore (MyText) 
End If 
Set para = paraNext 
Loop 
End Sub 

이 매크로를 는 느리게 실행되고 결국에는 스택 공간 부족 오류 28을 생성합니다. 그러나 오류는 매크로 실행 마지막과 매크로가 작업을 성공적으로 수행 한 후에 표시됩니다.