I was writing a tutorial in Microsoft Word that describes commands that the reader is supposed to enter at the command prompt. I thought it would be neat if I could run those commands from within Word to validate them as I entered them.
And so I came up with a surprisingly simple VBA subroutine that sends selected text to the shell. It is quoted, below. The code should be placed into a module in Normal.dot.
Note that I invoke two statements in the Shell. They are separated by the double ampersands. I combine them into a single string (strCmd) that I pass to the shell.
The first statement is to change to the current working directory, which I assume is the same directory that the Word document resides in. This isn't fool proof, however. One failure mode would be if someone were to start Word and create a new document without saving it to the hard drive before calling the routine. Another failure mode would be if the Word document were to reside on a remote share through a UNC path, such as \\FileServer\ShareName\tutorial.doc -- it's not possible to CD into a UNC path.
The second statement is merely the selected text.
Also note that strCmd is preceded by the Win32 command prompt CMD.EXE. The "/D" switch makes sure that no "AutoRun" commands get executed. The "/C" switch terminates CMD after the command is finished executing. CMD is included because Shell isn't able to find DOS commands such as CD.
Sorry for the small font on this source code, but I wanted to ensure it wouldn't wrap.
Sub InvokeWithShell()
' Executes the selected text to using the shell
' 2014-06-09 LudditeGeek Created
Dim strCmd As String
If Selection.Characters.Count <= 1 Then
MsgBox "Nothing Selected!", vbExclamation, "Invoke With Shell Macro Message"
ElseIf Selection.Paragraphs.Count > 1 Then
MsgBox "Multiple Lines Selected!", vbExclamation, "Invoke With Shell Macro Message"
Else
strCmd = Selection.Text
Debug.Print "Invoking " & strCmd
strCmd = "cd " & ActiveDocument.Path & "\ && " & strCmd
Shell "cmd /D /C " & strCmd
End If
End Sub
No comments:
Post a Comment