Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Open and Write to Notepad from excel VBA

I need to open notepad and write my results from my macro to it. I want to open notepad and write to it, and have the user review and if he or she wants to save it then save it wherever they like. Instead of writing to it and saving on the computer all in the code.

Thanks

like image 993
David Avatar asked Dec 04 '25 14:12

David


2 Answers

Use the following code to open notepad and type into it:

Dim myApp As String
myApp = Shell("Notepad",    vbNormalFocus)
SendKeys "test", True
like image 164
Tarik Avatar answered Dec 07 '25 04:12

Tarik


Similar to Tarik's answer, I would probably use something like the following:

In a class module called NotepadManager:

    Option Explicit

Private Const CAPTION$ = "Notepad"

Private MHwnd As Long

'based on code lifted from:
'http://www.pbdr.com/vbtips/api/FindCloseAPI.htm


    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
      (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
      (ByVal hWnd As Long, ByVal lpString As String, _
      ByVal aint As Long) As Long
    Private Declare Function GetWindow Lib "user32" _
      (ByVal hWnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function EnumWindows Lib "user32" _
      (ByVal wndenmprc As Long, ByVal lParam As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
      (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
      lParam As Any) As Long
    Private Declare Function SetForegroundWindow Lib "user32" ( _
     ByVal hWnd As Long) As Long

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

   Private Const WM_CLOSE = &H10
   Private Const GW_HWNDFIRST = 0
   Private Const GW_HWNDLAST = 1
   Private Const GW_HWNDNEXT = 2
   Private Const GW_HWNDPREV = 3
   Private Const GW_OWNER = 4
   Private Const GW_CHILD = 5
   Private Const GW_MAX = 5

   Private mstrTarget As String
   Private mblnSuccess As Boolean


Public Sub writeMessageToNotepad(ByRef message As String)

focusNotepad

Sleep 2000

SendKeys (message)

End Sub

Public Sub startNotepad()

Dim ret

ret = Shell("notepad", vbNormalFocus)

End Sub


Public Sub focusNotepad()

        If MHwnd = 0 Then
            MHwnd = hwndFindWindow(CAPTION$)
        End If

        If MHwnd = 0 Then MsgBox "Error: Cannot find notepad."

        Debug.Print SetForegroundWindow(MHwnd)

End Sub



Private Function hwndFindWindow(strApplicationTitle As String) As Long

   Dim hWndTmp As Long
   Dim nRet As Integer
   Dim TitleTmp As String
   Dim TitlePart As String
   Dim MyWholeTitle As String
   Dim mCounter As Long
   Dim hWndOver As Integer
   Dim sClassName As String * 100

   hwndFindWindow = False

   TitlePart = UCase$(strApplicationTitle)

   'loop through all the open windows
   hWndTmp = FindWindow(0&, 0&)

   Do Until hWndTmp = 0

      TitleTmp = Space$(256)
      nRet = GetWindowText(hWndTmp, TitleTmp, Len(TitleTmp))

      If nRet Then
         'retrieve window title
         TitleTmp = UCase$(VBA.Left$(TitleTmp, nRet))
         'compare window title & strApplicationTitle
         If InStr(TitleTmp, TitlePart) Then
            hwndFindWindow = FindWindow(vbEmpty, TitleTmp)
            Exit Do
         End If
      End If

      hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT)
      mCounter = mCounter + 1

   Loop

   End Function


Private Function EnumCallback(ByVal app_hWnd As Long, _
  ByVal param As Long) As Long

   Dim buf As String * 256
   Dim title As String
   Dim length As Long

   ' Checks a returned task to determine if App should be closed

   ' get window's title.
   length = GetWindowText(app_hWnd, buf, Len(buf))
   title = Left$(buf, length)

   ' determine if target window.
   If InStr(UCase(title), UCase(mstrTarget)) <> 0 Then
      ' Kill window.
      SendMessage app_hWnd, WM_CLOSE, 0, 0
      mblnSuccess = True
   End If

   ' continue searching.
   EnumCallback = 1

End Function

And in a normal module:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test()


Dim m As New NotepadManager

m.startNotepad

m.focusNotepad

Sleep 2000

m.writeMessageToNotepad "My message"

Debug.Print "done"

End Sub

However, I've often found that ensuring you have window focus is the most difficult thing when you have a user interacting with the machine at the time.

like image 38
Orphid Avatar answered Dec 07 '25 03:12

Orphid