Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
(ebook) Visual Studio .NET Mastering Visual Basic.pdf
Скачиваний:
120
Добавлен:
17.08.2013
Размер:
15.38 Mб
Скачать

448 Chapter 10 AUTOMATING MICROSOFT OFFICE APPLICATIONS

If you want to replace one or more instances of a word (or sentence) in the text, set the ReplaceWith argument to the replacement text and the Replace argument to one of the values wdReplaceAll or wdReplaceOne, depending on whether you want to replace a single or all instances of the text. The code segment in Listing 10.4 replaces all instances of “VB7” to “VB.NET” and removes the multiple spaces from the document.

Listing 10.4: Massaging a Word Document

Private Sub Button3_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button3.Click Dim thisDoc As Word.Document

Dim thisRange As Word.Range WordApp.Documents.Open(“c:\sample.doc”) WordApp.Visible = False

thisDoc = WordApp.ActiveDocument thisDoc.Content.Find.Execute(FindText:=”VB7”, ReplaceWith:=”VB.NET”, _

Replace:=Word.WdReplace.wdReplaceAll) While thisDoc.Content.Find.Execute(FindText:=” “, _

Wrap:=Word.WdFindWrap.wdFindContinue) thisDoc.Content.Find.Execute(FindText:=” “, ReplaceWith:=” “, _

Replace:=Word.WdReplace.wdReplaceAll, _

Wrap:=Word.WdFindWrap.wdFindContinue)

End While WordApp.Documents.Item(1).Save()

MsgBox(“Replaced all instances of ‘VB7’ with ‘VB.NET’ and saved the document”) WordApp.Documents.Item(1).Close()

End Sub

For the WordDemo application, we must specify the string to search for and the replacement string. The program searches for two consecutive spaces, and if found, replaces them with a single space. Notice that the replacement of all instances of “VB7” with “VB.NET” is carried out by a single call to the Find.Execute method. The wdReplaceAll option tells Word to replace all instances of the string throughout the document. Replacing the multiple spaces, however, is not as simple, because you may have more than two spaces in a row. The code sets up a While loop, which repeats while the Find.Execute method reports that instances of two or more consecutive spaces exist. In the loop’s body, we call the Find.Execute method, this time specifying a replacement string.

Note To test this application, create a short document with several instances of the string “VB7” and insert multiple spaces between its words. Save the document as sample.doc in the root folder of the C: drive and then run the application. You will find a simple file named sample.doc in the application’s folder on the CD.

Spell-Checking Documents

One of the most useful features of Word (and of every Office application) is its ability to spellcheck a document. This functionality is also exposed by Word’s objects, and you can borrow it for use within your Visual Basic applications. This is not only possible, it’s actually quite simple. To call

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

PROGRAMMING WORD 449

upon Word’s spell-checking routines, you need to know about two objects: the ProofreadingErrors and SpellingSuggestions collections.

The ProofreadingErrors collection is a property of the Range object and it contains the misspelled words in the Range. To ask Word to spell-check a range of text and populate the ProofreadingErrors collection, call the Range object’s SpellingErrors method. This method returns a result that must be stored in an object variable of type ProofreadingErrors:

Dim SpellCollection As ProofreadingErrors

Set SpellCollection = DRange.SpellingErrors

DRange is Range object (a paragraph or an entire document). The second line populates the SpellCollection variable with the misspelled words. You can then set up a For Each…Next loop to read the words from the collection.

Besides locating spelling errors, Word can also suggest a list of alternate spellings or words that sound like the misspelled one. To retrieve the list of alternate words, you call the GetSpellingSuggestions method of the Application object, passing the misspelled word as an argument. Notice that this is a method of the Application object, not of the Range object you’re spell-checking. The results returned by the GetSpellingSuggestions method must be stored in another collection, this one of the SpellingSuggestions type:

Dim CorrectionsCollection As SpellingSuggestions

Set CorrectionsCollection = AppWord.GetSpellingSuggestions(“antroid”)

The second line retrieves the suggested alternatives for the word antroid. To scan the list of suggested words, you set up a loop that retrieves all the elements of the CorrectionsCollection collection. The example in the next section demonstrates the use of both methods from within a Visual Basic application.

VB.NET at Work: The WordSpellChecker Project

WordSpellChecker is an application that uses Word’s methods to spell-check a text file. You’ll find the WordSpellChecker application in this chapter’s folder on the CD; its main form, shown in Figure 10.2, consists of a multiline TextBox control on which the user can enter some text and spellcheck it by clicking the SpellCheck Document button.

Figure 10.2

The WordSpellChecker application’s main form

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

450 Chapter 10 AUTOMATING MICROSOFT OFFICE APPLICATIONS

The application will contact Word and request the list of misspelled words. The list of misspelled words is displayed on a ListBox control on the same Form, as shown in Figure 10.2. The ListBox control on the left shows all the misspelled words returned by Word. Word can not only locate misspelled words but suggest alternatives as well. To view the alternate spellings for a specific word, select the word in the left list by double-clicking it.

To replace all instances of the selected misspelled word with the selected alternative, click the Replace button. You can design your own interface to allow the user to select which and how many instances of the misspelled word in the original document will be replaced.

The program uses three public variables, which are declared as follows:

Public WordApp As Application

Public CorrectionsCollection As SpellingSuggestions

Public SpellCollection As ProofreadingErrors

The SpellCollection variable is a collection that contains all the misspelled words, and the CorrectionsCollection variable is another collection that contains the suggested spellings for a specific word. The CorrectionsCollection variable’s contents are changed every time the user selects another misspelled word in Word’s Spelling Suggestions window.

When the SpellCheck Document button is clicked, the program creates a new document and copies the TextBox control’s contents to the new document using the InsertAfter method of the Range object, as follows:

WordApp.Documents.Add

Dim Drange As Word.Range

Drange = WordApp.ActiveDocument.Range

DRange.InsertAfter(Text1.Text)

Now comes the interesting part. The Visual Basic code calls the Range object’s SpellingErrors method, which returns a collection of ProofreadingErrors objects. The result of the SpellingErrors method is assigned to the object variable SpellCollection:

Dim SpellCollection As Word.ProofreadingErrors

Set SpellCollection = DRange.SpellingErrors

The lines in Listing 10.5—the SpellCheck Document button’s Click event handler—spell-check the document and add the words contained in the SpellCollection collection (the misspelled words) to the ListBox1 control.

Listing 10.5: The Check Document Button

Private Sub Button1_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button1.Click

Dim DRange As Word.Range

Me.Text = “Starting Word ...”

WordApp.Documents.Add()

Me.Text = “Checking words...”

DRange = WordApp.ActiveDocument.Range

DRange.InsertAfter(TextBox1.Text)

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

PROGRAMMING WORD 451

Dim SpellCollection As Word.ProofreadingErrors SpellCollection = DRange.SpellingErrors

If SpellCollection.Count > 0 Then ListBox1.Items.Clear() ListBox2.Items.Clear()

Dim iword As Integer Dim newWord As String

For iword = 1 To SpellCollection.Count newWord = SpellCollection.Item(iword).Text

If ListBox1.FindStringExact(newWord) < 0 Then ListBox1.Items.Add(newWord)

End If Next

End If

Me.Text = “Word spelling Demo” End Sub

The document is checked in a single statement, which calls the SpellingErrors method of a Range object that contains the entire text. Then the program goes through every word in the SpellCollection collection and adds them to the ListBox1 control. Notice that the ListBox control with the misspelled words doesn’t contain duplicate entries. The code uses the control’s FindStringExact method to find out whether a word belongs to the list or not.

Every time an entry in this ListBox is clicked, the code calls the WordApp object’s GetSpellingSuggestions method, passing the selected word as an argument. The GetSpellingSuggestions method returns another collection with the suggested words, which are placed in the second ListBox control on the Form with the statements shown in Listing 10.6. If this collection is empty (Word can’t suggest any alternatives), the string “No suggestions!” is displayed on the control.

Listing 10.6: Retrieving Correction Suggestions

Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged

Dim CorrectionsCollection As Word.SpellingSuggestions CorrectionsCollection = WordApp.GetSpellingSuggestions(ListBox1.Text) ListBox2.Items.Clear()

If CorrectionsCollection.Count > 0 Then Dim iWord As Integer

For iWord = 1 To CorrectionsCollection.Count ListBox2.Items.Add(CorrectionsCollection.Item(iWord).Name)

Next Else

ListBox2.Items.Add(“No suggestions!”) End If

End Sub

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com

452 Chapter 10 AUTOMATING MICROSOFT OFFICE APPLICATIONS

You can also replace misspelled words in the document with one of the suggested alternatives by clicking the Replace Word button. When you do, the application calls the Replace function to replace all instances of the selected word with the selected alternative. After that, it removes the misspelled word from the list. The code behind the Replace Word button is shown in Listing 10.7.

Listing 10.7: Replacing Misspelled Words

Private Sub Button2_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button2.Click

If ListBox1.SelectedIndex >= 0 And ListBox2.SelectedIndex >= 0 Then

TextBox1.Text = Replace(TextBox1.Text, _

ListBox1.SelectedItem, ListBox2.SelectedItem)

ListBox1.Items.Remove(ListBox1.SelectedIndex)

ListBox2.Items.Clear()

End If

End Sub

The WordSpellChecker application can become the starting point for many custom Visual Basic applications that require spell-checking but don’t need powerful editing features. In some cases, you might want to customize spelling, although it’s not a very common situation. In a mail-aware application, for example, you can spell-check the text and exclude URLs and e-mail addresses. You would first scan the words returned by the SpellingErrors method to check which ones contained special characters and omit them.

As you can see, tapping into the power of the Office applications isn’t really complicated. Once you familiarize yourself with the objects of these applications, you can access the Office applications by manipulating a few properties and calling the methods of these objects.

If you have a list of words to spell-check, you can call the CheckSpelling method of the Word.Application object to check the spelling of each word. The loop shown in Listing 10.8 goes through each word in a list and checks its spelling. If the word is misspelled, it’s added to a second ListBox control. This application uses the Word.Application object and doesn’t create a document with the text to be spell-checked.

Listing 10.8: Spell-Checking a List of Words

Dim WordApp As New Word.application()

Private Sub Button1_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Button1.Click

Dim SpellCollection As Word.ProofreadingErrors

Dim wrd As Integer

ListBox2.Items.Clear()

Dim words As Integer = ListBox1.Items.Count

For wrd = 0 To words - 1

Me.Text = “Spelling ... “ & CInt(wrd / words * 100) & “ % done”

If Not WordApp.CheckSpelling(ListBox1.Items(wrd)) Then

Copyright ©2002 SYBEX, Inc., Alameda, CA

www.sybex.com