Word макрос for i 1 to

QUESTION: I would like to know how to create a loop to find/select a range of data and apply a character style. Each range is identifiable by a start and end tag.
For example: aCS1a the text between these aCS1a and zCS1z tags is formatted with a Character Style named cs1 that already exists in the Word document zCS1z

The process so far:
(1) A database exports a text file with «tags» that are used to identify formatting for paragraph styles and character styles.
(2) A macro in Microsoft Word formats each paragraph with a specific Paragraph style.

Help required please:
(3) Next I want to select each instance of aCS1aThe text to be formatted goes herezCS1z and apply the Character style with name «cs1» to the text between the aCS1a and zCS1z tags.

For example:
Candidates presented by the aCS1aDean of the Krusty Clown SchoolzCS1z, aCS2aProfessor Homer SimpsonzCS2z, aCS1aBSc(Hons)zCS1z aCS2aSpringfieldzCS2z, aCS1aPhDzCS1z aCS2aShelbyvillezCS2z.

Sorry I had to change the «tags» to aCS1a and zCS1z because angle brackets enclosing the tag got mangled in the preview.

Where:
cs1 = a specific Character Style in the Microsoft Word document and cs2 = a different Character Style in the Microsoft Word document

The loop in the macro can remove the aCS1a zCS1z, aCS2a zCS2z «tags» as they are formatted with the appropriate Character Style or I can record a Find/Replace macro to remove the tags as the final step of the processing.

  • Remove From My Forums
  • Question

  • What do I need to put before and after the code of the Macro I’d created, for running the Macro again and again all over the Document?

Answers

    • Marked as answer by

      Monday, December 3, 2012 4:57 AM

  • You don’t need a loop for either of those purposes.

    I didn’t understand you.

    Suppose, for example, I
    want to write ‘OK’ after every three
    words in the document.
    I’m recording a Macro: Ctrl
    +
    > three times and
    writes OK. (Or I write
    OK
    and three times Ctrl +
    >)
    Do I not need to do a loop?

    For that, you don’t need either a macro or a loop. A wildcard Find/Replace will do the job, where:
    Find = (<*>[ .,]{1,}<*>[ .,]{1,}<*>)([ .,]{1,})
    Replace = 1 OK2
    You could record the same as a macro and the resulting macro likewise wouldn’t contain a loop.


    Cheers
    Paul Edstein
    [MS MVP — Word]

    • Marked as answer by
      Quist Zhang
      Monday, December 3, 2012 4:57 AM

After some digging around, I’ve found a way to save myself hours of running separate find and replace routines using wildcards in Microsoft Word.

The routines I commonly use already save me time, but now I’ve got one macro that runs them all at once — currently 110 of them that are just for replacing an ordinary space with a non-breaking space!

I didn’t write the macro — that honor goes to Microsoft Word MVPs Graham Mayor who wrote the initial macro, and Doug Robbins who helped me tweak it to do what I wanted it to do. Details are here: http://answers.microsoft.com/en-us/office/forum/office_2003-word/macro-for-performing-more-than-one-find-and/bd931bf7-5ebe-4650-924c-d15c9512129c?page=1

NOTE: EditTools software (http://wordsnsync.com/edittools.php) has a neat interface for setting up your wildcard find and replace routines, along with a facility to set up a script to run them all, and I use that on my own PC. However, I’m not allowed to install that software on my work PC (long story…), so I wanted to figure out a way to emulate what an EditTools script does by creating a macro to achieve the same end.

UPDATE: PerfectIt software (v3 onwards; http://intelligentediting.com) can be customized to include wildcard find/replace routines too, without you having to know anything about macros.

Before doing these steps, you need to be familiar with:

  • accessing the VBA area of Word
  • using wildcards to find and replace in Word.

I won’t cover either of those things in this post.

Step 1: Create a table of your wildcard find/replace routines

The first stage in getting this to work is to create a 2-column table in Word, listing what you want to find in the left column and what you want to replace it with in the right column. Use one row for each find/replace routine. Use the same syntax as you would for a wildcard find/replace.

This table will take a while to set up. You should test each wildcard find/replace routine on a document BEFORE you add it to the list, just to make sure it works correctly and doesn’t mess up anything else. These find/replace routines will all be done as ‘replace all’, so you will NOT have the opportunity to accept some and reject others. Testing is crucial to make sure you don’t replace something you shouldn’t.

In the example below, I’ve set up routines for replacing a standard space between a number and a month of the year with a non-breaking space (^s) between those two elements, as well as replacing a standard space between a number and a unit of measure (e.g. lux, nm) or a word that often follows a number in the documents I work on (e.g. fish, indiv [for ‘individual’ or ‘individuals’). As I said, I have some 110 of these…

widlcard_fr_macro01

Once you’ve created your table, save it to a location that your macro can pick it up from easily — I suggest somewhere on your local drive, not a network location (unless you intend sharing it with others). I put mine in my Word > STARTUP folder, which is where I keep my macros.dotm file.

Step 2: Set up the macro to work with the table

Add the macro below to an existing document, or better, an existing template, or even better, a central macros template that loads whenever you open Word.

Once you’ve added it, change the line that starts with sFname and has the file path — that path points to MY file on MY computer. You need to change it to YOUR file name and YOUR file path.

NOTE: Copy all the code below to the clipboard — it goes off the page, so don’t type it out as you’ll miss some of it or could make a typo.

Sub ReplaceFromTableList()
' from Doug Robbins, Word MVP, Microsoft forums, Feb 2015, based on another macro written by Graham Mayor, Aug 2010
 Dim oChanges As Document, oDoc As Document
 Dim oTable As Table
 Dim oRng As Range
 Dim rFindText As Range, rReplacement As Range
 Dim i As Long
 Dim sFname As String
 'Change the path in the line below to reflect the name and path of the table document
 sFname = "C:UsersrhondaAppDataRoamingMicrosoftWordSTARTUPfind_and_replace_routines_macro.docx"
 Set oDoc = ActiveDocument
 Set oChanges = Documents.Open(FileName:=sFname, Visible:=False)
 Set oTable = oChanges.Tables(1)
 For i = 1 To oTable.Rows.Count
     Set oRng = oDoc.Range
     Set rFindText = oTable.Cell(i, 1).Range
     rFindText.End = rFindText.End - 1
     Set rReplacement = oTable.Cell(i, 2).Range
     rReplacement.End = rReplacement.End - 1
     Selection.HomeKey wdStory
     With oRng.Find
             .ClearFormatting
             .Replacement.ClearFormatting
             .MatchWildcards = True
             .Text = rFindText.Text
             .Replacement.Text = rReplacement.Text
             .Forward = True
             .Wrap = wdFindContinue
             .Execute Replace:=wdReplaceAll
       End With
 Next i
 oChanges.Close wdDoNotSaveChanges
End Sub

Step 3: Test that it works

After setting up the macro, run it on a test document — copy an existing document and test on the copy to make sure you don’t mess up anything.

As my file had 110 find/replace routines for changing some normal spaces to non-breaking spaces, I needed to test it on a document that had many normal spaces for the elements I wanted to change to non-breaking spaces. I opened a copy of an existing 400p Word document, used Word’s normal find/replace to replace all existing non-breaking spaces with a normal space (some 3000 of them in that document I tested it on!). Then I ran the ReplaceFromTableList macro to see if it worked.

It did. Beautifully. And it took about 3 minutes to run ALL those routines on that 400p document. The end result was a document that had more than 5000 non-breaking spaces added to it (I checked the number by taking them all out again and replacing them with normal spaces!).

One 400p Word document, 110 separate find/replace routines. In 3 minutes. In one macro.

That’s gotta be a win for automating tedious, routine tasks! Now, to think about what other find/replace routines I can add to the table…

[Links last checked March 2015]

Old

12-22-2015, 11:09 AM

NDeane
NDeane is offline

VB for Word - Need macro to loop each line in a document Windows 7 64bit VB for Word - Need macro to loop each line in a document Office 2013

Novice

VB for Word - Need macro to loop each line in a document

 

Join Date: Dec 2015

Posts: 2

NDeane is on a distinguished road

Default

VB for Word — Need macro to loop each line in a document


Hi All —

I am VERY new to macros in Word. I have written the following macro for Word that will remove line numbers from the start of each line (1 line per paragraph). These line numbers are automatically created in an EDI software that I pull data from and they need to be removed. The macro is removing everything in the line up to the second word (EDI segment). Instead of changing the counter (value currently set at 80) I would like for the macro to run through the entire document. Some of the EDI files that I pull will have +7000 lines and it will get tiresome to have to change this value each time. The rest of the macro is just removing all of the CR so that the data can be shown as a stream. Trust me, I wish everyone used an EDI viewer because this wouldn’t be as much of a pain. Please let me know if you have any thoughts.

‘ EDI fix Macro

Dim i As Long
i = 1
Do Until i > 80
Selection.MoveRight Unit:=wdWord, Count:=2, Extend:=wdExtend
Selection.Delete Unit:=wdCharacter, Count:=1
Selection.MoveDown Unit:=wdLine, Count:=1
i = i + 1
Loop

Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = «^p»
.Replacement.Text = «»
.Forward = True
.wrap = wdFindContinue
.Format = False

.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Reply With Quote

Old

12-22-2015, 02:29 PM

gmaxey
gmaxey is offline

VB for Word - Need macro to loop each line in a document Windows 7 32bit VB for Word - Need macro to loop each line in a document Office 2010 (Version 14.0)

Word MVP 2003-2009

 

Join Date: May 2010

Location: Brasstown, NC

Posts: 1,250

gmaxey is a jewel in the roughgmaxey is a jewel in the roughgmaxey is a jewel in the roughgmaxey is a jewel in the rough

Default


Code:

Sub ScratchMacro()
'A basic Word macro coded by Greg Maxey
Dim oPar As Paragraph
Dim oRng As Range
  For Each oPar In ActiveDocument.Paragraphs
    If IsNumeric(oPar.Range.Characters(1)) Then
      Set oRng = oPar.Range
      oRng.Collapse wdCollapseStart
      oRng.MoveEndUntil "S", wdForward
      oRng.Delete
    End If
  Next
  Set oRng = ActiveDocument.Range
  oRng.Text = Replace(oRng.Text, vbCr, "")
lbl_Exit:
  Exit Sub
End Sub

Reply With Quote

Old

12-22-2015, 02:49 PM

NDeane
NDeane is offline

VB for Word - Need macro to loop each line in a document Windows 7 64bit VB for Word - Need macro to loop each line in a document Office 2013

Novice

VB for Word - Need macro to loop each line in a document

 

Join Date: Dec 2015

Posts: 2

NDeane is on a distinguished road

Default


Thank you. This is doing the overall job that I am requesting but it is removing some lines completely and others it is removing too many characters from the start of the line. Here is a deidentified example:

1. ISA*00* *00**AA*123456789*AA*123456789*123456*1111*^*98765*1234567*0*P*:
2. GS*LV*123789456*123987546*20151222*1122*1*X*005010 X221A1
3. ST*835*123456789

There could be thousands of lines like this with 2 or three character segment headers.
The end result with the streaming would be this:

ISA*00* *00* *AA*123456789 *AA*123456789 *123456*1111*^*98765*1234567*0*P*: GS*LV*123789456*123987546*20151222*1122*1*X*005010 X221A1 ST*835*123456789
Due to text/word limitations the GS looks like it is on a new line but there is no CR.

After running your macro this is what I get:

SA*00* *00* *AA*123456789 *AA*123456789 *123456*1111*^*98765*1234567*0*P*: S*LV*123789456*123987546*20151222*1122*1*X*005010X 221A1 ST*835*123456789

The beginning of the segment headers is getting removed.

Please let me know if you need any additional information.

Reply With Quote

Old

12-22-2015, 04:46 PM

Default


You could do the lot without a macro, using a wildcard Find/Replace, where:
Find = ^13[0-9]{1,}.^32
Replace = ^p
At most, you might need to insert an empty paragraph at the start of the document.

__________________
Cheers,
Paul Edstein
[Fmr MS MVP — Word]

Reply With Quote

Old

12-22-2015, 06:00 PM

gmaxey
gmaxey is offline

VB for Word - Need macro to loop each line in a document Windows 7 32bit VB for Word - Need macro to loop each line in a document Office 2010 (Version 14.0)

Word MVP 2003-2009

 

Join Date: May 2010

Location: Brasstown, NC

Posts: 1,250

gmaxey is a jewel in the roughgmaxey is a jewel in the roughgmaxey is a jewel in the roughgmaxey is a jewel in the rough

Default


Paul is right, however I thought the numbers in each paragraph was followed by the word «Segment»

This should work:

Code:

Sub ScratchMacro()
'A basic Word macro coded by Greg Maxey
Dim oPar As Paragraph
Dim oRng As Range
  For Each oPar In ActiveDocument.Paragraphs
    If IsNumeric(oPar.Range.Characters(1)) Then
      Set oRng = oPar.Range
      oRng.Collapse wdCollapseStart
      oRng.MoveEndUntil ".", wdForward
      oRng.MoveEnd wdCharacter, 2
      oRng.Delete
    End If
  Next
  Set oRng = ActiveDocument.Range
  oRng.Text = Replace(oRng.Text, vbCr, "")
lbl_Exit:
  Exit Sub
End Sub

Reply With Quote

Old

12-22-2015, 08:12 PM

Default


The macro equivalent of the wildcard Find/Replace is:

Code:

Sub Demo()
Application.ScreenUpdating = False
With ActiveDocument.Range
  .InsertBefore vbCr
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "^13[0-9]{1,}.^32"
    .Replacement.Text = "^p"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchWildcards = True
    .Execute Replace:=wdReplaceAll
  End With
  While .Characters.First = vbCr
    .Characters.First.Delete
  Wend
End With
Application.ScreenUpdating = True
End Sub

It’s unclear whether you intend to retain a paragraph break between the segments. If not, delete the ^p from the code. Likewise, it’s unclear whether you want to remove the space following the number. If not, delete the ^32.

__________________
Cheers,
Paul Edstein
[Fmr MS MVP — Word]

Reply With Quote

 

glasnuk

Пользователь

Сообщений: 4
Регистрация: 18.12.2018

Необходимо заменить по тексту в Word позиции с «(1)» на «поз. 1» при чем позиций 72. В ручную очень долго.
Подскажите пожалуйста решение через макрос.

Изменено: glasnuk18.12.2018 10:29:48

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

Word снабжен очень мощным инструментом поиска и замены. Нажмите CTRL+H и меняете что надо,  на то что нужно.

По вопросам из тем форума, личку не читаю.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

glasnuk, если не хотите обращаться на профильный форум, то хоть файл-пример приложите.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

glasnuk

Пользователь

Сообщений: 4
Регистрация: 18.12.2018

Через мощный инструмент замены очень долго получается.
Меня интересует можно ли прописать таком образом что:

Найти: «(

все значения

Заменить: «поз.

все значения

«

Можно ли через CTRL+H както представить информацию?
Или нужно применять макрос?

Я не очень понимаю, какие примеры мне нужно приложить.

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#5

18.12.2018 10:46:34

Цитата
glasnuk написал: Я не очень понимаю, какие примеры мне нужно приложить

Форум здесь бессилен.

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

glasnuk

Пользователь

Сообщений: 4
Регистрация: 18.12.2018

#6

18.12.2018 11:08:20

Так может кто то дать объяснения?

Код
' Макрос1 Макрос
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(34)"
        .Replacement.Text = "поз. 34"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Где ставить +1 и цикл ограничением до 100?

Изменено: glasnuk18.12.2018 11:11:43

 

JayBhagavan

Пользователь

Сообщений: 11833
Регистрация: 17.01.2014

ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64

#7

18.12.2018 11:12:04

Код
for i = 1 to 100
   Selection.Find.ClearFormatting
   Selection.Find.Replacement.ClearFormatting
   With Selection.Find
       .Text = "(" & i & ")"
       .Replacement.Text = "поз. " & i
       .Forward = True
       .Wrap = wdFindContinue
       .Format = False
       .MatchCase = False
       .MatchWholeWord = False
       .MatchWildcards = False
       .MatchSoundsLike = False
       .MatchAllWordForms = False
   End With
   Selection.Find.Execute Replace:=wdReplaceAll
next

<#0>
Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori

 

glasnuk

Пользователь

Сообщений: 4
Регистрация: 18.12.2018

Большое спасибо за решение

 

БМВ

Модератор

Сообщений: 21378
Регистрация: 28.12.2016

Excel 2013, 2016

#9

18.12.2018 12:49:18

ищем  — [(]([0-9]{1;2})[)]
меняем на — поз. 1

По вопросам из тем форума, личку не читаю.

Автор Monocle, 11 июля 2017, 09:22


Monocle

  • Посетитель форума
  • Сообщения: 15
  • Записан

Здравствуйте, имеется макрос:

Sub bb()
Dim i&
With ActiveDocument
    For i = .Range.End — 1 To 1 Step -1
        If .Range(i — 1, i).Font.Size = 14 Then .Range(i, i).InsertAfter «*»
    Next
End With
End Sub

В каждом слове, после каждой буквы ставится знак *.
Помогите сделать так: знак вставляется не после каждой буквы, а 2-3 раза в слове и не в каждом слове, а, например, с интервалом через 3 слова. Спасибо!



Администратор

  • Administrator
  • Сообщения: 2,253
  • Записан

С понятием «слово» не всё так просто, как может показаться на первый взгляд.
В vba-ворде есть объект «word», но сюда входят и запятые. Кроме того, могут быть сложные слова с дефисом. В этом случае для ворда это три слова: слово до дефиса, дефис и слово после дефиса.

Примерный принцип такой:

Макрос

Sub макрос()

    Dim word As Range, counter As Long
    Dim i As Long, ii As Long

        For i = ActiveDocument.Words.Count To 1 Step -4
        ‘ Сброс переменной.
        counter = 0
        ‘ Присваиваем слову имя «word», чтобы удобнее писать код.
        Set word = ActiveDocument.Words(i)
        ‘ Цикл по буквам слова.
        For ii = word.Characters.Count To 1 Step -1
            If word.Characters(ii).Font.Size = 14 Then
                word.Characters(ii).InsertAfter «*»
                counter = counter + 1
                If counter > 3 Then
                    Exit For
                End If
            End If
        Next ii
    Next i

End Sub

[свернуть]



Monocle

  • Посетитель форума
  • Сообщения: 15
  • Записан

Да, это то что нужно, спасибо большое!



Посетитель 29.10.2022

  • Посетитель форума
  • Сообщения: 34
  • Записан

Добрый день! Подскажите, а можно сделать так чтоб символ «*» вставлялся через каждое слово в середину слова?



Администратор

  • Administrator
  • Сообщения: 2,253
  • Записан

В этой теме специфическое задание. У вас тоже нужно вставлять после символа, у которого размер 14 пунктов? Создайте лучше новую тему.


  • Форум по VBA, Excel и Word

  • Word

  • Макросы в Word

  • Word VBA Макрос: вставка символов в слово с определенным интервалом

Оператор цикла for next VBA языка используется для выполнения блока операторов фиксированное количество раз, чаще всего данный цикл применяется при обработке массивов. Цикл for next является в своей сфере самым простым, тут задается начальное и конечное значение, а также, можно задать шаг счетчика.

Давайте рассмотрим общий синтаксис:

For счетчик = начало To конец [Step шаг]
Операторы
Next счетчик

Счетчик – тут мы указываем имя переменной, которая будет хранить информацию о количестве итераций (количество выполненных походов цикла).

Начало – начальное значение счетчика, является числовым выражением

Конец – конечное значение счетчика, числовое выражение, которое задает количество проходов.

Шаг – необязательный параметр, который позволяет задавать шаг выполнения. Если данный параметр отсутствует, то увеличение счетчика при каждом проходе равно единице. Использование шага актуально в том случае, если нужно методом перебора решить уравнение, так, можно задать начальное значение 1, конечное 3 и шаг в 0,2.

В самом конце цикла можно и не указывать имя переменной (счетчик), но это актуально, если используется вложенный цикл for, это позволит сделать код более читабельным.

Для примера, создайте форму с двумя текстовыми метками и одной кнопкой, в редакторе кода пропишите:

Private Sub CommandButton1_Click()
Dim i, j, a, b
    For i = 1 To 10 Step 2
        a = a & i & " "
    Next i
 
    For j = 1 To 10 Step 3
        b = b & j & " "
    Next j
    Label1.Caption = a
    Label2.Caption = b
End Sub
 
Private Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 14
    Label1.ForeColor = vbBlue
 
    Label2.Caption = ""
    Label2.FontSize = 14
    Label2.ForeColor = vbRed
 
    CommandButton1.Caption = "Значения"
End Sub

В данном примере, у нас есть два параметра цикла VBA, в каждом заданы одинаковые начальные и конечные значения, но, в первом задан шаг 2, а во втором – 3.

В параметре Шаг можно указать и отрицательное значение, в этом случае будет происходить прирост счетчика в обратном порядке, например:

Private Sub CommandButton1_Click()
Dim i, j, SummA, SummB
    For i = 1 To 10
        SummA = SummA + i
    Next
 
    For j = 10 To 1 Step -1
        SummB = SummB + j
    Next
    Label1.Caption = "Прямой порядок: " & SummA
    Label2.Caption = "Обратный порядок: " & SummB
End Sub

Тут мы вычисляем сумму чисел от 1 до 10 при прямом и обратном порядке.

Довольно часто при использовании оператора цикла for next VBA языка может возникнуть ситуация, когда при заданном условии надо прекратить перебор данных, в этом случае используется выражение Exit For, например:

Private Sub CommandButton1_Click()
Dim i, j, SummA, SummB
    For i = 1 To 100
        For j = 1 To 100
            SummA = SummA + i
        Next j
    Next i
 
    For i = 1 To 100
        For j = 1 To 100
            SummB = SummB + i
            If SummB > 10000 Then Exit For
        Next j
    Next i
 
    Label1.Caption = "Сумма без условия: " & SummA
    Label2.Caption = "Сумма с условием: " & SummB
End Sub

В данном примере используется вложенный цикл VBA for next. В первом случае происходит суммирование чисел от 1 до 100, при этом суммирование повторяется 100 раз. Во втором случае мы прописали условие с помощью условного оператора if – если сумма больше 10 тысяч, то произвести выход из цикла.

Хорошо, теперь попробуем написать более практичный пример – решение квадратного уравнения методом перебора:

Private Sub CommandButton1_Click()
Const a = -2, b = 6, c = 20
Dim x, result, res
    For x = -10 To 10 Step 0.5
     result = a * (x * x) + b * x + c
     If result = 0 Then
        res = res & " " & x
        End If
    Next x
 
    Label1.Caption = "х ровно : " & res
End Sub

В данном примере мы объявили три константы a, b и с, со значениями -2, 6 и 20, это параметры квадратного уравнения (a*x*x + b*x + c = 0). В цикле происходит изменение переменной х в диапазоне от -10 до 10 с шагом в 0,5. При каждой итерации происходит проверка условия на равенство нулю, если условие выполняется, в переменную res записывается значение переменной x. В итоге, уравнение будет иметь два решения: -2 и 5.

И так, в этой статье мы рассмотрели цикл for next языка VBA, который применяется для обработки заданного количества раз одних и тех же действий, в следующей статье мы рассмотрим цикл for each, который используется для обработки коллекций, там же мы рассмотрим и сами коллекции.

Содержание

  • VBA PDF (бесплатные загрузки)
  • Примеры Word VBA «Шпаргалка»
  • Учебное пособие по макросам Word VBA
  • Пример простого макроса Word
  • Объект документа Word
  • Документы
  • Диапазон, выделение, абзацы
  • Примеры макросов Word

Добро пожаловать в наше мега-руководство по Word VBA / макросам!

Эта страница содержит:

    1. Учебное пособие по Word VBA в формате PDF (бесплатная загрузка)
    2. Word VBA «Шпаргалка», содержащая список наиболее часто используемых фрагментов кода Word VBA.
    3. Полное руководство по Word VBA / Macro.
    4. Список всех наших руководств по макросам Word VBA с возможностью поиска

Возможно, вас заинтересует наше интерактивное руководство по VBA для Excel. Хотя некоторые из примеров / упражнений относятся к Excel VBA, большая часть содержимого является общим для всех VBA, и вам может быть полезно изучить такие концепции, как If, Loops, MessageBoxes и т. Д.

VBA PDF (бесплатные загрузки)

Загрузите наше бесплатное руководство по Microsoft Word VBA! Или учебники VBA для других программ Office!

Скачать

Ниже вы найдете простые примеры кода VBA для работы с Microsoft Word.

Выбрать / перейти к

ОписаниеКод VBABackspaceSelection.TypeBackspaceВыбрать весь документSelection.HomeKey Unit: = wdStory
Selection.ExtendКопироватьSelection.CopyУдалитьSelection.Delete Unit: = wdCharacter, Count: = 1Вставить послеSelection.InsertAfter «текст»Начало строкиSelection.HomeKey Unit: = wdLineКонец линииSelection.EndKey Unit: = wdLineВставитьSelection.PasteВыбрать всеSelection.WholeStoryВыбрать всю строкуSelection.EndKey Unit: = wdLine, Extend: = wdExtendВверх по абзацуSelection.MoveUp Unit: = wdParagraph, Count: = 1Переместить вправо на один символSelection.MoveRight Unit: = wdCharacter, Count: = 1Переместить вправо на одну ячейку в таблицеSelection.MoveRight Unit: = wdCellПерейти к началу документаSelection.HomeKey Unit: = wdStoryПерейти в конец документаSelection.EndKey Unit: = wdStoryПерейти на страницу 1Selection.GoTo What: = wdGoToPage, Which: = wdGoToNext, Name: = ”1 ″Перейти к началу страницыSelection.GoTo What: = wdGoToBookmark, Name: = ” Page”
Selection.MoveLeft Unit: = wdCharacter, Count: = 1

Return to Top

Закладки

ОписаниеКод VBAДобавлятьС ActiveDocument.Bookmarks
.Add Range: = Selection.Range, Name: = «Name».
.DefaultSorting = wdSortByName
.ShowHidden = Ложь
Конец сСчитатьDim n as Integer
n = ActiveDocument.Bookmarks.CountУдалитьActiveDocument.Bookmarks («Имя закладки»). УдалитьСуществуют?Если ActiveDocument.Bookmarks.Exists («BookmarkName») = True, то
‘Сделай что-нибудь
Конец, еслиПерейти кSelection.GoTo What: = wdGoToBookmark, Name: = ”BookmarkName”ВыбиратьActiveDocument.Bookmarks («Имя закладки»). ВыберитеЗаменить текстSelection.GoTo What: = wdGoToBookmark, Name: = ”BookmarkName”
Selection.Delete Unit: = wdCharacter, Count: = 1
Selection.InsertAfter «Новый текст»
ActiveDocument.Bookmarks.Add Range: = Selection.Range, _
Name: = ”BookmarkName”

Return to Top

Документ

ОписаниеКод VBAАктивироватьДокументы («Example.doc»). АктивироватьДобавить в переменнуюDim doc As Document
Установить doc = Documents.AddДобавлятьDocuments.AddДобавить (из другого документа)Documents.Add Template: = ”C: Forms FormDoc.doc”, _
NewTemplate: = FalseЗакрыватьДокументы («Example.doc»). ЗакрытьЗакрыть — сохранить измененияДокументы («Example.doc»). Закройте SaveChanges: = wdSaveChangesЗакрыть — не сохранятьДокументы («Example.doc»). Закройте SaveChanges: = wdDoNotSaveChanges.Закрыть — запрос на сохранениеДокументы («Example.doc»). Закройте SaveChanges: = wdPromptToSaveChanges.

Return to Top

Столбцы

ОписаниеКод VBAСохранить какДокументы («Example.doc»). SaveAs («C: Example Example.doc»)СохранитьДокументы («Example.doc»). СохранитьЗащищатьДокументы («Example.doc»). Защитить пароль: = «пароль»Снять защитуДокументы («Example.doc»). Снять пароль: = «пароль»Число страницDim varNumberPages как вариант
varNumberPages = _
ActiveDocument.Content.Information (wdActiveEndAdjustedPageNumber)РаспечататьДокументы («Example.doc»). Распечатать

Return to Top

Устали искать примеры кода VBA? Попробуйте AutoMacro!

Шрифт

ОписаниеКод VBAРазмерSelection.Font.Size = 12ЖирныйSelection.Font.Bold = TrueКурсивSelection.Font.Italic = TrueПодчеркиваниеSelection.Font.Underline = wdUnderlineSingleВсе заглавные буквыSelection.Font.AllCaps = TrueЦветSelection.Font.TextColor = vbRedИмяSelection.Font.Name = «Абади»Нижний индексSelection.Font.Subscript = TrueSuperScriptSelection.Font.Superscript = TrueЦвет выделенияSelection.Range.HighlightColorIndex = wdYellowСтильSelection.Style = ActiveDocument.Styles («Нормальный»)

Return to Top

Вставлять

ОписаниеКод VBAВставить автотекстSelection.TypeText Текст: = ”a3 ″
Selection.Range.InsertAutoTextВставить код датыВставить файлSelection.InsertFile («C: Docs Something.doc»)Вставить разрыв страницыSelection.InsertBreak Тип: = wdPageBreakВставить символ абзацаSelection.TypeText Text: = Chr $ (182)Вставить вкладкуSelection.TypeText Текст: = vbTabВставить текстSelection.TypeText Text: = «Любой текст»Вставить абзац типаSelection.TypeParagraphВставить абзацSelection.InsertParagraph

Return to Top

Петли

ОписаниеКод VBAСделать до конца документаСделать до ActiveDocument.Bookmarks (« Sel») = ActiveDocument.Bookmarks (« EndOfDoc»)
‘Сделай что-нибудь
SubДля каждого документа в ДокументахDim doc As Document
Для каждого документа в документах
‘Сделай что-нибудь
Следующий документЦикл по абзацамПодпункты через абзацы
Dim i As Long, iParCount As Long
iParCount = ActiveDocument.Paragraphs.CountFori = 1 На iParCount
ActiveDocument.Paragraphs (i) .Alignment = wdAlignParagraphLeft
Далее я

Return to Top

Пункт

ОписаниеКод VBAKeepLinesTogetherSelection.ParagraphFormat.KeepTogether = TrueKeepWithNextSelection.ParagraphFormat.KeepWithNext = ИстинаПробел послеSelection.ParagraphFormat.SpaceAfter = 12Пространство доSelection.ParagraphFormat.SpaceBefore = 0Выровнять по центруSelection.ParagraphFormat.Alignment = wdAlignParagraphCenterВыровнять по правому краюSelection.ParagraphFormat.Alignment = wdAlignParagraphRightВыровнять по левому краюSelection.ParagraphFormat.Alignment = wdAlignParagraphLeftЛевый отступSelection.ParagraphFormat.LeftIndent = InchesToPoints (3,75)Правый отступSelection.ParagraphFormat.RightIndent = InchesToPoints (1)Межстрочный интервалС Selection.ParagraphFormat
.LineSpacingRule = wdLineSpaceExactly
.LineSpacing = 12
Конец сПеребрать все абзацыПодпункты через абзацы
Dim i As Long, iParCount As Long
iParCount = ActiveDocument.Paragraphs.CountFori = 1 На iParCount
ActiveDocument.Paragraphs (i) .Alignment = wdAlignParagraphLeft
Далее я

Return to Top

Учебное пособие по макросам Word VBA

Это руководство по использованию VBA с Microsoft Word. Это руководство научит вас писать простой макрос и взаимодействовать с документами, диапазонами, выделениями и абзацами.

Примечание. Если вы новичок в Macros / VBA, вам также может быть полезна эта статья: Как писать макросы VBA с нуля.

VBA — это язык программирования, используемый для автоматизации программ Microsoft Office, включая Word, Excel, Outlook, PowerPoint и Access.

Макросы представляют собой блоки кода VBA, которые выполняют определенные задачи.

Когда ты Записать макрос, Word запишет код VBA в макрос, что позволит вам повторять ваши действия. Вы можете увидеть список всех доступных макросов из Просмотр> Макросы.

После записи макроса вы сможете редактировать макрос из списка макросов:

Когда вы нажимаете Редактировать, вы открываете Редактор VBA. Используя редактор VBA, вы можете редактировать записанные макросы или писать макрос Word с нуля. Для доступа к редактору VBA используйте ярлык ALT + F11 или щелкните Visual Basic от Лента разработчика.

Пример простого макроса Word

Это простой пример макроса Word VBA. Он выполняет следующие задачи:

  • Открывает документ Word
  • Записывает в документ
  • Закрывает и сохраняет документ Word.
123456789101112131415 Sub WordMacroExample ()’Открыть документ и назначить переменнойDim oDoc как документУстановите oDoc = Documents.Open («c: Users something NewDocument.docx»).’Написать в документSelection.TypeText «www.automateexcel.com»Selection.TypeParagraph’Сохранить и закрыть документoDoc.SaveoDoc.CloseКонец подписки

Основы работы с макросами Word

Весь код VBA должен храниться в подобных процедурах. Чтобы создать процедуру в VBA, введите «Sub WordMacroExample» (где «WordMacroExample» — желаемое имя макроса) и нажмите ВХОДИТЬ. VBA автоматически добавит круглые скобки и End Sub.

Объект документа Word

При взаимодействии с Microsoft Word в VBA вы часто будете ссылаться на Word «Объекты». Наиболее распространенные объекты:

Объект приложения — сам Microsoft Word

Объект документа — документ Word

Объект диапазона — Часть документа Word

Объект выделения — Выбранный диапазон или положение курсора.

заявка

Приложение — это объект «верхнего уровня». Через него можно получить доступ ко всем остальным объектам Word.

Помимо доступа к другим объектам Word, можно применить настройки «уровня приложения»:

1 Application.Options.AllowDragAndDrop = True

Это пример доступа к «Выборке» в «Windows (1)» в Приложении:

1 Application.Windows (1) .Selection.Characters.Count

Однако к наиболее распространенным объектам Word можно получить доступ напрямую, без ввода полной иерархии. Поэтому вместо этого вы можете (и должны) просто ввести:

1 Selection.Characters.Count

Документы

ActiveDocument

Часто у вас есть два или более документов, открытых в Word, и вам нужно указать, с каким конкретным документом Word следует взаимодействовать. Один из способов указать, какой документ использовать ActiveDocument. Например:

1 ActiveDocument.PrintOut

… Напечатал бы ActiveDocument. ActiveDocument — это документ в Word, который «имеет фокус»

Чтобы переключить ActiveDocument, используйте команду Activate:

1 Документы («Example.docx»). Активировать

Этот документ

Вместо использования ActiveDocument для ссылки на активный документ вы можете использовать ThisDocument для ссылки на документ, в котором хранится макрос. Этот документ никогда не изменится.

Переменные документа

Однако для более сложных макросов может быть сложно отслеживать активный документ. Также может быть неприятно переключаться между документами.

Вместо этого вы можете использовать переменные документа.

Этот макрос назначит ActiveDocument переменной, а затем распечатает документ, используя переменную:

12345 Sub VarExample ()Dim oDoc как документУстановите oDoc = ActiveDocumentoDoc.PrintOutКонец подписки

Документ Методы

Открыть документ

Чтобы открыть документ Word:

1 Documents.Open «c: Users SomeOne Desktop Test PM.docx»

Мы рекомендуем всегда назначать документ переменной при его открытии:

12 Dim oDoc как документУстановите oDoc = Documents.Open («c: Users SomeOne Desktop Test PM.docx»).

Создать новый документ

Чтобы создать новый документ Word:

Мы можем указать Word создать новый документ на основе некоторого шаблона:

1 Documents.Add Template: = «C: Program Files Microsoft Office Templates MyTemplate.dotx»

Как всегда, присвоение документа переменной при создании или открытии помогает избавить от серьезных проблем:

12 Dim oDoc как документУстановите oDoc = Documents.Add (Template: = «C: Program Files Microsoft Office Templates MyTemplate.dotx»)

Сохранить документ

Чтобы сохранить документ:

или Сохранить как:

1 ActiveDocument.SaveAs FileName: = c: Users SomeOne Desktop test2.docx «, FileFormat: = wdFormatDocument

Закрыть документ

Чтобы закрыть документ и сохранить изменения:

1 ActiveDocument.Close wdSaveChanges

или без сохранения изменений:

1 ActiveDocument.Close wdDoNotSaveChanges

Распечатать документ

Это напечатает активный документ:

1 ActiveDocument.PrintOut

Диапазон, выделение, абзацы

Диапазон а также Выбор являются, вероятно, наиболее важными объектами в Word VBA и, безусловно, наиболее часто используемыми.

Диапазон относится к некоторой части документа, обычно, но не обязательно, к тексту.

Выбор относится к выделенному тексту (или другому объекту, например изображениям) или, если ничего не выделено, к точке вставки.

Абзацы представляют абзацы в документе. Это менее важно, чем кажется, потому что у вас нет прямого доступа к тексту абзаца (вам нужно получить доступ к определенному диапазону абзацев, чтобы внести изменения).

Диапазон

Диапазон может быть любой частью документа, включая весь документ:

12 Dim oRange As RangeУстановите oRange = ActiveDocument.Content

или он может быть маленьким, как один символ.

Другой пример, этот диапазон будет относиться к первому слову в документе:

12 Dim oRange As RangeУстановите oRange = ActiveDocument.Range.Words (1)

Обычно вам нужно получить диапазон, который относится к определенной части документа, а затем изменить его.

В следующем примере мы выделим первое слово второго абзаца жирным шрифтом:

123 Dim oRange As RangeУстановите oRange = ActiveDocument.Paragraphs (2) .Range.Words (1)oRange.Bold = True

Установить текст диапазона

Чтобы установить текстовое значение диапазона:

123 Dim oRange As RangeУстановите oRange = ActiveDocument.Paragraphs (2) .Range.Words (1)oRange.Text = «Привет»

(Совет: обратите внимание на пробел после «Hello». Поскольку слово «объект» включает пробел после слова, просто «hello» мы получим «Hellonext word»)

С диапазонами можно делать сотни вещей. Всего несколько примеров (предполагается, что вы уже сделали объектную переменную апельсин относится к интересующему диапазону):

Изменить шрифт

1 oRange.Font.Name = «Arial»

Отображение в окне сообщения количества символов в определенном диапазоне

1 MsgBox oRange.Characters.Count

Вставьте текст перед ним

1 oRange.InsertBefore «это вставленный текст»

Добавить сноску к диапазону

12 ActiveDocument.Footnotes.Add Диапазон: = oRange, _Text: = «Подробнее читайте на easyexcel.net.»

Скопируйте в буфер обмена

1234 oRange.CopyЧасто вам нужно перейти к конкретному диапазону. Итак, вы можете начать, начать и закончитьoRange.Start = 5oRange.End = 50

После приведенного выше кода oRange будет относиться к тексту, начинающемуся с пятого и заканчивающемуся 50-м символом в документе.

Выбор

Выбор используется даже шире, чем Диапазон, потому что с ним легче работать Выборы чем Диапазоны, ЕСЛИ ваш макрос взаимодействует ТОЛЬКО с ActiveDocument.

Сначала выберите желаемую часть вашего документа. Например, выберите второй абзац в активном документе:

1 ActiveDocument.Paragraphs (2) .Range.Select

Затем вы можете использовать объект выбора для ввода текста:

1 Selection.TypeText «Какой-то текст»

Мы можем ввести несколько абзацев ниже «Некоторый текст»:

12 Selection.TypeText «Какой-то текст»Selection.TypeParagraph

Часто необходимо знать, выделен ли какой-то текст или у нас есть только точка вставки:

12345 Если Selection.Type wdSelectionIP ТогдаSelection.Font.Bold = TrueЕщеMsgBox «Вам нужно выделить текст».Конец, если

При работе с объектом Selection мы хотим поместить точку вставки в определенное место и запускать команды, начиная с этой точки.

Начало документа:

1 Selection.HomeKey Unit: = wdStory, Extend: = wdMove

Начало текущей строки:

1 Selection.HomeKey Unit: = wdLine, Extend: = wdMove

Параметр Extend wdMove перемещает точку вставки. Вместо этого вы можете использовать wdExtend, который выделит весь текст между текущей точкой вставки.

1 Selection.HomeKey Unit: = wdLine, Extend: = wdExtend

Переместить выделение

Самый полезный метод изменения положения точки вставки — «Перемещение». Чтобы переместить выделение на два символа вперед:

1 Selection.Move Unit: = wdCharacter, Count: = 2

чтобы переместить его назад, используйте отрицательное число для параметра Count:

1 Selection.Move Unit: = wdCharacter, Count: = — 2

Параметр единицы измерения может быть wdCharacter, wdWord, wdLine или другим (используйте справку Word VBA, чтобы увидеть другие).

Чтобы вместо этого переместить слова:

1 Selection.Move unit: = wdWord, Count: = 2

С выделением легче работать (по сравнению с диапазонами), потому что он похож на робота, использующего Word, имитирующего человека. Где находится точка вставки — какое-то действие произойдет. Но это означает, что вы должны позаботиться о том, где находится точка вставки! Это непросто после многих шагов в коде. В противном случае Word изменит текст в нежелательном месте.

Если вам нужно какое-то свойство или метод, недоступный в объекте Selection, вы всегда можете легко получить диапазон, связанный с выбором:

1 Установите oRange = Selection.Range.

СОВЕТ: Использование Выбор часто проще, чем использование диапазонов, но также и медленнее (важно, когда вы имеете дело с большими документами)

Абзацы

Вы не можете напрямую использовать объект Paragraphs для изменения текста:

1 ActiveDocument.Paragraphs (1) .Text = «Нет, это не сработает»

Выше не сработает (на самом деле выдаст ошибку). Вам нужно сначала получить диапазон, связанный с конкретным абзацем:

1 ActiveDocument.Paragraphs (1) .Range.Text = «Теперь работает :)»

Но вы можете напрямую изменить его стиль:

1 ActiveDocument.Paragraphs (1) .Style = «Нормальный»

или измените форматирование на уровне абзаца:

1 ActiveDocument.Paragraphs (1) .LeftIndent = 10

или, может быть, вы хотите сохранить этот абзац на одной строке со следующим абзацем:

1 ActiveDocument.Paragraphs (1) .KeepWithNext = True

Сделайте абзац по центру:

1 ActiveDocument.Paragraphs (1) .Alignment = wdAlignParagraphCenter

ОЧЕНЬ полезно назначить конкретный абзац объектной переменной. Если мы присвоим переменной конкретный абзац, нам не нужно беспокоиться, станет ли первый абзац вторым, потому что мы вставили перед ним один абзац:

12 dim oPara как абзацУстановите oPara = Selection.Paragraphs (1) ‘здесь мы присваиваем первый абзац текущего выделения переменной

Вот пример, в котором мы вставляем абзац над первым абзацем, но мы все еще можем ссылаться на старый первый абзац, потому что он был назначен переменной:

1234567 Sub ParagraphExample ()Dim oPara как абзацУстановить oPara = ActiveDocument.Paragraphs (1)MsgBox oPara.Range.TextoPara.Range.InsertParagraphBefore ‘Вставить абзацMsgBox oPara.Range.TextКонец подписки

Объект абзаца очень часто используется в циклах:

123456789101112 Sub LoopThroughParagraphs ()Dim oPara как абзацДля каждого параметра в ActiveDocument.Paragraphs«Сделай что-нибудь с этим. Мы просто покажем’текст абзаца, если его стиль — «Заголовок 4″Если oPara.Style = «Заголовок 4», тоMsgBox oPara.Range.TextКонец, еслиДалее oParaКонец подписки

Word VBA Tutorial Заключение

В этом руководстве были рассмотрены основы Word VBA. Если вы новичок в VBA, вам также следует ознакомиться с нашим общим руководством по VBA, чтобы узнать больше о переменных, циклах, окнах сообщений, настройках, условной логике и многом другом.

Примеры макросов Word

Примеры макросов Word
Шаблоны
Добавить новые документы
Подсчет слов в выделенном фрагменте
Текстовые поля
Сохранить как PDF
Закладки
Таблицы
Найти, найти и заменить
Открытые документы

Word VBA: часто задаваемые вопросы

Что такое макрос Word?

Макрос — это общий термин, обозначающий набор инструкций по программированию, которые автоматизируют задачи. Макросы Word автоматизируют задачи в Word с помощью языка программирования VBA.

Есть ли в слове VBA?

Да, в Microsoft Word есть редактор VBA. Доступ к нему можно получить, нажав клавиши ALT + F11 или перейдя в раздел «Разработчик»> «Visual Basic».

Как использовать VBA в Word?

1. Откройте редактор VBA (ALT + F11 или Разработчик> Visual Basic).
2. Выберите «Вставить»> «Модуль», чтобы создать модуль кода.
3. Введите «Sub HelloWorld» и нажмите Enter.
4. Между строками «Sub HelloWorld» и «End Sub» введите «MsgBox« Hello World! »
5. Вы создали макрос!
6. Теперь нажмите «F5», чтобы запустить макрос.

Встречаются ситуации, когда от программы VBA требуется совершить несколько раз подряд один и тот же набор действий (то есть повторить несколько раз один и тот же блок кода). Это может быть сделано при помощи циклов VBA.

К циклам VBA относятся:

  • Цикл For
  • Цикл Do While
  • Цикл Do Until

Далее мы подробно рассмотрим каждый из этих циклов.

Содержание

  1. Оператор цикла «For» в Visual Basic
  2. Цикл «For … Next»
  3. Цикл «For Each»
  4. Оператор прерывания цикла «Exit For»
  5. Цикл «Do While» в Visual Basic
  6. Цикл «Do Until» в Visual Basic

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each.

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

For i = 1 To 10
   Total = Total + iArray(i)
Next i

В этом простом цикле For … Next используется переменная i, которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total.

В приведённом выше примере шаг приращения цикла не указан, поэтому для пошагового увеличения переменной i от 1 до 10 по умолчанию используется приращение 1. Однако, в некоторых случаях требуется использовать другие значения приращения для цикла. Это можно сделать при помощи ключевого слова Step, как показано в следующем простом примере.

For d = 0 To 10 Step 0.1
   dTotal = dTotal + d
Next d

Так как в приведённом выше примере задан шаг приращения равный 0.1, то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

For i = 10 To 1 Step -1
   iArray(i) = i
Next i

Здесь шаг приращения равен -1, поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next, но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Dim wSheet As Worksheet

For Each wSheet in Worksheets
   MsgBox "Найден лист: " & wSheet.Name
Next wSheet

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal. Если совпадение найдено, то цикл прерывается:

For i = 1 To 100
   If dValues(i) = dVal Then
      IndexVal = i
      Exit For
   End If
Next i

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub, в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

'Процедура Sub выводит числа Фибоначчи, не превышающие 1000
Sub Fibonacci()
   Dim i As Integer 'счётчик для обозначения позиции элемента в последовательности
   Dim iFib As Integer 'хранит текущее значение последовательности
   Dim iFib_Next As Integer 'хранит следующее значение последовательности
   Dim iStep As Integer 'хранит размер следующего приращения

   'инициализируем переменные i и iFib_Next
   i = 1
   iFib_Next = 0
   'цикл Do While будет выполняться до тех пор, пока значение
   'текущего числа Фибоначчи не превысит 1000

   Do While iFib_Next < 1000
      If i = 1 Then
         'особый случай для первого элемента последовательности
         iStep = 1
         iFib = 0
      Else
         'сохраняем размер следующего приращения перед тем, как перезаписать
         'текущее значение последовательности
         iStep = iFib
         iFib = iFib_Next
      End If

      'выводим текущее число Фибоначчи в столбце A активного рабочего листа
      'в строке с индексом i
      Cells(i, 1).Value = iFib
      'вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1
      iFib_Next = iFib + iStep
      i = i + 1
   Loop

End Sub

В приведённом примере условие iFib_Next < 1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do
...
Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While: блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

iRow = 1
Do Until IsEmpty(Cells(iRow, 1))
   'Значение текущей ячейки сохраняется в массиве dCellValues
   dCellValues(iRow) = Cells(iRow, 1).Value
   iRow = iRow + 1
Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until, следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

Однако, как было показано в примерах цикла Do While, в некоторых ситуациях нужно, чтобы цикл был выполнен хотя бы один раз, не зависимо от первоначального результата условного выражения. В таком случае условное выражение нужно поместить в конце цикла, вот так:

Do
...
Loop Until IsEmpty(Cells(iRow, 1))

Оцените качество статьи. Нам важно ваше мнение:

Понравилась статья? Поделить с друзьями:
  • Word макет что это
  • Word макет по умолчанию
  • Word макет параметры страницы
  • Word м?тіндік редакторына ?андай объектілер енгізуге болады
  • Word м?тіндік редакторы тест