# VBForums CodeBank > CodeBank - Visual Basic .NET >  Advanced VB/Office Guru Word SpellChecker.NET

## RobDog888

*Gangsta Yoda ®*

*Description:*
I wrote this to demonstrate how to take full advantage of MS Word's built in Spelling and Grammar checker. There 
are a few other code examples that show how to do spell checking with Word but they are all using the same technique that 
seems to have a few issues like showing the spell dialog behind your app, messing up the line breaks so you need to 
apply a code fix to restore them, flashing window, etc.

What makes my spell checker different is that I use the actual spell/grammar checking dialog window and not invoking it by 
coding the usual - "Document.CheckSpelling" which seems to cause the mentioned issues.

Since I use the dialog window I preset the type of spelling I wish to perform. Now you can make it dynamic by having a 
spell options form in your app to allow the user to preset it to either Ignore words in UPPERCASE, urls, mixed words and 
numbers, check grammer, and whether to show spelling suggestions, etc.

*Requirements:*
Microsoft Word
Versions 10.0 - 11.0 (2002 - 2003)

*Note:* I converted my VB6 version to VB.NET 2003. The VB6 version can be located here.
















VB Code:
Option Explicit On 
Option Strict On
'Copyright © 2005 by RobDog888 (VB/Office Guru). All Rights reserved.
'
'Distribution: You can freely use this code in your own
'              applications provided that this copyright
'              is left unchanged, but you may not reproduce
'              or publish this code on any web site, online
'              service, or distribute as source on any
'              media without express permission.
Imports Microsoft.Office.Interop
 Public Class clsSpellMe
     Friend moApp As Word.Application
    Private mbKillMe As Boolean
     Friend Property KillMe() As Boolean
        Get
            InitializeMe()
            KillMe = mbKillMe
        End Get
        Set(ByVal Value As Boolean)
            mbKillMe = Value
        End Set
    End Property
     Friend Sub InitializeMe()
        Try
            '<INITIALIZE WORD>
            moApp = DirectCast(GetObject(, "Word.Application"), Word.Application)
        Catch ex As Exception
            If TypeName(moApp) = "Nothing" Then
                moApp = DirectCast(CreateObject("Word.Application"), Word.Application)
                mbKillMe = True
            Else
                MessageBox.Show(ex.Message, "VB/Office Guru SpellChecker.NET", _
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End If
        End Try
    End Sub
     Friend Function SpellMe(ByVal msSpell As String) As String
         Dim oDoc As Word.Document
        Dim iWSE As Integer
        Dim iWGE As Integer
        Dim iResp As Integer
        Dim sReplace As String
         If msSpell = String.Empty Then Exit Function
        Try
            InitializeMe()
            Select Case moApp.Version
                Case "9.0", "10.0", "11.0"
                    oDoc = moApp.Documents.Add(, , 1, True)
                Case "8.0"
                    oDoc = moApp.Documents.Add
                Case Else
                    MessageBox.Show("Unsupported Version of Word.", "VB/Office Guru SpellChecker.NET", _
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Exit Function
            End Select
            oDoc.Words.First.InsertBefore(msSpell)
            iWSE = oDoc.SpellingErrors.Count
            iWGE = oDoc.GrammaticalErrors.Count
            '<CHECK SPELLING AND GRAMMER DIALOG BOX>
            If iWSE > 0 Or iWGE > 0 Then
                '<HIDE MAIN WORD WINDOW>
                moApp.Visible = False
                If (moApp.WindowState = moApp.WindowState.wdWindowStateNormal) Or _
                    (moApp.WindowState = moApp.WindowState.wdWindowStateMaximize) Then
                    moApp.WindowState = moApp.WindowState.wdWindowStateMinimize
                Else
                    moApp.WindowState = moApp.WindowState.wdWindowStateMinimize
                End If
                '</HIDE MAIN WORD WINDOW>
                '<PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.CheckGrammarWithSpelling = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.SuggestSpellingCorrections = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreUppercase = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreInternetAndFileAddresses = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreMixedDigits = False
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.ShowReadabilityStatistics = False
                '</PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>
                '<DO ACTUAL SPELL CHECKING>
                moApp.Visible = True
                moApp.Activate()
                iResp = moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Display
                '</DO ACTUAL SPELL CHECKING>
                If iResp < 0 Then
                    moApp.Visible = True
                    MessageBox.Show("Corrections Being Updated!", "VB/Office Guru SpellChecker", _
                    MessageBoxButtons.OK, MessageBoxIcon.Information)
                    oDoc.Select()
                    oDoc.Range.Copy()
                    sReplace = DirectCast(Clipboard.GetDataObject.GetData("System.String", True), String)
                    '<FIX FOR POSSIBLE EXTRA LINE BREAK AT END OF TEXT>
                    If (InStrRev(sReplace, Chr(13) & Chr(10))) = (Len(sReplace) - 1) Then
                        sReplace = Mid$(sReplace, 1, Len(sReplace) - 2)
                    End If
                    '</FIX FOR POSSIBLE EXTRA LINE BREAK AT END OF TEXT>
                    SpellMe = sReplace
                ElseIf iResp = 0 Then
                    MessageBox.Show("Spelling Corrections Have Been Canceled!", "VB/Office Guru SpellChecker.NET", _
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    SpellMe = msSpell
                End If
            Else
                MessageBox.Show("No Spelling Errors Found" & Environment.NewLine & "Or No Suggestions Available!", _
                "VB/Office Guru SpellChecker.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                SpellMe = msSpell
            End If
            '</CHECK SPELLING AND GRAMMER DIALOG BOX>
            oDoc.Close(False)
            oDoc = Nothing
            '<HIDE WORD IF THERE ARE NO OTHER INSTANCES>
            If KillMe = True Then
                moApp.Visible = False
            End If
            '</HIDE WORD IF THERE ARE NO OTHER INSTANCES>
        Catch ex As Exception
            MessageBox.Show(ex.Message, "VB/Office Guru SpellChecker.NET", _
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
     End Function
 End Class

----------


## Codehammer

what Refrences Are used? I Have Office 2003 Installed, and I Tried Refrencing Microsoft.Office 11, Microsoft.Office 10, Office, and these Errors Still Stood the Test of Time. 
*Please Submit an Example, in .NET*

(1): Namespace or type 'Interop' for the Imports 'Microsoft.Office.Interop' cannot be found.
(2): Namespace or type 'of' for the Imports 'System.Runtime.InteropServices.of' cannot be found.
(48): Type 'Word.Application' is not defined.
(64): Type 'Word.Application' is not defined.
(67): Type 'Word.Application' is not defined.
(78): Type 'Word.Document' is not defined.
(112): Name 'hSpelling' is not declared.
(112): Name 'Word' is not declared.
(113): Name 'Corrections' is not declared.
(113): Name 'Word' is not declared.
(114): Name 'Word' is not declared.
(115): Name 'ndFileAddresses' is not declared.
(115): Name 'Word' is not declared.
(116): Name 'ts' is not declared.
(116): Name 'Word' is not declared.
(117): Name 'Statistics' is not declared.
(117): Name 'Word' is not declared.
(122): Name 'Word' is not declared.

----------


## RobDog888

You need to add a reference to Word. I would submit an example but I already have found one person trying to claim my code being copyrighted as his and published on his website just about 2 weeks ago. It was a member that I helped with this. I had to submit a claim to his forum's software provider. Needless to say, he had to take it down.

Your errors are easy to fix. You need a reference to Word and it looks like you do not have the Primary Interop Assemblies installed for Office. Check the link in my signature on Office PIAs. This will give you the .Office.Interop.

----------


## Codehammer

Hmm, Well one Guy Ripped of Your Program as His, If its a Newb Then editing the AssemblyInfo might Tweak that.

Whats the Difference between that Code you gave Him and the One submitted Here?

----------


## RobDog888

It was mostly an issue of him copy/pasting the code I have posted here and he changed the copyright to reflect his website.  :Roll Eyes (Sarcastic): 

Anyways, did adding the Word reference help? And do you have the .Interop class available?

----------


## Codehammer

*Latest Errors:*  

(115): Name 'Statistics' is not declared.
(110): 'CheckGrammarWit' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(110): Name 'hSpelling' is not declared.
(111): 'SuggestSpelling' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(111): Name 'Corrections' is not declared.
(113): 'IgnoreInternetA' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(113): Name 'ndFileAddresses' is not declared.
(114): 'IgnoreMixedDigi' is not a member of 'Microsoft.Office.Interop.Word.Options'.
(114): Name 'ts' is not declared.
(115): 'ShowReadability' is not a member of 'Microsoft.Office.Interop.Word.Options'.

----------


## RobDog888

Ah, it seems that the forum software can not display the complete length of the code so it adds a space. Look at my original post.


VB Code:
....ShowReadability  Statistics = False
 'Should be...
....ShowReadabilityStatistics = False

----------


## Codehammer

I Missed that Cause I Thought this had to do with a Reference issue which I thought You'd Know how to Fix.

Coool, I Wont Patent/Copyright/etc this.

Question =-  When One Puts in 'Comments does it Compile in the Exe?

----------


## RobDog888

:Smilie:  Glad you like it.

Comments in code do not get compiled into the exe.

----------


## oigres

Hi,

instead of:
moApp.Dialogs(Word.WdWordDialog....

I have to use
moApp.Dialogs.*Item*(Word.WdWordDialog....

Development environnment specs:
MDE 2003 vers. 7.1.3088
.NET Framework 1.1 vers. 1.1.4322
MS Word 2002 SP3
Win XP Pro SP2

Best regards,
Sergio.

----------


## RobDog888

I'm running the same MDE but SP1 on the framework version and SP1 on XP Pro. Also, Office 2003 but its just a shortcut as when I type the parenthesis after the Dialogs I get intellisense popup for the constants.

VB Code:
'Original way with intellisense.
moApp.Dialogs(Word.WdWordDialog...
 'Works for me too.
moApp.Dialogs.Item(Word.WdWordDialog...

----------


## SpeedRacer

I dont see whats so hard? The code example given and everything you need. What more could you ask for?

Great code example  :Thumb:

----------


## staticbob

Mr Dog,

I'm having problems with focus using your .Net spellchecker mate. Apart from this its working cool, really cool.

I have around 10 user controls that use this, I am running in a terminal services / Citrix environment and the users have a TS desktop session running that they don't see, so it just looks like a seamless app to them. Anyway, I am creating an instance of Word on the first use of Spellchecker, then leaving it for subsequent calls.

Sometimes, not always, the subsequent calls don't bring the spellcheck window to the front/focus so I get a hung app. Because the users can't see the citrix desktop, and never will, they're unable to do a Ctrl - Tab to switch apps/focus. Trying to get them to do something that simple normally would be difficult anyways.

So, any suggestions Sir ?

Thanks in advance, just holler if you need to see my current code / app.

Bob

----------


## RobDog888

Welcome to th Forums.  :Smilie: 

Post what your doing. It shouldnt be an issue.

----------


## mikeschulze

Hiya RobDog, really great forum, I've added this to my list of resources. And really great work on this spellchceck class, it's fabulous! I'm playing around with it in VS2005 and all seems well in order. Learned a lot from it just about MSWord alone :-) I'm having difficulties with one thing, and that is when I set killme() to 'true', it likes to kill *all* instances of Word... even previously opened, mutually exclusive, documents. Now there's a fun trick to play on the enduser! lol.  I wonder if anyone else has this issue and what they have done about it... I have a feeling I'm going to have to set the .doc to visible=false rather than the app itself, regardless, if I figure it out I'll post here.

----------


## RobDog888

Thanks for the props  :Smilie: 

Sounds like the KillMe property is not finding the instance of Word already open so when it closes it kills the Word application object even though you have child documents in it.

You should only be executing the killme if your closing your program or you dont anticipate performing any more spellchecks. If you do another then it takes time for word to start again. 

I'm off to bed right now but what version of Word are you running? Can you test it a bit more and post the findings for me tomorrow (actually today. Its 4 am). I'll take a look at it in a few.


Thanks

----------


## RobDog888

@Proggy_Dylan 

If your not going to include my copyright code comments in your program then there will be no support and I request that you remove it from your app.

Your attachment has been archived and removed from your post.

Thanks

----------


## mikeschulze

Sure thing, can do. I'm using Office 2003 on my development machine. I did a quick build and tried to run it on a machine that has Office 2002 and ran into an entirely different snag.. stdole version needs an upgrade in the global assembly cache... I think this means I need a reference to the older office objects as it can't load the office interop for version 11 on the machie with Office 2002 (duh). I'm not in any hurry so it may take me a couple of days... sleep well... 4am eh? bit of a workaholic? lol.

----------


## RobDog888

lol yup  :Smilie: 

If your creating a setup package and have the PIAs then you shouldnt have an issue but then again I havent had any other version other then 2003 so...

Its supossed to be that when you use the PIAs you dont have to worry about versioning. You can always use late binding and remove the references to Office and Word. Then you would have to go and cast all your types correctly so you can use Option Strict still.

Man, I got to stop posting and get some sleep. Should be up in a few hours though as I have to be up before 9am. 4.5 hours sleep should be good for a while.  :Big Grin:

----------


## mikeschulze

Ok, Bare with me... late binding has created a load of fun for me. I can see where this is going to solve my compatibility issues, but yeesh, VS2005 likes to complain about everything. Also, since I'm not familiar with working with MSWord this way, this is a bit of a learning curve --and to do it.. option stric has to be off.. late binding is not allowed otherwise... so no intellisense... AH!  :Cry:  

Anyways... I've gotten this far with this challenge...

1. when I declare the moApp and oDoc as objects, it likes to complain about all the references to *word.wsWindowState*  (says 'word' is not delared)

2. also complains about  *moApp.Dialogs(word.aWdWordDialog*... (says 'word' is not declared) 

3. It  doesn't like the Direct Cast statement (says 'word.application' is not defined)

if I replace the *word.* with *moApp.*, and I sub in *object*  for *word.application*  in the direct cast statement, it builds fine, but it throws errors on the btn_click event saying that _Public member 'WdWindowState' on type 'ApplicationClass' not found_. 

I'm finding I don't know enough about how to talk to Word. I think. Oi.  :Roll Eyes (Sarcastic):

----------


## RobDog888

Sorry for the delay but I had a project deadline due today. 

Did you include at the top the "Imports Microsoft.Office.Interop"?
for some of the unrecognized "word" codes try fully qualifing it like so...

Microsoft.Office.Interop.Word.WdWindowState.wdWindowStateMaximize

etc.

----------


## RobDog888

You can also do ...
Imports Word = Microsoft.Office.Interop

to initialize "Word" so it will be recognized when you go ...
word.wsWindowState but shouldnt windowstate be wdWindowState and not wsWindowState.

----------


## mikeschulze

Delay? What delay? I'm happy to be getting the suggestions   :Smilie:   Off to give it a try...

----------


## mikeschulze

*If you develop on a machine with VS2005 and Office 2003 but you want this code to work on a PC with Office XP*

Hey again Robdog, and others... sorry for taking a long time to get back, I've been playing with the PIA's and learning the ins and outs, and how to get this code to work on an Office XP machine when compiling in a VS2005 environment with Office 2003 installed. 

I found the best way to get this to work is to simply to get the XP PIAs and reference them instead.. the idea being building from the lowest common denominator will ensure backward compatibility. 

So, for people doing what I'm doing here's an idea...

1) download the XP PIA's available from Microsoft. http://www.microsoft.com/downloads/d...displaylang=en 
2) Extract them to some folder in your project dir (anywhere is ok, but for this example I'm saying extract to a folder named  *XP_PIA_COMs*) 
3) In visual studio...drop the project's reference to the version 11 (Office 2003) Microsoft.Office.Interop.Word.dll 
4) Finally, Add a new reference to the OFFICE XP COM library by browsing to the *XP_PIA_COMs* directory chosing Microsoft.Office.Interop.Word.dll.

Now it will build properly using Early binding, it will run on a machine with Office 2003 and will also be backwards compatible to Office XP machines. 

KEEP IN MIND, if you already develop on a machine with Office XP, you will by default have the XP (2002) PIAs, *and* you have less chance of encountering any issues. 

*A note re Late Binding:* I believe even if you were to do this using a late binding reference, you would still have to have the XP PIAs. Late binding is a pain in VS2005 and this is by far an easier out... in my humble opinion.

----------


## RobDog888

Glad to see that you got it working now. Like I posted in #25, using the PIAs is a big advantage and makes life easier. 

When needing to Late bind, you should add the reference like your early binding so you can get all the intellisense. Then when finished you can remove the reference and convert to late binding.  :Smilie:

----------


## mikeschulze

Sweet idea! I never would have thought of that. :-)

----------


## danasegarane

Dear Rob,
          Can we restrict the editing in the first box?

----------


## RobDog888

How do you mean? In the Word Spell Checking Dialog?

----------


## danasegarane

Dear Rob,
             Is it able to disable editing in the Not in Dictionary Box?

----------


## RobDog888

There is no built in property or support for disabling the textbox but perhaps by subclassing the dialog window and sending a disable message it will work but allot of work for a small feature. Couldnt you just check after the dialog is dismissed?

----------


## ScriptKing1

Warning	1	Function 'SpellMe' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.		37	40	Programmers_Editor_v1
_I keep getting this warning, and I can't fix it. Also, When I run it, everything runs fine, exept for when I want to check the spelling and I press the button, it doesn't do anything. Do you know what names I should give my text box and button?  Here is my code._
vb Code:
Option Explicit On
Option Strict On
'Copyright © 2005 by RobDog888 (VB/Office Guru). All Rights reserved.
'
'Distribution: You can freely use this code in your own
'              applications provided that this copyright
'              is left unchanged, but you may not reproduce
'              or publish this code on any web site, online
'              service, or distribute as source on any
'              media without express permission.
Imports Microsoft.Office.Interop
Public Class SpellCheck
    Friend moApp As Word.Application
    Private mbKillMe As Boolean
    Friend Property KillMe() As Boolean
        Get
            InitializeMe()
            KillMe = mbKillMe
        End Get
        Set(ByVal Value As Boolean)
            mbKillMe = Value
        End Set
    End Property
    Friend Sub InitializeMe()
        Try
            '<INITIALIZE WORD>            
            moApp = DirectCast(GetObject(, "Word.Application"), Word.Application)
        Catch ex As Exception
            If TypeName(moApp) = "Nothing" Then
                moApp = DirectCast(CreateObject("Word.Application"), Word.Application)
                mbKillMe = True
            Else
                MessageBox.Show(ex.Message, "VB/Office Guru SpellChecker.NET", _
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End If
        End Try
    End Sub
    Friend Function SpellMe(ByVal msSpell As String) As String
        Dim oDoc As Word.Document
        Dim iWSE As Integer
        Dim iWGE As Integer
        Dim iResp As Integer
        Dim sReplace As String
        If msSpell = String.Empty Then Exit Function
        Try
            InitializeMe()
            Select Case moApp.Version
                Case "9.0", "10.0", "11.0"
                    oDoc = moApp.Documents.Add(, , 1, True)
                Case "8.0"
                    oDoc = moApp.Documents.Add
                Case Else
                    MessageBox.Show("Unsupported Version of Word.", "VB/Office Guru SpellChecker.NET", _
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    Exit Function
            End Select
            oDoc.Words.First.InsertBefore(msSpell)
            iWSE = oDoc.SpellingErrors.Count
            iWGE = oDoc.GrammaticalErrors.Count
            '<CHECK SPELLING AND GRAMMER DIALOG BOX>            
            If iWSE > 0 Or iWGE > 0 Then
                '<HIDE MAIN WORD WINDOW>                
                moApp.Visible = False
                If (moApp.WindowState = Word.WdWindowState.wdWindowStateNormal) Or _
                (moApp.WindowState = Word.WdWindowState.wdWindowStateMaximize) Then
                    moApp.WindowState = Word.WdWindowState.wdWindowStateMinimize
                Else
                    moApp.WindowState = Word.WdWindowState.wdWindowStateMinimize
                End If
                '</HIDE MAIN WORD WINDOW>                
                '<PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>                
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.CheckGrammarWithSpelling = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.SuggestSpellingCorrections = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreUppercase = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreInternetAndFileAddresses = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreMixedDigits = False
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.ShowReadabilityStatistics = False
                '</PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>                
                '<DO ACTUAL SPELL CHECKING>                
                moApp.Visible = True
                moApp.Activate()
                iResp = moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Display
                '</DO ACTUAL SPELL CHECKING>                
                If iResp < 0 Then
                    moApp.Visible = True
                    MessageBox.Show("Corrections Being Updated!", "VB/Office Guru SpellChecker", _
                    MessageBoxButtons.OK, MessageBoxIcon.Information)
                    oDoc.Select()
                    oDoc.Range.Copy()
                    sReplace = DirectCast(Clipboard.GetDataObject.GetData("System.String", True), String)
                    '<FIX FOR POSSIBLE EXTRA LINE BREAK AT END OF TEXT>                    
                    If (InStrRev(sReplace, Chr(13) & Chr(10))) = (Len(sReplace) - 1) Then
                        sReplace = Mid$(sReplace, 1, Len(sReplace) - 2)
                    End If
                    '</FIX FOR POSSIBLE EXTRA LINE BREAK AT END OF TEXT>                    
                    SpellMe = sReplace
                ElseIf iResp = 0 Then
                    MessageBox.Show("Spelling Corrections Have Been Canceled!", "VB/Office Guru SpellChecker.NET", _
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    SpellMe = msSpell
                End If
            Else
                MessageBox.Show("No Spelling Errors Found" & Environment.NewLine & "Or No Suggestions Available!", _
                "VB/Office Guru SpellChecker.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                SpellMe = msSpell
            End If
            '</CHECK SPELLING AND GRAMMER DIALOG BOX>            
            oDoc.Close(False)
            oDoc = Nothing
            '<HIDE WORD IF THERE ARE NO OTHER INSTANCES>            
            If KillMe = True Then
                moApp.Visible = False
            End If
            '</HIDE WORD IF THERE ARE NO OTHER INSTANCES>        
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Welcome To Programmer's Editor Spell Check", _
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try
    End Function
End Class
My button is named "Command1", and the text box is "Text1"Thanks, ScriptKing1

----------


## funch

Hello,

Sweet module, I have used the one that pops up Word in the past, but this one rocks!

Anyway... I am using Office 2007 and at first it gave me an "Unsupported Office" error, but adding 12.0 to the moApp check works.   

Will that come back and bite me in the butt later or...

tnx
~j

----------


## RobDog888

You can use Late Binding so you can support multiple version of Word. 

See my Office FAQ (link inmy signature).

----------


## FlyingBear

thanks for the code. I'm using it in office 2003 + vb .net 2005 express. I found, sometimes, the word window will not close after the spell checker finish the work. is it normal? or, something I missed?

I noticed that if I only do spell check, it is ok. the problem always happens when I do grammer check.

anyone knows the reason? how to close it?


thanks

bear

----------


## RobDog888

Thanks. 

Doing a grammer check only or together with a spell check?

----------


## FlyingBear

I checked it. It doesn't matter doing grammer check only or with spell check, or spell check only. There is no WORD running at the background. When I do the check (grammer or spell) in the first time, it is always ok. WORD disappeared. But, in the background, there is a WORD process. So when you check it in the second time, if the text has error (grammer or spell), the WORD will show up and do the check, but it will not become disappear when the check finished. There is a WORD window (no doc in it) at the bottom. Sometimes, this focus will not come back to the program which calls the checker class. This WORD window gets the focus (although it is minimized).

I think the problem is: the checker class didn't quit WORD correctly. 

I changed the code:
[vb]
If KillMe = True Then
    moApp.Visible = False
End If
[/vb]

to

[vb]
Dim Ret As Boolean = KillMe     ' just use the property's Get
moApp.Visible = False
[/vb]

The WORD window won't show up (of course,  :Smilie: ), but the WORD process is still there, didn't quit. And sometimes, the spell checker window shows at below the current forum although it got focus.

I'm using winxp pro, vb express 2005 and XP_PIA_COMs (explained in #27).

I'll check more.


thanks

bear






> Thanks. 
> 
> Doing a grammer check only or together with a spell check?

----------


## RobDog888

Is this on 2005 or 2003? In 2005 the GetObject function is flakey at best.

Edit: I see it is 2005. I may have to update the article for 2005  :Frown:

----------


## FlyingBear

I noticed that in debug mode, this happens 1 out of 3 times, but if I run the program in release mode, this does not happen very often, but it happens.

Right now, what I do is:
when spell checker is launched, I check the process, if WinWord existed, then I ask users save and quit it. Then, in program, I use
' ''If KillMe = True Then
            ' ''    moApp.Visible = False
            ' ''End If


```
            Try
                moApp.Quit(False, Nothing, Nothing)
            Catch ex As Exception
                gcLog.LogInfo("WORD Quit Error!")
            Finally
                moApp = Nothing
            End Try
```

instead of


```
If KillMe = True Then
    moApp.Visible = False
End If
```

This way, the spell checker dlg always gets focus and stays at the top when it is called. The cons are:
users have to save & quit word before launch spell checker;

But I do have a question. When the spell checker is launched in the first time, it takes some time, since it needs lauch WORD. In the program I quit WORD. SO, I think when I launch spell checker in the second (or later) time (without quiting the program which launch spell checker), it SHOULD take some time too since it will launch WORD again. However, I found in the second time, it is very fast, just like WORD is launched already although I can't see the process WinWord. 

Actually, fast is good, just feel weird. Maybe it has certain relation with the OS? I guess,  :Smilie: 

bear

----------


## RobDog888

No, if its not properly disposed of it will retain it in memory which is why the second run will be fast just like other second or subsequent runs. This is only for when there is an issue quitting word. 

If you have it set so Word is destroyed each time with the KillMe = True, cause no running instance of Word was detected, then it will start up a new instance off Word and be slow. You can get over this by starting Word hidden when your app starts. Then it will just add docs and close docs as you spell check and be fast all the time. Then upon the app closing you kill that instance of Word.

----------


## FlyingBear

does it mean if the PC installed office 2007, then we have to use PIA for 2007 and recompile the program? if a PC installed PIA2007, and word 2002, will it work? how about on vista? anyone knows?


thanks

bear

----------


## RobDog888

Yes an no. You need to have separate compiles for each of the Office versions you are going to support which will include changing your references etc and recompiling. There is no issue for Vista with this, only other issues like security, virtualizations and the UAC. All of which are unrelated to the PIAs and Office.

----------


## nbrege

RD ... can you post some instructions on how to implement your class into an existing project?  Here's what I tried:  I created a new module, then I pasted your class into that module.  In my main code I tried to call the SpellMe function, but it's telling me that "SpellMe" is not declared.

----------


## vbheadache

Hi guys, i really hope this thread is still active, anyway...


This post is fantasic and the spellcheck works great. But it i need it to do just one little thing extra. I really hope you can help  :Smilie: 

Is it possible to specify where the Spelling options dialog will appear on the screen? At the moment it just deafults to the center of the screen but im using a multi headed system and so want the Spelling dialog to appear on a second screen.

When modifing the preferences...



```
'<PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>                
moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.CheckGrammarWithSpelling = True
```

is it possible to modify the dialogs position if so how?

Kind regards

----------


## Xancholy

RobDogg - great stuff. Has there been an 2008 update ?

What happens if the end user does not have MS-Office installed ?

----------


## RobDog888

Thanks  :Smilie: 

Well this is setup with early binding but since its .NET you can include the PIAs to avoid that but you could also just change the code to Late binding and its already set to use a Try Catch for the existance of Word and message if they dont have it installed.

----------


## RobDog888

> Hi guys, i really hope this thread is still active, anyway...
> 
> 
> This post is fantasic and the spellcheck works great. But it i need it to do just one little thing extra. I really hope you can help 
> 
> Is it possible to specify where the Spelling options dialog will appear on the screen? At the moment it just deafults to the center of the screen but im using a multi headed system and so want the Spelling dialog to appear on a second screen.
> 
> When modifing the preferences...
> 
> ...


There is no built in abilities in Word to position the dialog so you may be able to subclass the dialog creation using Moeurs C++ dll and reposition it by changing its windowsplacement at that time.

----------


## RobDog888

> RD ... can you post some instructions on how to implement your class into an existing project?  Here's what I tried:  I created a new module, then I pasted your class into that module.  In my main code I tried to call the SpellMe function, but it's telling me that "SpellMe" is not declared.


Just copy and paste all the code into a blank new class. If you look at my code you can see its a class and already named etc.

----------


## RobDog888

> RobDogg - great stuff. Has there been an 2008 update ? ...


I suposse its time for an update/improvement. I have a few ideas on this but perhaps I'll update this soon as I am getting ready to write a few more FAQs again.

----------


## csauer

RobDog888- This code looks great. However, I am getting the same errors CodeHammer did awhile back, yet I believe I have added the Reference to word, it does appear under references in the solution expolorer.

error: Type 'Word.Application' is not defined.
Suggests: Microsoft.Office.Interop.Word.Application

Other errors: Name "Word" not declared 


Any suggestions? Thanks.

----------


## RobDog888

Ok, you may not have the .Interop installed on your system. 

See the link in my sig - "Office Primary Interop Assemblies" that should resolve the errors.

----------


## VB6Learner

Uh no Errors but Dialog not showing what do I have to put in my button! Im using VB2008!

----------


## Always_Confused

I am getting an error on "Exit Function". 

It says:
Function 'SpellMe' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.	




```
Friend Function SpellMe(ByVal msSpell As String) As String

        Dim oDoc As Word.Document
        Dim iWSE As Integer
        Dim iWGE As Integer
        Dim iResp As Integer
        Dim sReplace As String

        If msSpell = String.Empty Then Exit Function

        Try
            InitializeMe()
```

VS2008 3.5sp1

Option Explicit On
Option Strict On

----------


## NickThissen

That is not an error, it is a warning. It is warning you that the function SpellMe is not always returning a value. In this case, where you use Exit Function, there is no return value.

This doesn't need to be a hazard in your application, because you should always use appropriate null object checks. But if you don't do these checks, and use the result of this function directly, you may get an 'object reference not set' error.

----------


## BukHix

Is this how I should be calling this?

VB Code:
Dim sp As New clsSpellMe
TextBox1.Text = sp.SpellMe(TextBox1.Text)

----------


## scholattu

Hi,

How do I keep  the text formatting after applying the spell check in a richtextbox? As it replaces the whole text, I am losing the text formatting and also other objects like images inside the richtextbox.

Is there a way to tell the spellcheck to look only in texts and update?

thanks,

----------


## nbrege

RobDog ... will this work with Office 2007?  Some of our users are SOMETIMES getting this error:

_Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))_.

Do you know how I can fix this?  Thanks...

----------


## TysonLPrice

I added the 12.0 version to the Select Case and am not experiencing any issues using it.

----------


## moti barski

to activate this :
1 what is needed to be installed/dl ?
2 what dll is to be referenced ?

how do i pass a string spell check it and get a : corrected string or 3 top correction strings options
(walkthrough) ?

----------


## Nightwalker83

> to activate this :
> 1 what is needed to be installed/dl ?
> 2 what dll is to be referenced ?


Nothing! The only mention of references I found was MS Word xx.0 Object Library is needs referencing for the VB6 version of the above code. Although, you could try referencing the MS Word xx.0 Object Library in the vb.net project and see what happens.

----------


## TysonLPrice

It is all available as posted but...

1.	Make a reference to Microsoft xx.x Object library.
2.	Create a Windows project.
3.	Add a text box
4.	Add a command button.
5.	Create the class.

Form logic:



```
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim x As New clsSpellMe

        TextBox1.Text = x.SpellMe(TextBox1.Text)


    End Sub
```

Class



```
Option Explicit On
Option Strict On
'Copyright &#169; 2005 by RobDog888 (VB/Office Guru™). All Rights reserved.
'
'Distribution: You can freely use this code in your own
'              applications provided that this copyright
'              is left unchanged, but you may not reproduce
'              or publish this code on any web site, online
'              service, or distribute as source on any
'              media without express permission.
'From http://www.vbforums.com/showthread.php?t=359879
Imports Microsoft.Office.Interop

Public Class clsSpellMe

    Friend moApp As Word.Application
    Private mbKillMe As Boolean

    Friend Property KillMe() As Boolean
        Get
            InitializeMe()
            KillMe = mbKillMe
        End Get
        Set(ByVal Value As Boolean)
            mbKillMe = Value
        End Set
    End Property

    Friend Sub InitializeMe()
        Try
            '<INITIALIZE WORD>
            moApp = DirectCast(GetObject(, "Word.Application"), Word.Application)
        Catch ex As Exception
            If TypeName(moApp) = "Nothing" Then
                moApp = DirectCast(CreateObject("Word.Application"), Word.Application)
                mbKillMe = True
            Else
                MessageBox.Show(ex.Message, "VB/Office Guru™ SpellChecker™.NET", _
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            End If
        End Try
    End Sub

    Friend Function SpellMe(ByVal msSpell As String) As String

        Dim oDoc As Word.Document
        Dim iWSE As Integer
        Dim iWGE As Integer
        Dim iResp As Integer
        Dim sReplace As String

        If msSpell = String.Empty Then
            SpellMe = ""
            Exit Function
        End If
        Try
            InitializeMe()
            Select Case moApp.Version
                Case "9.0", "10.0", "11.0", "12.0"
                    oDoc = moApp.Documents.Add(, , 1, True)
                Case "8.0"
                    oDoc = moApp.Documents.Add
                Case Else
                    MessageBox.Show("Unsupported Version of Word.", "VB/Office Guru™ SpellChecker™.NET", _
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    SpellMe = ""
                    Exit Function
            End Select
            oDoc.Words.First.InsertBefore(msSpell)
            iWSE = oDoc.SpellingErrors.Count
            iWGE = oDoc.GrammaticalErrors.Count
            '<CHECK SPELLING AND GRAMMER DIALOG BOX>
            If iWSE > 0 Or iWGE > 0 Then
                '<HIDE MAIN WORD WINDOW>
                moApp.Visible = False
                If (moApp.WindowState = moApp.WindowState.wdWindowStateNormal) Or _
                    (moApp.WindowState = moApp.WindowState.wdWindowStateMaximize) Then
                    moApp.WindowState = moApp.WindowState.wdWindowStateMinimize
                Else
                    moApp.WindowState = moApp.WindowState.wdWindowStateMinimize
                End If
                '</HIDE MAIN WORD WINDOW>
                '<PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.CheckGrammarWithSpelling = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.SuggestSpellingCorrections = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreUppercase = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreInternetAndFileAddresses = True
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.IgnoreMixedDigits = False
                moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Application.Options.ShowReadabilityStatistics = False
                '</PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>
                '<DO ACTUAL SPELL CHECKING>
                moApp.Visible = True
                moApp.Activate()
                iResp = moApp.Dialogs(Word.WdWordDialog.wdDialogToolsSpellingAndGrammar).Display
                '</DO ACTUAL SPELL CHECKING>
                If iResp < 0 Then
                    moApp.Visible = True
                    MessageBox.Show("Corrections Being Updated!", "VB/Office Guru™ SpellChecker™", _
                    MessageBoxButtons.OK, MessageBoxIcon.Information)
                    oDoc.Select()
                    oDoc.Range.Copy()
                    sReplace = DirectCast(Clipboard.GetDataObject.GetData("System.String", True), String)
                    '<FIX FOR POSSIBLE EXTRA LINE BREAK AT END OF TEXT>
                    If (InStrRev(sReplace, Chr(13) & Chr(10))) = (Len(sReplace) - 1) Then
                        sReplace = Mid$(sReplace, 1, Len(sReplace) - 2)
                    End If
                    '</FIX FOR POSSIBLE EXTRA LINE BREAK AT END OF TEXT>
                    SpellMe = sReplace
                ElseIf iResp = 0 Then
                    MessageBox.Show("Spelling Corrections Have Been Canceled!", "VB/Office Guru™ SpellChecker™.NET", _
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    SpellMe = msSpell
                End If
            Else
                MessageBox.Show("No Spelling Errors Found" & Environment.NewLine & "Or No Suggestions Available!", _
                "VB/Office Guru™ SpellChecker™.NET", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                SpellMe = msSpell
            End If
            '</CHECK SPELLING AND GRAMMER DIALOG BOX>
            oDoc.Close(False)
            oDoc = Nothing
            '<HIDE WORD IF THERE ARE NO OTHER INSTANCES>
            If KillMe = True Then
                moApp.Visible = False
            End If
            '</HIDE WORD IF THERE ARE NO OTHER INSTANCES>
        Catch ex As Exception
            MessageBox.Show(ex.Message, "VB/Office Guru™ SpellChecker™.NET", _
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
        End Try

    End Function

End Class
```

----------


## Whiteshua

I have a textbox on a continuous form with a memo field control source.  On double click, the text box will open another form that has it's contents displayed in a larger view, with the option to spell check, modify the text in the field and then update and close, transferring the modified text back to the original textbox control.  

I want to be able to run the grammar checker in word on this expanded form as well.

Any ideas?  Any .mdbs already ready already?  

P.S.  Unfortunately, my office still uses ACCESS 2003 and will continue to do so for an indefinite amount of time...

 :wave:

----------


## RobDog888

Just preset in code what options you want before invoking the spelling dialog. Its shown in my first post. See line 78: '<PREP CHECK SPELLING OPTIONS DIALOG BOX (MODIFY TO YOUR PREFERENCES)>

----------


## Amerigo

It is amazing that so many have figured out how to use this although there isn't one mention anywhere as to how to call this class to start auto-checking text fields on a form. So, how is this accomplished?

----------


## RobDog888

Because checking fields on a form is simply just passing the fields in a loop to the SpellMe function after you instantiate the clsSpellMe class. My initial example is just for one big "field" if you will. Its up to you how you want to call or utilize it for your own needs.

----------


## TheDevGuy

Hallo, not sure if this is still supported, I love the class but cannot get it to work for me. i added version 12.0 to my moApp.Versions.

Im using office 2007

I get the following error

TheAdd method or property is not available because the document is a rich text edit control..

hope I can get this going, its exactly what im looking for.

thanks

----------

