1 (изменено: putrsa, 2021-01-21 20:39:15)

Тема: WSH, jscript поиск и замена в надписях MS Word

нижеприведенный код четко меняет заданные слова в простом тексте, а вот в текстовых полях(надписях) ни в какую, подскажите, куда копать? ворд использую 2007, поверял на 2016 тоже не работает


workpath='d:\\docGen\\';
	WordApp=new ActiveXObject("Word.Application");
	tdoc=WordApp.Documents.Add(workpath+"t_dod71.dotx");
	tdoc.Content.Find.Execute('ппппп', false, false, false, false, false, true, false, false, "ццццц", 2);

2

Re: WSH, jscript поиск и замена в надписях MS Word

Content Property

Returns a Range object that represents the main document story.

А надписи сюда не входят.

Ну, например (на VBA):

Option Explicit

Sub Sample()
    Dim objRange As Range
    
    For Each objRange In ActiveDocument.StoryRanges
        With objRange
            With .Find
                .ClearFormatting
                .Text = "привет"
                
                With .Replacement
                    .ClearFormatting
                    .Text = "мир"
                End With
            
            .Forward = True
            .Format = False
            .MatchCase = False
            
            .Wrap = wdFindContinue
            
            .Execute Replace:=wdReplaceAll
            End With
        End With
    Next objRange
End Sub

— будет искать и заменять везде.

3

Re: WSH, jscript поиск и замена в надписях MS Word

alexiiе

for(itm in tdoc.StoryRanges){
}

не срабатывает ни разу, StoryRanges возвращает пустую коллекцию, возможно через ActiveX не работает

4 (изменено: alexii, 2021-01-21 23:52:35)

Re: WSH, jscript поиск и замена в надписях MS Word

Работает:

Option Explicit

Const wdFindContinue = 1
Const wdReplaceAll = 2


Dim objWord
Dim objRange


Set objWord = WScript.CreateObject("Word.Application")

With objWord.Documents.Open("C:\Мои проекты\0334\Sample.doc")
	For Each objRange In .StoryRanges
		With objRange
			With .Find
				.ClearFormatting
				.Text = "привет"
				
				With .Replacement
					.ClearFormatting
					.Text = "мир"
				End With
				
				.Forward = True
				.Format = False
				.MatchCase = False
				
				.Wrap = wdFindContinue
				
				.Execute , , , , , , , , , , wdReplaceAll
			End With
		End With
	Next
End With

objWord.Visible = True

Set objWord = Nothing

WScript.Quit 0

Возможно, для перебора коллекции .StoryRanges надо пользовать иное:

Use the Enumerator object to iterate members of a collection.

«WScript.Echo(tdoc.StoryRanges.Count);» — что покажет?

5

Re: WSH, jscript поиск и замена в надписях MS Word

В JS делается немного по другому:


var ranges  = new Enumerator(tdoc.StoryRanges);

for ( ; !ranges.atEnd(); ranges.moveNext()) {
    var item = ranges.item();
    bla-bla-blah
}
( 2 * b ) || ! ( 2 * b )

6 (изменено: putrsa, 2021-01-22 10:27:32)

Re: WSH, jscript поиск и замена в надписях MS Word

alert(tdoc.StoryRanges.Count);

возвращает 2, значит все-таки не пустая коллекция
в коде Rumata сторесы перебирает, но замена все равно не происходит, хотя и ошибок не показывает

var ranges  = new Enumerator(tdoc.StoryRanges);
for ( ; !ranges.atEnd(); ranges.moveNext()) {
    var item = ranges.item();
    item.Find.Execute('aaaa', false, false, false, false, false, true, false, false, 'bbbb', 2);
}

сделал пока так:


        sh_count=tdoc.Shapes.Count;
		tdoc.Content.Find.Execute('aaaa', false, false, false, false, false, true, false, false, 'bbbb', 2);
		for (var i=1;i<sh_count;i++){
			tdoc.Shapes.Item(i).Select();
			tdoc.Application.Selection.Range.Find.Execute('aaaa', false, false, false, false, false, true, false, false, 'bbbb', 2);
			}

сначала меняю в тексте, а потом перебираю все фигуры, но это дико медленно

7

Re: WSH, jscript поиск и замена в надписях MS Word

putrsa, приветствую. Не уверен, но возможно это позволит ускорить замену: ссылка ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

8

Re: WSH, jscript поиск и замена в надписях MS Word

По хорошему, нужен сам документ, чтобы воспроизвести «затык» и разобраться, что не так.