出産前後の痔にはご注意!

一年くらい前に作ったSendkeyを含んだマクロをまた使うことになりました。
再使用してみると、他のコードの部分は正常なのにSendkeyの部分だけが正常作動せず、空打ちしたように変化しないまま次のコードに移ります。

Excel2003使用ですが、Excel97の入った他のPCでやっても同じ現象が起こります。
そこで、テストにヘルプのSendkey例文をVBEに貼り付けてみましたが、やはりその部分だけ作業せず先へ進んでしまいます。
Sendkeyの行では、不適切なキーをキーボードから打った時によく鳴るビービーという音がPCから聞こえてきます。

自分が基本的な操作を1つ忘れているのじゃないかと思うのですが、それが何なのか見当が付きません。
なにかお気づきの点はないでしょうか?
キーロガーを防止の為、ウィルスソフトがはねているのかと思いOFFにしてみましたが、関係ありませんでした。


テストした例文は下記です。
Sub x()

Dim ReturnValue, I
ReturnValue = Shell("CALC.EXE", 1)
AppActivate ReturnValue
For I = 1 To 20
SendKeys I & "{+}", True
Next I
SendKeys "=", True
SendKeys "%{F4}", True
End Sub

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

A 回答 (2件)

こんばんは。



>Sendkeyステートメントがどんな仕組みなのか全く知らないので原因が分からないです。

私も、動かない現象自体は、私も悩まされてきた経験はあります。それが、以下で出すようなコードです。もし、動かないとすれば、常駐しているソフトには違いないのですが、セキュリティソフトではなさそうなのです。(以前、試した範囲です)

ただし、ステップインではうまく行かないことがあります。

>MS-IMEは削除しATOKにているのでその影響かも知れないです。

私の知っている範囲ですと、ATOK は、MS-Office に入り込むような仕組みにはなっているのですが、Sendkey が動かないということは、ちょっと、今のところ想像がつきませんね。

それで、昔、やっていた方法を披露しておきます。
しょせん、Sendkeyは、どこから送ろうが関係ないから、VBScript のExcel外部から動かす方法を私は考えました。

>これは一度キーボードのソフトに渡されてそこから目的のアプリケーションへキーが送られているんでしょうか。それともVBAから直接にアプリケーションに送られているんでしょうか。

それは、VBAから、ほんの短い間、バッファに入って、送られるようですね。
その理由は、外部ソフトによっては、まとめて、2段階の処理でも、キーの処理は1回でまとめて送っても、2段階の動作が動くからです。

逆に、バッファ自体が、何かで阻止されるか、チェックを受けるようにされていれば、確かに動きません。セキュリティソフトの種類かな?

それと、おっしゃるような、「一度キーボードのソフトに渡されてそこから目的のアプリケーションへキーが送られている」という、別のテクニックがあったはずですが、私は、正直なところ、VBAで、そこまでするのかなって思いがあって、あまり追求していないのです。


Dim ReturnValue, I
ReturnValue = Shell("CALC.EXE", 1)
AppActivate ReturnValue

With CreateObject("Wscript.Shell")
For I = 1 To 20
 .SendKeys I & "{+}", True
Next I
 .SendKeys "=", True
 Application.Wait Now() + TimeValue("00:00:05")
 .SendKeys "%{F4}", True
End With


ところで、念のためなのですが、これらの一連のコードは、私は、VBE からです。ワークシートからではないのです。それと、ちょっと表現が分かりにくいかもしれませんが、Excel自体は、静的な状態でマクロを動かしています。自動保存や時間で動くようなツールは、一切ありません。
    • good
    • 3
この回答へのお礼

たびたびすみません。
教えていただいたWscriptを使うとうまくいきました。
こういう解決法があるんですね。
よく分かりませんが、Excelでなく外から送ってやれば動くという事なんでしょうね。
去年このマクロを作った時は正常だったので、その後のインストールとか設定変更の影響なんだろうと思います。
有り難うございました。

お礼日時:2007/05/19 15:14

こんばんは。



>AppActivate ReturnValue

もし、うまくいかないとすると、その部分ですね。
途中で、どこかに触って、Excelに戻ってきてしまっているかもしれません。

場合によったら、こういう方法もありかと思います。
 AppActivate "電卓"

こちらでは、元のコードは成功はしているものの、本来は、実践では、うまく行かないことが多いようです。実は、私の作ったマクロは、ExcelとIEを行き来するものですが、だいぶ、試行錯誤を重ねてしまいました。Win32 API 自体は面倒なので、使いたくなかったこともあるのですが。

なお、Wait を入れないと、そのコードが生きているか分かりませんね。

Application.Wait Now() + TimeValue("00:00:05")
SendKeys "%{F4}", True  'ここの手前にWait を入れます。

この回答への補足

Wendyさんこんばんは。
アドバイス有り難うございます。

AppActivate ReturnValueを含めSendkey以外は正常に実行されます。
タイムウェイトでもステップインでもSendkeyのみ効かない状態で進みます。
一年前は旨くいったので、何か環境変化のせいだと思うのですが、何が影響しているのか分かりません。
Sendkeyステートメントがどんな仕組みなのか全く知らないので原因が分からないです。。
これは一度キーボードのソフトに渡されてそこから目的のアプリケーションへキーが送られているんでしょうか。それともVBAから直接にアプリケーションに送られているんでしょうか。
キーボードドライバやIMEが関係してくるなら、今MS-IMEは削除しATOKにているのでその影響かも知れないです。全くのシロウト考えですが。

補足日時:2007/05/17 23:40
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

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

Q【sendkeysメソッドが動かずに苦慮しております】

【sendkeysメソッドが動かずに苦慮しております】

OS:2000
Excel:2003
VB:6.5

こんにちは。
sendkeysメソッドが動かずに苦慮しております。
ネットでいろいろ調べてみましたが、やはり正常に動かすのは難しい様です。
実際、何をしたいのかと言うとプリンターの出力時の設定を変更したいと思っております。
会社のプリンターですが方針でデフォルトが「両面」「2分割」で設定されております。
ただ複数ファイルの跨ったプレゼン資料などを大量に出力する際は「片面」「分割なし」
で設定を変更してプリントアウトしたいと思っており、いろいろ調べた結果Sendkeysを
使うことにいたしました。
ただ、先に申し上げた通りsendkeysメソッドが動かず悩んでおります。
素人の不躾けなご質問で大変申し訳ありませんが、解決できる方法をご存知の方ご教授ください。
sendkeysメソッドを使わない方法でも問題ありません。
以下、ダイアログを表示させ、タブを移動させるまでのコードです。
それではどうぞよろしくお願いいたします。


Sub AAA()

Dim FOS As FileSystemObject
Dim FolderC As Folder
Dim FilesC As Files
Dim FileC As File
Dim FileName, Path_Name As String

Set FOS = CreateObject("scripting.filesystemobject")
Set FolderC = FOS.GetFolder("C:\Documents and Settings\AAAAA\デスクトップ\TEST")
Set FilesC = FolderC.Files

Path_Name = "C:\Documents and Settings\AAAAA\デスクトップ\TEST\"

For Each FileC In FilesC

FileName = FileC.Name

Workbooks.Open FileName:=Path_Name & FileName
ActiveWorkbook.Worksheets(1).Select

With Application
.SendKeys "^{P}", True
.SendKeys "%r", True
.SendKeys "^{tab}", True
.SendKeys "{tab 3}", True
End With


ActiveWorkbook.Close False

Next


Set FOS = Nothing


End Sub

【sendkeysメソッドが動かずに苦慮しております】

OS:2000
Excel:2003
VB:6.5

こんにちは。
sendkeysメソッドが動かずに苦慮しております。
ネットでいろいろ調べてみましたが、やはり正常に動かすのは難しい様です。
実際、何をしたいのかと言うとプリンターの出力時の設定を変更したいと思っております。
会社のプリンターですが方針でデフォルトが「両面」「2分割」で設定されております。
ただ複数ファイルの跨ったプレゼン資料などを大量に出力する際は「片面」「分割なし」
で設定を変更してプリント...続きを読む

Aベストアンサー

追伸
Domain環境下か何かですかね?
プリンタの追加(インストール)が出来ないとなると・・・。出来ないんですよね?
SendKeysは正直当てにあてにならないことがたまに有って使いたくないのですが
適当に時間稼ぎを入れてみては?
標準モジュールに下記をコピペ
'ミリセカンドで停止 sleep 300 など
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub AAAのSendKeysの前後行にSleep 500 とか適当にいれて様子を見てください。

余談ですが
SendKeysの代わりにAPIを使って行う方法も有るようです。
『keybd_event Lib "user32"』でGoogleって見てください。
今回の件に関して有効かどうかは分かりません。
あとは会員制(無料)ですが『moug』でお尋ねされるとか?同じくGoogleにて検索
APIでプリンタ設定の操作のヒントを得られるかも?
私からは此処までです。

QVBAでの SendKeysの変数指定方法

エクセルVBAで、マクロを作成中なのですが、
別のアプリケーションを動作させなくてはいけないため、
SendKeysを使用します。

この SendKeys "○○○"で、
コマンドや文字を指定することは、できますが、
エクセルのある決まったセルに入っている文字をそのまま、
ここに指定(つまりは、変数)するのには、どういう記述方法になりますか?

例えば、A1のセルに「XYZ」と入っていたら、
SendKeys "XYZ"と送るイメージになりますが、このXYZ部分を、
A1セルの文字という変数にしたいです。

いろいろ調べたのですが、わかりませんでした。
すみませんが、みなさん、よろしくお願いいたします。

Aベストアンサー

そのままですよ。

 Application.SendKeys Range("A1")

でいけます。

QvbaでIEの名前を付けて保存(A)をしたい

VBA で IEの通知バー を操作したいです。
SendKeys で 通知バーの 保存(S) はできたのですが、
保存(s)の右隣の ▼ をクリックするとでてくる、 名前を付けて保存(A) の方法がわかりません。

どのようなキーをおくればよいのでしょうか。


他の質問をみると、SendKeysではなく ○○がよいですよ みたいな内容しか見つからず、
回答をみつけることができなくて困っておりますのでよろしくお願いいたします。

Aベストアンサー

VBAでインターネット上のファイルをダウンロードする方法をまとめてみました。 | 初心者備忘録
http://www.ka-net.org/blog/?p=4855
とか。

QAppActivateの使い方

現在開いているエクセルファイルをアクティブにしたいです。
バージョンは2003です。

アクセスVBAから
Sub test()
Dim rc As Long
rc = Shell("C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE", 1)
AppActivate "aaa.xls"
End Sub

を実行すると、
新規にアプリケーションが開いて、空のBOOK1が表示されます。
本当は、aaa.xlsをアクティブにしたいのですがうまく出来ません。

aaa.xlsは既に開いている状態です。
aaa.xlsはデスクトップにあります。

http://officetanaka.net/excel/vba/statement/AppActivate.htm
を見ながらやってみたのですがうまく出来ません。

新たなアプリケーションは立ち上げたくないけど
aaa.xlsはアクティブにしたいです。

Aベストアンサー

Win7 + Office2010 では下記のような感じで動きました。
aaa.xls を開いてなければ開き、
開いていたら、そのExcelアプリを最前面にして、
aaa.xls をアクティブにしてます。
こちらでは、aaa.xlsを単独で開いていた場合に、
AppActivateでは、プロシージャの呼び出し、または引数が不正です
になってしまいます。
環境に依存する部分が有りそうなので下記でも不十分かもしれません。

Sub てすと()
Dim myXL As Object
Dim myXLPath As String
Dim myXLName As String
Dim WSH As Object

Set WSH = CreateObject("WScript.Shell")
myXLPath = WSH.specialfolders("desktop")
myXLName = "aaa.xls"

If Dir(myXLPath & "\" & myXLName) = "" Then
MsgBox myXLPath & "\" & myXLName & " は見つかりません"
Set WSH = Nothing
Exit Sub
End If

Set myXL = GetObject(myXLPath & "\" & myXLName).Parent
myXL.Visible = True

If myXL.activeworkbook.Name = myXLName Then
myXL.workbooks(myXLName).Activate
Else
myXL.workbooks.Open (myXLPath & "\" & myXLName)
End If

myXL.UserControl = True
Set myXL = Nothing: Set WSH = Nothing
End Sub

Win7 + Office2010 では下記のような感じで動きました。
aaa.xls を開いてなければ開き、
開いていたら、そのExcelアプリを最前面にして、
aaa.xls をアクティブにしてます。
こちらでは、aaa.xlsを単独で開いていた場合に、
AppActivateでは、プロシージャの呼び出し、または引数が不正です
になってしまいます。
環境に依存する部分が有りそうなので下記でも不十分かもしれません。

Sub てすと()
Dim myXL As Object
Dim myXLPath As String
Dim myXLName As String
Dim WSH As Object

Set WSH = CreateObject...続きを読む

QExcelVBAでスペースキー操作したい

sendkeysで、他のアプリケーションにキー操作を送りたいのですが、チェックボックスをオンにするときの【スペースキーを押す】という操作がうまくいきません。
sendkeys "{SPACE}",true ではだめなのでしょうか?
よろしくお願いします。

Aベストアンサー

こんにちは。

> キー操作を送りたいのは、ある大手メーカー製のERPシステムです

そうですか....SendKeys は、

 1. ウインドウがアクティブでないとダメ

   PC によって処理速度が異なります。例えば、ウインドウが開い
   てアクティブになるまでの速さ。開発時のPC は 1 秒待ってから
   SendKeys ..で良かったはずなのに、別 PC では 5 秒待たなけれ
   ばならなかった...ということですね。SendKeys でキー送信して
   もウインドウが開いてないんです。一例です。

   つまり、開発時の PC と同様の動作は別 PC で保証されません。

 2. 2000系OS で Numlock が解除される(今はどうなんだろ?)

などの問題があって、限られた用途「自分しか使わない」のであれば良い
のですが、基本的にオススメできません。SendKeys は最後の手段として
位置づけるのが良いと私は思います。

 # 困ったときの SendKeys でもあるんですけどね(´(・)`)

Excel VBA を使う理由が特になければ、Wendy02 さんオススメの UWSC が
私も良いと思います。

どうしても VBA で...というのであれば、PostMessage などの API を
使うことを考えてみて下さい。この場合、ウインドウがアクティブなのか
どうかは関係なく他アプリケーションを操作可能です。

以下はメモ帳(WinXP付属)を VBA で操作するテストコードです。要は、
ハンドルさえ拾えれば大抵のことは SendKeys でなくとも可能です。
ご参考までに...

Option Explicit

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
   ByVal lpClassName As String, _
   ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
   ByVal hWnd1 As Long, _
   ByVal hWnd2 As Long, _
   ByVal lpsz1 As String, _
   ByVal lpsz2 As String) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _
   ByVal hWnd As Long, _
   ByVal wMsg As Long, _
   ByVal wParam As Long, _
   ByVal lParam As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" ( _
   ByVal dwMilliseconds As Long)

Private Const WM_CHAR As Long = &H102
Private Const WM_COMMAND As Long = &H111
Private Const WM_CLOSE As Long = &H10
Private Const BM_CLICK As Long = &HF5&
Private Const BM_SETCHECK = &HF1
Private Const BST_CHECKED As Long = &H1
Private Const BST_UNCHECKED As Long = &H0

Public Sub Sample()
  
  Dim hWnd   As Long
  Dim hWnd_C  As Long
  Dim hWnd2  As Long
  Dim hWnd2_C As Long
  Dim strtSend As String
  Dim i    As Long
    
  ' クラス名とウインドウ構成は VB 付属の Spy++ で調べました。
  ' VECTOR などにも似た様なフリーツールは在ります

  ' メモ帳起動
  MsgBox "他アプリケーション制御のサンプルです。メモ帳を起動します"
  Application.Visible = False
  Shell "Notepad.exe", vbNormalNoFocus
  
  ' メモ帳のウインドウハンドルを取得
  hWnd = FindWindow("Notepad", "無題 - メモ帳")
  ' メモ帳の文字入力部のコントロールハンドルを取得
  hWnd_C = FindWindowEx(hWnd, 0&, "Edit", vbNullString)
  
  ' 文字列送信テスト
  strtSend = "教えて!Goo."
  MsgBox "メモ帳に文字列「" & strtSend & "」を送信します"
  For i = 1 To Len(strtSend)
    Call PostMessage(hWnd_C, WM_CHAR, Asc(Mid$(strtSend, i, 1)), 0&)
  Next i
  
  ' メモ帳のメニューをクリックし「検索」ダイアログを表示
  ' 「検索」のコマンドID 21 はリソースハッカーを使って調べました
  
  MsgBox "続いて検索ダイアログを表示します", vbInformation
  Call PostMessage(hWnd, WM_COMMAND, 21&, 0&)
  ' ダイアログが開くのを待つ(適当 500ミリ秒)
  Sleep 500&
  
  ' 検索ダイアログウインドウハンドル
  hWnd2 = FindWindow("#32770", "検索")
  ' チェックボックスのハンドル取得
  hWnd2_C = FindWindowEx(hWnd2, 0&, "Button", "大文字と小文字を区別する(&C)")
    
  MsgBox "チェックボックスを ON にします"
  Call PostMessage(hWnd2_C, BM_SETCHECK, BST_CHECKED, 0&)
  
  MsgBox "チェックボックスを OFF にします"
  Call PostMessage(hWnd2_C, BM_SETCHECK, BST_UNCHECKED, 0&)
  
  MsgBox "検索文字を送信してみます"
  hWnd2_C = FindWindowEx(hWnd2, 0&, "Edit", vbNullString)
  For i = 1 To Len(strtSend)
    Call PostMessage(hWnd2_C, WM_CHAR, Asc(Mid$(strtSend, i, 1)), 0&)
  Next i
  
  MsgBox "[キャンセル]ボタンをクリックします"
  hWnd2_C = FindWindowEx(hWnd2, 0&, "Button", "キャンセル")
  Call PostMessage(hWnd2_C, BM_CLICK, 0&, 0&)
  
  MsgBox " メモ帳を閉じます.[保存しますか?]ダイアログは手動で閉じて下さい."
  Call PostMessage(hWnd, WM_CLOSE, 0&, 0&)

  Application.Visible = True

End Sub

こんにちは。

> キー操作を送りたいのは、ある大手メーカー製のERPシステムです

そうですか....SendKeys は、

 1. ウインドウがアクティブでないとダメ

   PC によって処理速度が異なります。例えば、ウインドウが開い
   てアクティブになるまでの速さ。開発時のPC は 1 秒待ってから
   SendKeys ..で良かったはずなのに、別 PC では 5 秒待たなけれ
   ばならなかった...ということですね。SendKeys でキー送信して
   もウインドウが開いてないんです。一例です。

   ...続きを読む

QWebページ中の javascript をVBAから実行するには

VBAで objIE を使用して Webページ中の javascript を実行したいのですが、
onclick="~~" の記述がないケースがあり困っております。
例えば以下のような記述です。

<a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>

onclick の記述がない上記のようなケースでは、javascript の呼び出しはどのようにすればよいのでしょうか?
不可能でしょうか?

Aベストアンサー

ここを読んでみればよいのですが、だらだらと文章が長いですね。^^;
http://www.ken3.org/vba/backno/vba170.html
この内容のまとめは、この後でします。もし、ダメだったら、こちらも読んでください。

>onclick="~~" の記述がないケースがあり困っております。

最初に、ストレートな回答ではありませんが、私の場合、いくつかの方法を試しています。

>a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>
この場合は、id がありますから、確実のオブジェクトとして取得できますから、まず最初に、ダメ元で、
id名.Click を一度試してみます。もしくは、この行の上部のコードのオブジェクトのClass名のオブジェクトのひとつから、ヒットさせようとします。

そこでダメなら、ということで、ken3の内容に入るのですが、この著者の結論(正解)は、

ご質問に沿って書くと
For i =0 To objIE.Document.links.Length -1
If objIE.Document.links(i).href ="javascript:;" Then '文字の比較は、大文字・小文字がある
   objIE.Document.Links(i).Click
End if
Next i

ということになっています。私は、このコードは少し古臭く感じます。

ここで、ken3 の所では、Testサイトを用意してくれているので、試してみましたが、ダイレクトでサイトがとれている限りは、やはり、

Testサイト:http://www.ken3.org/vba/test170f.html

 objIE.Navigate "javascript:xxxxx;"

が利くことが分かりました。ただし、実際は、ここで時間待ちをしなくてはならないでしょう。
解説は、フレームからですので、うまく行かなかったようです。

ここを読んでみればよいのですが、だらだらと文章が長いですね。^^;
http://www.ken3.org/vba/backno/vba170.html
この内容のまとめは、この後でします。もし、ダメだったら、こちらも読んでください。

>onclick="~~" の記述がないケースがあり困っております。

最初に、ストレートな回答ではありませんが、私の場合、いくつかの方法を試しています。

>a href="javascript:;" pnb="~~" scdaction="~~" bulkaction="~~" id="~~">~~</a>
この場合は、id がありますから、確実のオブジェクトとして取得できますか...続きを読む

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)

  ...続きを読む

QWEBページからのメッセージをVBAで

いつもお世話になっております。
エクセルVBAでIE制御についてです。
環境はWIN7、IE 9or11とエクセル2010です。

あるページのリンクをクリックすると、
WEBからのメッセージというダイアログボックスが出てきて、
続行しますか? はい いいえ を聞かれます。

その「はい」をVBAで押したいのですが、
sendkeysメソッドで押そうとしてもうまくいきません。

以下に記載したサイトのOKボタンを押すと出てくるものです。
http://kamicha1.web.fc2.com/Excel/Test20090726.html


以下が書いたコードです。


Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long)


Sub test()

Dim ie As Object

Set ie = CreateObject("InternetExplorer.Application")

ie.Visible = True
ie.navigate "http://kamicha1.web.fc2.com/Excel/Test20090726.html"
      
Do While ie.Busy Or ie.readyState < 4
DoEvents
Loop

ie.document.getElementsByClassName("bt2")(0).Click '-ここで止まる

Sleep 2000

SendKeys "{Enter}"

End Sub

ステップ実行していくと、ここで止まると書いた所で、
IE上にダイアログは表示されるのですが、
それ以上ステップ実行ができなくなってしまいます。

ダイアログを自分でOKかキャンセルで消すと続きが動くようになります。
その間はVBEはビジー状態となり操作できません。

そのためそれ以降のsendkeysメソッドに
たどり着けない状況かと思われます。

いろいろ調べたところIE8以降はダイアログボックスは
IEから出ているのではなくOS?から出ているとの事でした。

上記のサイトはHTML本体にjavaスクリプトが記載されており、
それをVBAから操作すればどうにかOKボタンが押せるらしいのですが、
自分が操作したいページにはそれらしき記載がありませんでした。

対象のアンカータグは
<a herl=URL 中略 data-comfirm=続行しますか? >
のような感じで記載がありました。

完全に煮詰まっております。
自動でOKをクリックするかEnterキーでOKを押すでも構いません。
どうかご教授お願いいたします。

いつもお世話になっております。
エクセルVBAでIE制御についてです。
環境はWIN7、IE 9or11とエクセル2010です。

あるページのリンクをクリックすると、
WEBからのメッセージというダイアログボックスが出てきて、
続行しますか? はい いいえ を聞かれます。

その「はい」をVBAで押したいのですが、
sendkeysメソッドで押そうとしてもうまくいきません。

以下に記載したサイトのOKボタンを押すと出てくるものです。
http://kamicha1.web.fc2.com/Excel/Test20090726.html


以下が書いたコードです。


Dec...続きを読む

Aベストアンサー

ご参考
https://gist.github.com/kumatti1/4028479

QVBAからIEを操作する時のウィンドウの選択の仕方がわかりません

VBAで、webページを操作するマクロを組んでいます。
具体的な手順としては、セルの商品番号をweb上の検索ボックスに入力して、別ウィンドウで開いた情報を「すべて選択」「コピー」してexcellの別シートに「貼り付け」までを行うものなのですが、
別ウィンドウで開いたページに対して、Sendkeysを行うにはどうやったらいいのでしょうか。
仮に、入力ページをA、結果ページをBとしたとき、Aに対しての入力とBページの表示までは出来ているのですが、Bページに対しての操作が出来ません。

ちなみに、事情があってwebクエリはあえて使っていません。
どなたか、いい解決方法・プロシージャをご存知でしたらよろしくお願いします。

Aベストアンサー

こんにちは。KenKen_SP です。

検索フォーム経由ではなく、検索結果のページをコードで直接開けないですか?
例えば、教えてGooなら

http://oshiete1.goo.ne.jp/kotaeru.php3?q=


URL の後ろに ? マークがあります。この記号以下は CGI に渡すパラメータです。
q= の後ろに質問番号が入りますので、予め質問番号が分かっている場合は、
この URL に質問番号を連結してやれば、直接開くことができます。

仮に、質問番号が A1 セルに入っているなら

IE.Navigate "http://oshiete1.goo.ne.jp/kotaeru.php3?q=" & Range("A1").Value

みたいなコードで検索結果ページを開くことができると思います。同様に、商品番号
を渡すパラメータがあるはずですから、探して見て下さい。CGI にパラメータを渡す
方法が Get でも Post の場合でも検索フォームの HTML ソースを見れば分かります。

取り合えず、一度検索フォームの HTML ソースを見てみましょう。

これが可能なら、コードで IE オブジェクトを作り、直接検索結果のページを開くこ
とができますので、IE のウインドウハンドルやウインドウタイトルは簡単に取得
できます。

簡単な例です。A1 セルの値を Google で検索し、結果を A5 セルに貼り付けます。


Option Explicit

Private Declare Function SetForegroundWindow Lib "user32.dll" ( _
  ByVal hWnd As Long _
) As Long
  
Sub Sample()

  Dim IE   As Object
  Dim strURL As String
  Dim lngRet As Long
  
  Const READYSTATE_COMPLETE = &H4
  
  strURL = "http://www.google.com/search?hl=ja&lr=lang_ja&ie=Shift_JIS&q="
  strURL = strURL & Range("A1").Value
   
  Set IE = CreateObject("InternetExplorer.application")
  IE.Visible = True
  IE.navigate strURL
  Do
    DoEvents
  Loop Until Not IE.Busy And IE.readyState = READYSTATE_COMPLETE
  
  ' IE のウインドウをアクティブにする
  lngRet = SetForegroundWindow(IE.hWnd)
  If lngRet <> 0 Then
    ' アクティブにできたらキー送信して結果をコピー
    SendKeys "^a", True
    SendKeys "^c", True
    ' 貼り付け
    Range("A5").Select
    ActiveSheet.Paste
  End If
  Set IE = Nothing

End Sub

どうしても検索フォームを経由し、新しい IE を開く必要がある場合は、
参考 URL 先の記事が参考になると思います。

参考 URL: http://www.ken3.org/cgi-bin/group/vba_ie.asp

ちなみに、SendKeys を使わない方法としては、IE.Document.body.innerHTML
で HTML ソースは取得し、クリップボードに転送してからペースト、、

というのでも良いかもしれません。

では。

こんにちは。KenKen_SP です。

検索フォーム経由ではなく、検索結果のページをコードで直接開けないですか?
例えば、教えてGooなら

http://oshiete1.goo.ne.jp/kotaeru.php3?q=


URL の後ろに ? マークがあります。この記号以下は CGI に渡すパラメータです。
q= の後ろに質問番号が入りますので、予め質問番号が分かっている場合は、
この URL に質問番号を連結してやれば、直接開くことができます。

仮に、質問番号が A1 セルに入っているなら

IE.Navigate "http://oshiete1.goo.ne.jp/kot...続きを読む

QメッセージボックスのOKボタンをVBAでクリックさせたい

EXCELの1つのブックに2つのマクロを組んでいます。

普段は1つ目のマクロを実行したあと、処理結果を確認してから
2つ目のマクロを動かしています。

※1つ目のマクロ終了時に、完了のメッセージボックスが出ます。



この2つのマクロを、自動で処理するためのマクロを
作ろうとしていて、

1.1つ目のマクロを実行
2.処理完了のメッセージボックスのOKをクリック
3.2つ目のマクロを実行

という流れで処理しようと思っています。


今、メッセージボックスのOKボタンをVBAでクリックする方法がわからなくて
調べているのですが、お分かりになる方いらっしゃいましたら
教えていただけませんでしょうか。



例えば、1つフラグを作って、そのフラグが立っている時は
メッセージボックスを出さないような制御は出来るのですが、
今回は、メッセージボックスをクリックする方法が
知りたいと思っています。


よろしくお願いいたします。

Aベストアンサー

無理です
MsgBox自体がモーダルで表示されるので MsgBoxからExcelへ処理が戻ってこない限りExcelからの制御が不能になります

フラグを作って MsgBoxの表示、非表示を切り替えるほうが現実的です


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

人気Q&Aランキング