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

■やりたいこと
VBA+SeleniumでGoogle Chromeを操作したい


■参考にしたサイト

VBA Seleniumを利用してWeb情報を取得(利用準備編)
http://www.dn-web64.com/archives/web/vba-selenium/

Google Chrome, Excel VBA, Seleniumbasicを使ったスクレイピング
https://qiita.com/redsil/items/046243dd26b7aa8f3 …

【VBA】VBA初心者がVBAからSeleniumを使ってみる
https://www.aipacommander.com/entry/2016/02/02/1 …


■状況
上記3つのサイトを参考に、作業をしましたが、いずれもやりたいことができませんでした。
エラー内容は共通して、

driver.Get "http://www.yahoo.co.jp/"

このコードで、添付画像のエラーが発生します。
このエラー直前に一瞬Chromeが起動してすぐ閉じられます(一瞬タスクバーにChromeのアイコンが表示されるが、体感0.1秒ほど)。
ちなみに、参照したサイトには、「ツール => 参照設定 => SeleniumWrapper Type Library にチェック」とありますが、実際にあったのは「Selenium Type Library」で、これにチェックを入れています。
また、それに合わせて、

Dim driver As New SeleniumWrapper.WebDriver

が認識されなかったため、

Dim driver As New Selenium.WebDriver

としたら認識されたため、それで実行しています。


どうすれば問題解決するでしょうか?
ご存知の方ご教示よろしくお願いします<(_ _)>


■動作環境
OS 名:Microsoft Windows 10 Pro
OS バージョン:10.0.16299 N/A ビルド 16299
OS 製造元:Microsoft Corporation
プロセッサ:Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~2400 Mhz
BIOS バージョン:TOSHIBA Version 2.20 , 2012/06/22
物理メモリの合計:3,988 MB
Excel バージョン:14.0.7192.5000(32ビット) Microsoft Office Standard 2010の一部

「VBA Selenium Google 」の質問画像

A 回答 (4件)

No.3の補足ですが、



Lates Release:ChromDriver 2.43

No.3は、内容が分かりにくかったと思います。
webDriverは、展開しても、SeleniumBasic の中は書き換わっていないので、直接、上記Driver を入れてしまう(前のをBakという拡張子に書き換えて、新しいものを入れるなど)という趣旨でしたが、ダメだったのでしょうか?
    • good
    • 0
この回答へのお礼

すみません、長期出張などで、この作業から離れてしまっていました。
解決はしていないのですが、再度確認したいと思います。
ありがとうございました。

お礼日時:2018/12/21 09:03

こんにちは。



stackoverflow を読んでみると、一人の人が、selenium とwebdriver との組み合わせが良くないと書いていました。

https://stackoverflow.com/questions/25080500/whe …
ここで書かれている話は難しいです。

そこで、私は、改めて、何も入れていないPC(Win10 -64bit)に、ここに書かれてあるものをダウンロードし、インストールをしてみましたが、問題なくコントロール出来ました。

Selenium32.tlb は、2016/03/02 70KB
C:\Users\[my name]\AppData\Local\SeleniumBasic\
driver: support Chrome v69-71
Google Chrome 70.0.3538

https://sites.google.com/a/chromium.org/chromedr …
Lates Release:ChromDriver 2.43

ひとつだけ注意点になるのは、新しいChromeDriver.exe を入れる場所ですが、
上記に書いてあるSeleniumBasic のフォルダーに、今まであったChromeDriver.exe と入れ替えて上げることぐらいでしょうか。ここを間違えるとたぶん動かないと思います。
これは、正しい場所には、自動的に展開しないようですね。

私が出来ているのですから、ご質問者さんも可能なはずなのですが……。

>port 9515
この設定を変えてあげなくてはならないのでしょうか。stackoverflow では、whitelist を使いなさいと書いている人もいますが……。必要がない気もしますが。
    • good
    • 0

私は、うっかり伝えるべきことを忘れていました。

失礼しました。
Chrome Driver 自体は、更新しなくていけなかったのでした。
サンプルの一例です。Latest と書いてありますが、これを作成した時のメモですから、時々チェックが必要です。

Sub ChromeControl1()
Dim driver As New ChromeDriver '要更新 Latest:2.43 support Chrome v69-71
'https://sites.google.com/a/chromium.org/chromedr …
Dim obj As Object
driver.Get "http://www.yahoo.co.jp/"
Set obj = driver
With obj
 AppActivate "Microsoft Excel"
 MsgBox .Title & " : " & .url
End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。

「Chrome Driver 自体は、更新しなくていけなかった」とありますが、リンク先(最新バージョン確認済)のファイルをダウンロード、展開し、実行ファイル実行でよいでしょうか?

それをしたら、コマンドプロンプト画面のようなものが出てきて以下のような文章が表示され、それ以外は何も起きませんでした。

Starting ChromeDriver 2.43.600210 (68dcf5eebde37173d4027fa8635e332711d2874a) on port 9515
Only local connections are allowed.

※関係ないかもしれませんが、すべてローカルでの作業をしています。

上記の画面を閉じ、いただいたサンプルコードを実行したら、私が投稿したのと同じエラーが発生しました。
なかなか複雑な仕組みのようですね(;^_^A

たびたびすみませんが、何が問題かおわかりでしたらご教示お願いしまします。

お礼日時:2018/11/15 09:25

こんばんは。



このSelenium Basic の問題は、別に頭を悩ますようなものではなくて、簡単にいうと、ライブラリが古いというだけのことです。数年前、何度やってもうまくいかないので変だと思ったら、バージョンが本体に追いついていなかっただけでした。Selenium は、ここ数年、やっと落ち着いたっていう感じがするのです。(FireFox は相変わらずだめです)

以下で書きましたが、
http://oshiete.goo.ne.jp/qa/10785557.html

Chrome は、大丈夫だということです。
Excel用の情報としては、GitUb のFlorentbr という所に集約されるので、
https://florentbr.github.io/SeleniumBasic/

ここを見てください。

Latest Versionは、
SeleniumBasic v2.0.9.0
最終リリースは、florentbr released this on 3 Mar 2016

と、これで試してみてください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご提示いただいたものを入れたために、参照設定での名前が「SeleniumWrapper Type Library」から「Selenium Type Library」にかわっていたり、オブジェクトとして「SeleniumWrapper.WebDriver」が認識されていなかったのだと思われます。

ただいま、再度最新バージョンを入れて試しました。
Public Sub selenium_test()
Dim driver As New Selenium.ChromeDriver ※
driver.Start "chrome", "http://www.yahoo.co.jp/"
End Sub

※のところは、
Dim driver As New ChromeDriver
Dim driver As New Selenium.ChromeDriver
Dim driver As New WebDriver
Dim driver As New Selenium.WebDriver
の4パターンで実行しましたが、いずれも同じ現象で添付の画像のエラーメッセージが表示されました。

原因は思い当たりますでしょうか。

お礼日時:2018/11/13 11:00

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

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

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

QExcel VBA でFireFoxのタブ名(サイトのタイトル)取得方法

独学なので、表現がおかしなところは適宜補完して読んでいただけると助かります。
IEでタイトルを取得する場合、
TypeName(window.document)が"HTMLDocument"であるかチェックし、
window.document.Title
で取得できてましたが、これをブラウザ「FireFox」を対象として同じことをしたい場合、
どのようにしたらよいでしょうか。

検索してもFireFoxで指定URLを開くといったものしか見つけられません。
具体的な方法を回答で投稿していただくのでも、
参考となる記事のあるURLでも構いませんので、
教えてください。

Aベストアンサー

-第2報-

結論的なものではないのですが、Excel用の情報としては、GitUb のFlorentbr という所に集約されるというそうです。
https://florentbr.github.io/SeleniumBasic/

この中に、プロジェクトとして、
A simple and quick way to drive Firefox, IE, Chrome, Opera and PhantomJS (headless webkit). と、銘を打っているので、まず、期待するしかないようです。ただし、Excel にPython が加わってくると事情が大幅に変わってしまいます。

SeleniumBasic v2.0.9.0
最終リリースは、florentbr florentbr released this on 3 Mar 2016

開発予定ではあるけれども、未だ、達成はしてないようです。
----
ADO ON としては、Selenium IDE (初期の頃のSeleniumですが、最終更新日は、2018/10/15になっています。)SeleniumIDE → Selenium-VBA →SeleniumBasic と変遷してきています。

https://github.com/SeleniumHQ/selenium-ide

説明
Selenium IDE is an integrated development environment for Selenium tests. It is implemented as a Firefox extension, and allows you to record, edit, and debug tests.

ただし、これは、言語としては、Javascript/Python 辺りだ思われます。
FireFox は、いままでのブラウザと大幅に様変わりましたし、私自身は、FireFox は、テレビからYouTubeにアクセスしています。

ちなみに、Google Chrome のほうが、処理しやすいと思います。

'//
Sub ChromeControl1()
Dim driver As New ChromeDriver '要更新 Latest:2.43 support Chrome v69-71
'https://sites.google.com/a/chromium.org/chromedriver/downloads
Dim obj As Object
driver.Get "https://www.goo.ne.jp/"
Set obj = driver
With obj
 AppActivate "Microsoft Excel"
 MsgBox .Title & " : " & .url
End With
End Sub
'//

-第2報-

結論的なものではないのですが、Excel用の情報としては、GitUb のFlorentbr という所に集約されるというそうです。
https://florentbr.github.io/SeleniumBasic/

この中に、プロジェクトとして、
A simple and quick way to drive Firefox, IE, Chrome, Opera and PhantomJS (headless webkit). と、銘を打っているので、まず、期待するしかないようです。ただし、Excel にPython が加わってくると事情が大幅に変わってしまいます。

SeleniumBasic v2.0.9.0
最終リリースは、florentbr florentbr rel...続きを読む

Qexcel2010からのブラウザ(chromeかIE)の操作について

初めまして。
質問について、サイトに記載されている商品の納期を調べていますが、
点数が2万点近くあるため、出来る限り機械的に処理ができないか模索しています。

流れとして、
1.手元にexcelでのデータリストがありその中の品番をコピーする。
2.ブラウザから該当サイトにアクセス(入力窓に記憶させておくことはできますが、ログインさせることは必須です)。
3.WEB上の指定の窓に1の品番を貼り付け(か入力)て検索ボタンを押す(Entだとなぜか1つ前の履歴が表示されるため検索ボタンを押します)。
4.ヒットしたページのソースから「標準納期」の文言を探し、同じ行にある日数を見つけて取得する。
5.4で見つけた納期の日数(「1週間」とか「2週間」とか「2~3日程度」とかの)をコピーして1のexcel(の指定の列)に貼り付ける。
6.excel内の対象データがなくなるまで1~5を続けて終了。

調べた結果、excelのあるセルに数値を入力しておいた状態で、
2までは動かすことは出来ました。(yahooを起動してトップページでその数値が検索)

ただ、上記のやらせたい処理になると条件がつき複雑になるため、その都度検索して納期を調べるしかないかと考えています。

過去に似たような経験のある方がいましたら、ご教授お願い致します。

初めまして。
質問について、サイトに記載されている商品の納期を調べていますが、
点数が2万点近くあるため、出来る限り機械的に処理ができないか模索しています。

流れとして、
1.手元にexcelでのデータリストがありその中の品番をコピーする。
2.ブラウザから該当サイトにアクセス(入力窓に記憶させておくことはできますが、ログインさせることは必須です)。
3.WEB上の指定の窓に1の品番を貼り付け(か入力)て検索ボタンを押す(Entだとなぜか1つ前の履歴が表示されるため検索ボタンを押し...続きを読む

Aベストアンサー

ChromeはというよりIE以外はやめた方がいいです。
IEはブラウザで唯一Active XコンポーネントですのでVBAから直接HTMLやDOMを操作できるAPIがあります。
"VBA IE 操作"で検索してみてください。
3の部分が複雑になる件ですがDOMを検索してInnnerHTMLとかで取得してこればシンプルにできるかと。

ただ、2万件となるとVBAで処理すると数分かかるように思います。
パフォーマンスが気になるようならEdgeやIEを.NETで開発したOffice Plug-inから操作するとよいかともいます。

ChromeやFirefoxはそもそもそういった直接操作ができるAPIがないので自動操作用の拡張機能を用意してファイルベースで操作内容を受け渡すような事が必要になるのであまりお勧めできません。

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

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でのIE操作でクリックができないボタンはあるのでしょうか

お世話になります。

Excel2016 32bit Windows10

IE自動操作に取り組んでいます。まだ勉強が足りず、ボタンのクリックができません(画像Gカレンダー保存ボタン)。
InputTypeでもaタグでもありません。idで取得はでき、roleがボタンでタブ選択もできるのに、VBAでクリックができません。
この手のボタンはVBA操作不可能なのでしょうか。初歩的な質問かもしれませんが、みなさまのお力添えを頂きたいです。

<div class="goog-inline-block goog-imageless-button" role="button" tabindex="0" style="user-select: none;">
<div class="goog-inline-block goog-imageless-button-outer-box">
<div class="goog-inline-block goog-imageless-button-inner-box"><div class="goog-imageless-button-pos">
<div class="goog-imageless-button-top-shadow"></div>
<div class="goog-imageless-button-content">保存</div>
</div>
</div>
</div>
</div>

お世話になります。

Excel2016 32bit Windows10

IE自動操作に取り組んでいます。まだ勉強が足りず、ボタンのクリックができません(画像Gカレンダー保存ボタン)。
InputTypeでもaタグでもありません。idで取得はでき、roleがボタンでタブ選択もできるのに、VBAでクリックができません。
この手のボタンはVBA操作不可能なのでしょうか。初歩的な質問かもしれませんが、みなさまのお力添えを頂きたいです。

<div class="goog-inline-block goog-imageless-button" role="button" tabindex="0" style="us...続きを読む

Aベストアンサー

こんにちは。

すみません。画像が、ものすごく小さかったのが災いしたのと、

「:jc.save_top」って、wrapper となっている所をみると、何かと組み合わさっていると思います。それをクリックされようとしていたので、なんだろうと考えしまいました。

>(画像Gカレンダー保存ボタン)

カレンダーの赤い「保存ボタン」をクリックですか?
質問の回答になっているのか、あまり確信がありません。

初歩の初歩としては、
<div class="goog-imageless-button-content" unselectable="on">保存</div>
ここから、

With objIE

Set buttons = .Document.getElementsByClassName("goog-imageless-button-content")
For Each n In buttons
   If n.innerText Like "保存*" Then ''= "保存" でもよい
    n.Click
    Exit For
   End If
Next n

End With

で、行けるのではないでしょうか。
もちろん、オブジェクト配列になっているはずですから、それで、何番目か探して、直接、buttons(9).Clickとしても行けるかとは思います。

質問と食い違っていたら、補足をつけてください。

それと、余談なのですが、Googleで、IEを使うのは抵抗ありませんか?フルに動かないと思います。かと言って、Google Chrome をVBAで扱う方法が、なぜか確立できていませんね。Selenium VBAを使うことにはなっているのですが、いろいろやってみて、どうやらバージョンが遅れていることに気が付きました。前から、ずっと遅れているようです。

こんにちは。

すみません。画像が、ものすごく小さかったのが災いしたのと、

「:jc.save_top」って、wrapper となっている所をみると、何かと組み合わさっていると思います。それをクリックされようとしていたので、なんだろうと考えしまいました。

>(画像Gカレンダー保存ボタン)

カレンダーの赤い「保存ボタン」をクリックですか?
質問の回答になっているのか、あまり確信がありません。

初歩の初歩としては、
<div class="goog-imageless-button-content" unselectable="on">保存</div>
ここから、

Wit...続きを読む

QVBAで既に開いている別アプリケーションのオブジェクトを得る

 VBAで別のアプリケーションにアクセスするには、CreateObject関数を使ってアプリケーションのオブジェクトを作るようにすると思います。例えば、ワード文書にアクセスするなら次の構文になると思います。
  Set appWord = CreateObject("Word.Application")
  appWord.Visible = True
 しかしこれだと新しいワード文書を作ったり、既存のワードファイルを開いて扱うことしかできません。GetObject関数を用いても同様のようです。既に別ウィンドウで開いているワード文書があって、そこへアクセスするにはどうしたらよいのでしょうか。
 また、同じアプリで複数のファイルを開いている場合には、どうやって目的のファイルへのオブジェクトを得るのでしょうか。(ファイル名などを参照して判断?)

Aベストアンサー

Internet Explorerで開いているWindowを取得することはできますよ。

そのためには、まず開いているWindowを順番に取得し、それがInternet Explorerならばそれをオブジェクトに代入し、ひとつもIEウィンドウが存在しない場合は新規作成(CreateObject)すればいいのです。
Windowを取得するにはShell.Applicationというのを使います。

Dim ObjIE As Object
Dim ObjShell As Object
Dim ObjWindow As Object
Dim WinExist As Boolean

WinExist = False
Set ObjShell = CreateObject("Shell.Application")
For Each ObjWindow In ObjShell.Windows
If TypeName(ObjWindow.Document) = "HTMLDocument" Then
 WinExist = True
 Set ObjIE = ObjWindow
End If
Next
Set ObjShell = Nothing

If Not WinExist = True Then
Set ObjIE = CreateObject("InternetExplorer.Application")
End If

ObjIE.Navigate "http://nantokakantoka.html"
ObjIE.Visible = True


というような感じです。
Wordの場合はわからなくてすみません。
独学なのでもっといい方法があるかもしれないですが。

Internet Explorerで開いているWindowを取得することはできますよ。

そのためには、まず開いているWindowを順番に取得し、それがInternet Explorerならばそれをオブジェクトに代入し、ひとつもIEウィンドウが存在しない場合は新規作成(CreateObject)すればいいのです。
Windowを取得するにはShell.Applicationというのを使います。

Dim ObjIE As Object
Dim ObjShell As Object
Dim ObjWindow As Object
Dim WinExist As Boolean

WinExist = False
Set ObjShell = CreateObject("Shell.Applicatio...続きを読む

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 でキー送信して
   もウインドウが開いてないんです。一例です。

   ...続きを読む

QエクセルVBA 「On Error GoTo 0」について

「On Error GoTo 」ステートメントの意味は、だいたい理解しています。
「On Error GoTo 0」 ステートメントについて、ご教授お願いします。
参考書には「エラーのトラップ処理を無効にする」と載っていましたが、よくわかりません。
具体的にどのような使い方をするのか、簡単なコードで説明していただければ幸いです。
よろしくお願いします。

Aベストアンサー

#3の回答者ですが、コードのどこが原因か特定し、実行時エラーとして、そのエラーが不可避な場合において、On Error Resume Next を付けますから、On Error Goto ErrHandler よりも、扱い方が難しいです。当然、その部分だけの範囲を囲うので、On Error Goto 0 を入れると思いますし、今では、使う場面が限定されているはずです。

後はテキストを参考にしてください。当面、このようなコードが必要になることはないと思いますが。

QExcel VBAにて2つの処理を同時実行可能?

是非お力をお貸し下さい。
よろしくお願いします。
Windows XP
Excel2003 (VB6.0)

メイン処理が非常に時間がかかるため、フォームを表示させ
文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを
使用者に伝えようとしています。

--- Form1内のコード(メイン) ---
Sub Main()

Form2.Show vbModeless

[ ~メイン処理~ ]

End Sub

--- Form2内のコード ---
Sub UserForm_Initialize()

Call Blink

End Sub

--- 標準モジュール内のコード ---
Sub Blink()

If Form2.Label1.Visible = True Then
Form2.Label1.Visible = False
Else
Form2.Label1.Visible = True
End If

Form2.Repaint

DoEvents

Application.OnTime Now + TimeValue("00:00:01"), "Blink"

End Sub


これを実行すると、メイン処理が終了した後にForm2内の文字が
点滅します。

実現したいのは「使用者が動いていることを(ハングアップしていない
ことを)確認出来る」という点です。

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

是非お力をお貸し下さい。
よろしくお願いします。
Windows XP
Excel2003 (VB6.0)

メイン処理が非常に時間がかかるため、フォームを表示させ
文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを
使用者に伝えようとしています。

--- Form1内のコード(メイン) ---
Sub Main()

Form2.Show vbModeless

[ ~メイン処理~ ]

End Sub

--- Form2内のコード ---
Sub UserForm_Initialize()

Call Blink

End Sub

--- 標準モジュール内のコード ---
Sub Blink()

If Form2.L...続きを読む

Aベストアンサー

単純に、HTMLファイルを表示するとかいうのではだめでしょうか?VBAに影響を与えることなくブラウザ側が勝手にやってくれるので、負荷は少ないように思うのですが。
的を外した回答でしたらすみません。

QEXCEL VBA で年間カレンダーを作成したい

EXCEL VBAで年間カレンダーを作りたいのでご教示下さい。
①コードをすっきりさせたい(処理を早くしたい)②表示の各月を“1月”、“2月”と表示させたい
③(次処理別コード)
 カレンダー作成後に各月の休日に手動で黄色を付ける。※稼働日(白セル)、休日(黄色セル)
  その後に各月の稼働日(白セル)、休日(黄色セル)の数をカウントしたあと
(稼働日と休日を表示)
セルB41に1月、B42に2月、B43に3月、B44に4月、B45に5月、B46に6月、J41に7月、J42に8月、J43に9月、J44に10月、J45に11月、J46に12月、R41に各月の稼働日合計と休日合計を表示

(検索して見つけたコードとマクロの記録と途中のコード)(記載できるところまで)
Sub cal()
'横に3か月、下に4か月を出力
Dim myDate As Integer
Dim Nen As Integer, Tuki As Integer
Dim i As Integer, j As Long, k As Integer
Dim myTitleD, myTitle(1 To 1, 1 To 7)
Dim myRow As Integer, myCol As Integer
Dim cn As Long, cntCol As Integer, cntRow As Integer
Dim c As Range
Worksheets("Sheet1").Activate
With Range("A1:Z49")
.Font.Size = 28
.Font.Name = "メイリオ"
.Font.Bold = True
End With

myRow = 9
myCol = 8

myDate = Application.InputBox(Title:="年の指定", _
Prompt:="作成する年(西暦)を入力してください", _
Default:="2019", Type:=1)
Nen = myDate

myTitleD = Array("日", "月", "火", "水", "木", "金", "土")
For k = 0 To 6
myTitle(1, k + 1) = myTitleD(k)
Next k

Application.ScreenUpdating = False


Worksheets("Sheet1").Activate

For i = 1 To 12
Dim myTable(1 To 6, 1 To 7)
cn = 1

Select Case i
Case 1, 4, 7, 10
cntCol = 1
Case 2, 5, 8, 11
cntCol = 2
Case 3, 6, 9, 12
cntCol = 3
End Select
Select Case i
Case 1 To 3
cntRow = 1
Case 4 To 6
cntRow = 2
Case 7 To 9
cntRow = 3
Case 10 To 12
cntRow = 4
End Select
For j = DateSerial(Nen, i, 1) To DateSerial(Nen, i + 1, 0)
If Day(j) <> 1 And Weekday(j) = 1 Then cn = cn + 1
myTable(cn, Weekday(j)) = j
Next j

With Cells(5 + myRow * (cntRow - 1), 4 + myCol * (cntCol - 1))
If i = 1 Then .Offset(0, -1).Value = Nen
.Value = i
.Font.Bold = True
.Offset(1, 0).Resize(1, 7).Value = myTitle
.Offset(2, 0).Resize(6, 7).Value = myTable

.Offset(1, 0).Resize(1, 7).Interior.Color = RGB(194, 214, 154)
.Offset(1, 0).Resize(6, 7).HorizontalAlignment = xlCenter
.Offset(2, 0).Resize(6, 7).NumberFormatLocal = "d"

.Offset(1, 0).Resize(7, 1).Font.Color = RGB(255, 0, 0)

End With
Erase myTable
Next i


Worksheets("Sheet1").Activate

Range("A:B").Delete

Application.ScreenUpdating = True

Worksheets("Sheet1").Activate
Range("A5").Select
Cells.EntireColumn.AutoFit
Range("A5").Select
Selection.Cut Destination:=Range("B1")

Range("B1:X1").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False

End With
Selection.Merge
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.399975585192419
.PatternTintAndShade = 0
End With

Application.Calculation = xlCalculationManual


Selection.NumberFormatLocal = "0""年 カレンダー"""
Range("B3:X3").Select
With Selection

EXCEL VBAで年間カレンダーを作りたいのでご教示下さい。
①コードをすっきりさせたい(処理を早くしたい)②表示の各月を“1月”、“2月”と表示させたい
③(次処理別コード)
 カレンダー作成後に各月の休日に手動で黄色を付ける。※稼働日(白セル)、休日(黄色セル)
  その後に各月の稼働日(白セル)、休日(黄色セル)の数をカウントしたあと
(稼働日と休日を表示)
セルB41に1月、B42に2月、B43に3月、B44に4月、B45に5月、B46に6月、J41に7月、J42に8月、J43に9月、J44に10月、J45に11月、J46に12月...続きを読む

Aベストアンサー

一応、なにかの参考にと思い、「マクロで作るカレンダー」を、私も作ってみました。
作ってみて気がついたことは、今回のようなマクロは、ボタン起動型よりも、アドイン型のほうが利便性が高かったのですが、それでも、ボタンの付け方とか、別の意味で参考になるだろうと思いました。ご要望になっているものとは、違いますが、3列と2列の選択、月曜日スタート型と、日曜日スタート型とか、曜日を日本か英語か選べるようになっています。

http://xfs.jp/YRT1C
ダウンロード後は、プロパティからブロックを外してください。


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

人気Q&Aランキング