今だけ人気マンガ100円レンタル特集♪

新規にメモ帳を起動して、「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で行い、その後は×ボタンで消せる状態にしたいのですが、
どうすればいいか教えてください。

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAでメモ帳にコピペをしたいのですが…

おせわになります。
excelで、たとえば、A1~A3のセルをコピーして、メモ帳に貼り付けるというVBAを作りたいのですが、うまくいかないので、教えていただけないでしょうか。
Range("A1:A3").Select
Selection.Copy
a& = Shell("notepad.exe", vbNormalFocus)
AppActivate ("無題 - メモ帳")
…ここまでは書けてるんですが…が…

Aベストアンサー

こんばんは。

本格的には、APIで書くところでしょうけれども、簡単な方法では、以下のようなものがあります。おそらく、#1 さんのご指摘のように、私も環境によってかなり違ったような記憶があります。Excelから、クリップボードに入ったものが、外に排出しないという問題だったか、前面に来ないのだっか、何かあったように思います。(APIでは可能ですが、これらをまともに書くと、ものすごいコードになってしまいます)

以下は、XP でしか試していません。

Sub TestSendText()
  Dim ret As Long
  ActiveSheet.Range("A1:A3").Copy
  ret = Shell("Notepad.Exe", vbNormalFocus)
  AppActivate ("無題 - メモ帳")
  CreateObject("Wscript.Shell").SendKeys "^v"
End Sub

なお、リテラル値以外に「a&」という書き方は、あまりVBAではしません。間違いではありませんが。

こんばんは。

本格的には、APIで書くところでしょうけれども、簡単な方法では、以下のようなものがあります。おそらく、#1 さんのご指摘のように、私も環境によってかなり違ったような記憶があります。Excelから、クリップボードに入ったものが、外に排出しないという問題だったか、前面に来ないのだっか、何かあったように思います。(APIでは可能ですが、これらをまともに書くと、ものすごいコードになってしまいます)

以下は、XP でしか試していません。

Sub TestSendText()
  Dim ret As Long
 ...続きを読む

QEXCEL VBA ポップアップを表示する方法

ご質問させていただきます。

Sheet1のA2~A1701まで4桁の数字(各行で重複しない4桁の数字です)、
Sheet1のB2~B1701とSheet1のC2~C1701にはDDEで取り込んだリアルタイムデータ、
Sheet1のD2~D1701には、B2~B1701とC2~C1701のリアルタイムデータを使ってIF関数で条件判定をしてYESまたはNOを表示する関数式が入力されています。

やりたいことは、D列の条件判定でYESが表示された場合、YESが表示された行のA列の4桁の数字をポップアップで表示させることです。
このようなことはできるのでしょうか?
メッセージボックスを使えば良いのかもしれませんが、当方VBA初心者のためメッセージボックスの使い方がよく分かりません。
どなたか教えていただけないでしょうか?
よろしくお願いいたします。

Aベストアンサー

hoully様

 簡単な例で、下のようなものはいかがですか?
YESのたびに止まってしまいますが...
D列の条件判定がリアルタイムなのか、1701個のデータを取った後のバッチなのかわかりませんでした。
質問の意味を取り違えていたらごめんなさい。

Option Explicit
Dim i As Long
Sub 判定()
For i = 2 To 1701
If Cells(i, 4).Value = 1 Then MsgBox Cells(i, 1).Value ' 1 または"YES"
Next i
End Sub

 以上

QExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法

●やりたいこと
ExcelVBAで、APIを実行し、外部ソフトのウィンドウに含まれている
エディットテキストを取得して、セルに出力したい

使用する関数・宣言、できればコードを教えていただけませんでしょうか。

イメージはこちらをご参考いただけると幸いです。
​http://situmon-img.blogspot.com/2008/08/1.html​

変数hwindowに親ウィンドウのハンドルが取得されています。
エディットボックスのハンドル、IDは分かりません。


エディットボックスのハンドルを取得し、
分かっているクラス・ハンドルの文字列を取得
といった流れになるのではと思っております。

変数にさえ文字列が取得できれば、
当然ですが、Range("B2")=変数 で大丈夫です。
変数は、ひとつを使いまわしで構いません。
変数をエディットテキストの数だけ用意しても構いません。

Aベストアンサー

あの QNo.4256138の質問でも、同じ様な事を質問されていたと思います。
出来たらそちらで質問された方がよかったのではと思います。

テキストボックスの取得も、私の回答した全く同じ方法で
取得出来ると思います。クラス名が Edit になるだけです。

 EnumChildWindows(hWnd,lpEnumFunc,0&) は、親ウィンドウに含まれる

子ウィンドウがすべて返ってきます。ボタンもテキストボックスも、その他の
子ウィンドウがすべて、何個あっても、取得できます。

ただ EnumChildWindows(hWnd,lpEnumFunc,0&) で与える子ウィンドウを
受け取る関数は、コールバック関数なので、1回のコールで1個の子ウィンドウ
しか返ってきません。ただ、子ウィンドウがある分だけ何度も同じ関数が
呼び出されます。よび出される度に

 GetClassName(hWnd,lpClassName,nMaxCount) でクラス名を取得し

クラス名が Edit ならテキストボックスになります。

SendMessage(テキストボックスハンドル, &HD, 240, ByVal cbuf)

で cbuf にテキストボックスの文字が取得出来ます。

尚、cbuf は文字長を多い目に事前に確保しておきましょう。

cbufのNULL値までが実際の文字となります。

また、コールバック関数はデバッグモードで、ブレークさすと、
フリーズするので注意して下さい。通常はデバッグしにくいので、
コールバック関数内では、配列変数にハンドルをためこんでいきます。
その後で、配列にためこんでいるハンドルを順番にクラス名を取得し
テキストがボタンか判断していきます。

あの QNo.4256138の質問でも、同じ様な事を質問されていたと思います。
出来たらそちらで質問された方がよかったのではと思います。

テキストボックスの取得も、私の回答した全く同じ方法で
取得出来ると思います。クラス名が Edit になるだけです。

 EnumChildWindows(hWnd,lpEnumFunc,0&) は、親ウィンドウに含まれる

子ウィンドウがすべて返ってきます。ボタンもテキストボックスも、その他の
子ウィンドウがすべて、何個あっても、取得できます。

ただ EnumChildWindows(hWnd,lpEnumFunc,0...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qエクセルデータをメモ帳へ貼り付け

仕事で使うためのマクロを作成しているところです。

1.エクセルで作成したデータ(A列に何百行も入っています。1行目から最終行まで空白セルはありません)を上から20行コピー
2.メモ帳を起動して貼り付け
3.Cドライブの直下に『1.txt』として保存し、メモ帳を閉じる
4.1.でコピーした次の行から20行コピー
5.メモ帳を起動して貼り付け
6.Cドライブの直下に『2.txt』として保存

・・・と言うように繰り返していきたいのですがどうしたらいいのかわかりません。
色々調べると一つ一つの工程のマクロは見つけられるのですが、
理屈がわからない状態なので「こんな感じかな?」とそれぞれをつなげてもさっぱり動いてくれません。
どなたか上記の一連のマクロのやり方を教えては頂けないでしょうか?
また、できましたらどういう理由からそうなるのかも教えていただきたいと思います。
(仕事上、期限があるのでそう時間はないのですが、
勉強のためにその理屈から自力で作成したものと頂いた回答の答え合わせができたらなぁ。と考えております。)
わがままな要望で大変申し訳ありませんが、よろしくお願いします。

仕事で使うためのマクロを作成しているところです。

1.エクセルで作成したデータ(A列に何百行も入っています。1行目から最終行まで空白セルはありません)を上から20行コピー
2.メモ帳を起動して貼り付け
3.Cドライブの直下に『1.txt』として保存し、メモ帳を閉じる
4.1.でコピーした次の行から20行コピー
5.メモ帳を起動して貼り付け
6.Cドライブの直下に『2.txt』として保存

・・・と言うように繰り返していきたいのですがどうしたらいいのかわかりません。
色々調べると一つ一つの...続きを読む

Aベストアンサー

Sub Macro5()
Dim sht As Worksheet
Dim cnt, idx As Long
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Set sht = ActiveSheet
  On Error GoTo end0
  For idx = 1 To sht.Range("A65536").End(xlUp).Row Step 20
    cnt = cnt + 1
    ActiveSheet.Cells(idx, "A").Resize(20, 1).Copy
    Workbooks.Add
    ActiveSheet.Paste
    ActiveWorkbook.SaveAs Filename:="Z:\" & cnt & ".txt", _
      FileFormat:=xlText, CreateBackup:=False
    ActiveWorkbook.Close
  Next idx
end0:
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub

自作のマクロを掲載するならともかく、それをしないで注文ばかりされるのはいかがなものかと…

Sub Macro5()
Dim sht As Worksheet
Dim cnt, idx As Long
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  Set sht = ActiveSheet
  On Error GoTo end0
  For idx = 1 To sht.Range("A65536").End(xlUp).Row Step 20
    cnt = cnt + 1
    ActiveSheet.Cells(idx, "A").Resize(20, 1).Copy
    Workbooks.Add
    ActiveSheet.Paste
    ActiveWorkbook.SaveAs Filename:="Z:\" & cnt & ".txt", _
      FileFormat:=xlText, C...続きを読む

Q別のアプリケーションのテキストフィールドに入力する方法

他のアプリケーションのテキストフィールドがフォーカスを持っていて、そこにテンキーの「1」を入力した場合、「おはよう」と表示され、さらに改行コードも送れるプログラムを作りたいと思っています。

ヒントが掲載されているHPや書籍などの情報があれば教えていただきたいと思います。 また、お手数でなければ、具体的なコードも教えていただければありがたいです。

開発環境は VB6、OSはXP ProSP2 です。

Aベストアンサー

キーフックを使って作るのが王道のようですが、
どうもややこしそうなので思いついたソースだけ記述します。
質問者さんの思っている動きとは違うかもしれませんが、、。

以下ソースをVBで実行後、
Windows標準のメモ帳を起動し1を入力してみてください

'--------------以下貼り付けてください-----------------
Private Declare Function FindWindowA Lib "user32" (ByVal cnm As String, ByVal cap As String) As Long
Private Declare Function FindWindowExA Lib "user32" (ByVal hpar As Long, ByVal hchi As Long, ByVal cnm As String, ByVal cap As String) As Long
Private Declare Function SendMessageA Lib "user32" (ByVal hwd As Long, ByVal Msg As Long, ByVal wpara As Long, ByVal lParam As Any) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Const WM_GETTEXT = &HD
Const WM_SETTEXT = &HC

Private Sub Form_Load()

Dim hwd As Long, hwd_c As Long
Dim cap As String, ret As Long

cap = Space$(200)

Do

'メモ帳のハンドル取得
hwd = FindWindowA(vbNullString, "無題 - メモ帳")

'メモ帳のテキストハンドル取得
hwd_c = FindWindowExA(hwd, 0, "Edit", "")

'メモ帳のテキストを取得
ret = SendMessageA(hwd_c, WM_GETTEXT, 200, cap)

'メモ帳のテキストを検索
If InStr(1, cap, "1", vbTextCompare) > 0 Then
'1が入力されているなら置き換えて送信
Call SendMessageA(hwd_c, WM_SETTEXT, 0, "おはよう" & vbCrLf)
End If

DoEvents
Sleep (1000)

Loop

End Sub
'---------------------------------------------

'以下参考にしたURLです
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_t02.htm
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200606/06060083.txt

キーフックを使って作るのが王道のようですが、
どうもややこしそうなので思いついたソースだけ記述します。
質問者さんの思っている動きとは違うかもしれませんが、、。

以下ソースをVBで実行後、
Windows標準のメモ帳を起動し1を入力してみてください

'--------------以下貼り付けてください-----------------
Private Declare Function FindWindowA Lib "user32" (ByVal cnm As String, ByVal cap As String) As Long
Private Declare Function FindWindowExA Lib "user32" (ByVal hpar As Long, B...続きを読む

QEXCEL VBAから他アプリケーションを操作することは可能ですか?

こんばんは。

VBAの本を購入し勉強していますが、VBAと他アプリケーションとの連携について記載が少なく(txtやcsvファイル操作)、どこまで出来るんだろうという不安があり質問しました。

(1)EXCEL VBAから他アプリケーションを起動し、設定操作、命令を送り操作することは可能でしょうか?
イメージとしては他アプリに一方的に命令を送り操作できれば良しです。(アプリ側からのリターン要求はしません。)

(2)第2の質問です。
VBAで他アプリを起動した状態で人が操作している感覚でマウスを操作できますか?(利用方法:他アプリの●ボタンを押したい!!)
目の前にソフトがあるのに触る操作は出来ないものでしょうか?
いろいろ調べて見ましたが、この様な事例はありません。
駄目元ですが、こんな操作を知っていましたら教えてください。
こんな操作ができればいいな~

Aベストアンサー

#2,4 です。

> EXCEL2000内の特定のセルに規定値外のデータが入力された場合に
> UWSCを起動して...

UWSC のスクリプトが完成しているとすれば、起動オプション付きで
バッチ処理すれば良いでしょう。実行タイミングは、シートまたは
ThisWorkbook の Change イベントが使えます。

例)シートモジュール

Private Const EXE_PATHNAME As String = "C:\Program Files\uwsc\uwsc.exe"
Private Const DQ      As String = """"

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim rChange   As Range
  Dim sCommand  As String
  Dim sScriptFile As String

  ' // 実行する UWSC スクリプト
  sScriptFile = "C:\sample.uws"
  ' // UWSC の起動オプションは UWSC のヘルプを参照
  sCommand = DQ & EXE_PATHNAME & DQ & " " & _
        DQ & sScriptFile & DQ
  
  ' // 変更されたのが単一セルかつ A 列でなければ終了
  If Target.Cells.Count > 1 Then Exit Sub
  Set rChange = Intersect(Target, Columns("A"))
  If rChange Is Nothing Then
    Exit Sub
  End If
  
  ' // さらに値が TEST だった場合のみ実行
  If rChange.Value = "TEST" Then
    Shell sCommand, vbNormalFocus
  End If

End Sub

#2,4 です。

> EXCEL2000内の特定のセルに規定値外のデータが入力された場合に
> UWSCを起動して...

UWSC のスクリプトが完成しているとすれば、起動オプション付きで
バッチ処理すれば良いでしょう。実行タイミングは、シートまたは
ThisWorkbook の Change イベントが使えます。

例)シートモジュール

Private Const EXE_PATHNAME As String = "C:\Program Files\uwsc\uwsc.exe"
Private Const DQ      As String = """"

Private Sub Worksheet_Change(ByVal Target As Range)

  ...続きを読む

Qエクセルマクロで同じフォルダ内のテキストファイルをメモ帳で開く方法

「マクロを記述したエクセルファイルと同じフォルダにある、
特定のファイル abc.txt を、メモ帳で開く」ということをしたいのですが、マクロの記述をご教授下さい。

フォルダ名を固定すると、
Shell "notepad C:\--\abc.txt", vbNormalFocus
という形でできたのですが、
フォルダの名前は、固定ではなく、変わります。
ですので、フォルダ名が含まれると都合が悪くなってしまうんです。

エクセル2000、WINDOWS XP を利用しています。

どうぞよろしくお願いいたします。

Aベストアンサー

#1です。間違い。
Shell "notepad " & thisworkbook.Path & "\abc.txt", vbNormalFocus

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QエクセルVBAでメモ帳制御はできますか?

WIN98SEでエクセル2000を使用しています。

VBAで下記のことは可能でしょうか?

1.エクセルで作成したデータ(文字列のみ)をメモ帳(Notepad)に貼り付けたい。

2.データを貼り付けた後のメモ帳を、名前を付けて保存したい。

Shellを使ってメモ帳を起動するまでは出来たのですが、Copyしたデータを貼り付けることが出来ずに困っています。
どういった方法が有るのか教えていただけないでしょうか?宜しくお願いします。

Aベストアンサー

こんにちは。maruru01です。

メモ帳に貼り付けるのではなく、メモ帳で開かれた新規テキストファイルに貼り付けるということですね。
それなら、Openステートメントでデータを新規テキストファイルに書き出せばいいと思います。
そのテキストファイルの内容をメモ帳で表示したいなら、ファイル名を付けてメモ帳をShell関数で起動させればいいでしょう。
Openステートメントについては、
「Open」「Output」「Close」「Print」
などでヘルプで検索して下さい。


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

人気Q&Aランキング