Useful WordBasic commands that have no VBA equivalent
Article contributed by Jonathan West
When Microsoft released Word 97, a new programming language VBA replaced the WordBasic language that had been available in earlier versions of Word. For most things, VBA is a much more powerful and flexible programming language than WordBasic, but there are a few very useful WordBasic commands which have no direct equivalents in VBA.
Fortunately, VBA includes the WordBasic object, which gives access to most
of the old WordBasic commands.
SortArray
This is perhaps the most useful of the commands left behind. It allows you to sort the elements of an array using a single line of code. At its simplest, you can use it on a one-dimensional array as follows.
Sub SortTest()
Dim ss(2)
As String
Dim i As
Long
ss(0) = "orange"
ss(1) = "apple"
ss(2) = "banana"
WordBasic.SortArray ss()
For i = 0
To
2
Debug.Print
ss(i)
Next i
End Sub
This sorts the array in ascending alphabetical order
However, you can also sort in descending order, and sort either dimension of a two-dimension array. The full list of the SortArray arguments is as follows
SortArray ArrayName[$]() [, Order] [, From] [, To] [, SortType] [, SortKey]
|
ArrayName is the name of the array |
|
Order is 0 for ascending (by default), 1 for descending |
|
From is the first element to sort (0 by default) |
|
To is the last element to sort (by default the last element of the array) |
|
SortType determines whether you are sorting rows or columns. 0 (default) for rows, 1 for columns |
|
SortKey is applicable only to two-dimensional arrays, and indicates the row or column used as the sort key. It is 0 by default |
Note that, unlike most VBA methods, you don't use named arguments with this command; thus you can have
WordBasic.SortArray MailingList$(), 1, 1, 20, 0, 1
but not
WordBasic.SortArray ArrayName:=MailingList$(), Order:=1,
From:=1, To:=20, _
SortType:=0, SortKey:=1
Also, you cannot miss out arguments if you want to use later ones, thus you
can have
WordBasic.SortArray Test(), 0, 0, 2, 0, 1
but not
WordBasic.SortArray Test(), 0, , , , 1
There is one other limitation of the SortArray command. It will sort an array declared as such, but it will not sort an array that is contained in a Variant. If you create an array like this:
Dim vArray as Variant
vArray = Array("orange", "apple", "banana")
SortArray will not sort it.
(Also if you do not declare your array at all, it will be treated as a
variant and will not be sorted).
FileNameInfo$()
This is another very useful function for which there is no direct VBA equivalent. FileNameInfo allows you to get just the filename or a fully qualified pathname from a filename given to it. The nearest equivalent in VBA are the Name, FullName and Path properties of the Document object.
FileNameInfo is different in that you don't need to have the document open.
The syntax is
x = WordBasic.FilenameInfo$(Filename$, FileType)
where Filename is the name of the file, and FileType is a number which defines the part of the filename you want to return:
1 - the full pathname, e.g. C:\My Documents\My File.doc"
2 - the filename only, if the file is in the current folder, otherwise the full
pathname
3 - the filename only
4 - the filename without the extension
5 - the path without the filename
6 - the UNC pathname
One case where FileNameInfo$ is very useful is to get the pathname of a file which has just been selected by the user in the FileOpen dialog. The following code returns the full pathname of a file selected by the user.
With Dialogs(wdDialogFileOpen)
If .Display Then
MsgBox WordBasic.FilenameInfo$(.Name,
1)
Else
MsgBox "No file selected"
End If
End With
DisableAutoMacros
If you are running a macro that opens (or creates) several files, the last thing you may want is for an AutoOpen (or AutoNew) macro to fire up each time. WordBasic has a means of preventing this, which VBA never copied.
WordBasic.DisableAutoMacros 1
'Disables auto macros
WordBasic.DisableAutoMacros 0 'Enables
auto macros
This command is also very useful when launching an instance of Word from
another application, or from VB, when you will generally not want any AutoExec
macros to fire.
ToolsBulletsNumbers
WordBasic allows you to remove all manually typed numbering from a selection using the old Word 2 command:
WordBasic.ToolsBulletsNumbers Replace:=0, Type:=1, Remove:=1
This is particularly useful for removing manually typed numbering from Headings in a document you have been emailed, prior to applying List Numbering. If you go into Outline View, set the Heading Level to the number of levels you need to remove the typed numbering from, and run the above line, it will just remove numbering from those Headings and will leave the body text alone. Or you can use the following macro to do the same thing:
Sub RemoveNumbersFromHeadings()
Dim ViewType As Long, ShowHeadingLevel
As Long, MyRange As Range
Application.ScreenUpdating = False
'Set Range variable to current selection so it can
be returned to at the end
Set MyRange = Selection.Range
'Set variable to current View so it can be returned to at
the end
ViewType = ActiveWindow.View.Type
'Switch to Outline View
ActiveWindow.View.Type = wdOutlineView
'Checks the state (using the ID in case the toolbar has been customised) of _
all the ShowHeadings buttons on the Outline toolbar; if none are depressed, _
then it must be set to ShowAll. Stores result in a variable so that _
the same level can be returned to at the end of the macro
For ShowHeadingLevel = 71 To 77
If
CommandBars.FindControl(ID:=ShowHeadingLevel).State
Then
ShowHeadingLevel = (ShowHeadingLevel
- 70)
Exit For
End If
Next ShowHeadingLevel
'if none of the heading level buttons depressed sets
variable to 1
If ShowHeadingLevel = 78
Then
ShowHeadingLevel = 1
ActiveWindow.View.ShowHeading 3
ActiveDocument.Select
WordBasic.ToolsBulletsNumbers Replace:=0, Type:=1, Remove:=1
If ShowHeadingLevel = 0 Then
ActiveWindow.View.ShowAllHeadings
Elsee
ActiveWindow.View.ShowHeading ShowHeadingLevel
End If
ActiveWindow.View.Type = ViewType
MyRange.Select
Set MyRange = Nothing
Application.ScreenUpdating = False
End Sub
FileCopy/FileCopyA
The VBA FileCopy statement will not copy files that are open. However, the WordBasic equivalent will (this is what is known as progress!).
Unfortunately, the syntax of WordBasic equivalent is different in Word 97 and Word 2000!
The following works even if the file being copied is open:
If Left$(Application.Version, 1)
= "8"
Then
'Word 97
WordBasic.CopyFile
FileName:="c:\OldDirectory\Temp.doc", _
Directory:="C:\NewDirectory\Temp.doc"
Else
'Word 2000 and above
WordBasic.CopyFileA FileName:="c:\OldDirectory\Temp.doc", _
Directory:="C:\NewDirectory\Temp.doc"
End If
FileProperties
If you want to intercept the FileProperties menu command, the only reliable way to do it is to use:
Sub
FileProperties()
'your code here
WordBasic.FileProperties
End Sub
In fact, if you let Word create the code for you, using the method described
here, the above code will be created.
SendKeys
If you want to do a screen capture using VBA, (simulating the PrtScr key), you have to use:
WordBasic.SendKeys "%{1068}"
Download WordBasic Help File
Microsoft has made the old WordBasic help file available online. For further information about WordBasic commands, you can download it here..