ちょっと先の未来クイズ第4問

新規にメモ帳を起動して、「test」と入力したいです。そして保存はしたくないです。

Sub Sample()
Dim rc As Long
rc = Shell("notepad.exe", vbNormalFocus)
End Sub


これだと、新規にメモ帳は起動できますが、書き込みができません。

Sub Sample2()
Dim strList As String
Dim adoSt As ADODB.Stream

Set adoSt = CreateObject("ADODB.Stream")
With adoSt
.Type = adTypeText
.Charset = "UTF-8"
.Open
End With

adoSt.WriteText "test", adWriteLine
adoSt.SaveToFile "c:\test.txt", adSaveCreateOverWrite
adoSt.Close
Set adoSt = Nothing
End Sub


これだとメモ帳を作成して書き込めますが、保存されてしまいます。

新規にメモ帳を起動→文字を書き込む
までをvbaで行い、その後は×ボタンで消せる状態にしたいのですが、
どうすればいいか教えてください。

A 回答 (3件)

メモ帳をイミディウェイトウィンドウ代わりに使ってやろうかと以前に作成したものです。


・メモ帳のウィンドウサイズを小ぶりに設定し、最前面表示させています。
・二重起動するとおかしな事になりますが、未対策です。
ご参考まで。

使用例
☆標準モジュール
Sub test()
Dim myDebug As myDebugPrintClass

Set myDebug = New myDebugPrintClass
myDebug.debugprint "てすと"
myDebug.debugprint "ついき"
End Sub

☆クラスモジュール myDebugPrintClass
※VBEで挿入/クラスモジュールで生成されるClass1に貼り付けて、Class1から改名して下さい。
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
(ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _
ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal Msg As Long, wParam As Long, lParam As Long) As Long
Private Declare Function SendMessageAny Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal Msg As Long, wParam As Long, lParam As Any) As Long
Private Declare Function MoveWindow Lib "USER32" _
(ByVal hWnd As Long, ByVal x As Long, ByVal y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Private Declare Function SetWindowPos Lib "USER32" _
(ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function SetFocusAPI Lib "USER32" Alias "SetFocus" (ByVal hWnd&) As Long

'Edit Control 制御用定数
Private Const EM_GETSEL = &HB0 '選択開始位置と終了位置の取得
Private Const EM_SETSEL = &HB1 '選択開始位置と終了位置の設定
Private Const EM_REPLACESEL = &HC2 '選択文字列を指定の文字列に置換
Private Const WM_SETTEXT = &HC 'テキストの設定
Private Const WM_GETTEXT = &HD 'テキストの取得
Private Const WM_GETTEXTLENGTH = &HE 'テキストの長さの取得(NULLを含まず)
Private Const WM_IME_CHAR = &H286
Private Const SWP_NOMOVE = 2
Private Const SWP_NOSIZE = 1
Private Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2

Private lnghWnd As Long 'hWnd of top level (Parent) window
Private lnghWndTarget As Long 'hWnd of target (Child) window
Private myText As String

Private Sub Class_Initialize()
Dim lngRc As Long

lngRc = Shell(Environ("WINDIR") & "\NOTEPAD.EXE", vbNormalFocus)
Sleep 100
lnghWnd = FindWindowEx(0, 0, "Notepad", "無題 - メモ帳")
lnghWndTarget = FindWindowEx(lnghWnd, 0, "Edit", "")
lngRc = SetWindowPos(lnghWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
lngRc = MoveWindow(lnghWnd, 0, 10, 300, 200, 1)
End Sub

Public Sub debugprint(newValue As Variant)
Dim lngRc As Long
Dim ndx As Long
Dim newText As String

If TypeName(newValue) = "String" Then
newText = newValue
Else
newText = CStr(newValue)
End If
'Editへの追記
ndx = SendMessage(lnghWndTarget, WM_GETTEXTLENGTH, 0, 0&)
If ndx <> 0 Then
SetFocusAPI lnghWndTarget
lngRc = SendMessage(lnghWndTarget, EM_SETSEL, ndx, ndx)
newText = vbCrLf & newText
lngRc = SendMessageAny(lnghWndTarget, EM_REPLACESEL, 0, ByVal newText)
Else
lngRc = SendMessageAny(lnghWndTarget, WM_SETTEXT, 0, ByVal newText)
End If
End Sub
「新規にメモ帳を起動して、「test」と入」の回答画像3
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2013/05/30 22:24

後半のソース


> これだとメモ帳を作成して書き込めますが、保存されてしまいます。

なぜ
> adoSt.SaveToFile "c:\test.txt", adSaveCreateOverWrite
は必要なんですか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2013/05/30 22:24

メモ帳は使いたいわけなんですよね?


たとえばメッセージボックスで表示するのは却下?

1案のメモ帳を立ち上げてからだと
Sendkeys で文字列を送る方法がありますが
タイミングが合わないと全く別の所へ送ってしまうことがあります。
また、NumLock キーが外れる場合があるのはよくしられた事です。
Sub NoteP()
Dim rc As Long
rc = Shell("notepad.exe", vbNormalFocus)
Application.Wait (Now + TimeValue("0:00:1"))
SendKeys "test"
End Sub
この場合だと×点で閉じようとすると保存するか聞いてきます。

2案でしたらメモ帳で開いた後にファイルを Kill してしまえば
×点で閉じようとした場合に確認メッセージは出ません。

前略
adoSt.Close
Set adoSt = Nothing
Shell("notepad.exe" & " " & "c:\test.txt")
kill "c:\test.txt"
End Sub
用途に合わせてどうぞ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

お礼日時:2013/05/30 22:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A