[[20050225114450]] 『マクロ実行中に』(つん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『マクロ実行中に』(つん)

すみません。原始的な質問なのですが・・・

マクロの実行中に マウス・キーボードの入力を受け付けないコードって
ありますか?

一応、過去ログも見ましたが、それらしきコードが探せなくて・・・

ちなみに他アプリへの切替処理(IE)を含むマクロです。

どなたかご教授いただけませんでしょうか?
よろしくお願い致します。


 具体的な使用目的をお教え下さい。
 Windowsはマルチタスクでアプリケーションを使用できますが、
 Excel以外のアプリケーションに切り替えたときも、
 操作をできないようにしたいのでしょうか?
   (INA)

すみません、説明不足で・・・

エクセルデータを全国の社員にユーザーフォームで入力させて

それをメール(グループウェア)で自分の元に暗号で飛ばしたいんです。

エクセルのみであれば、progressbar等で画面を固定できるのですが

エクセルデータコピー →アプリケーション切替(sendkeysで操作)
→エクセルに切替で再度データコピー

→アプリケーション切替で転送

問題はIEに切り替えたときにリロードタイム

タイム = Now + TimeValue("00:00:05")

    Application.Wait (タイム)

等を取っているのでその間にキー(特にタブ)を押されると sendkeyがずれてしまうのを
防ぎたかったんです。

切替は初めの呼び出しをセルに記入したハイパーリンク→IEを呼び出し

AppActivate "Microsoft ○○" で交互に切り替えています

転送マクロは仕上がったのですが、ちょっとグレードアップさせたくて。

この説明でわかりますでしょうか? (つん)


 だいたい理解できます。

 >自分の元に暗号で飛ばしたいんです。
 これの仕様次第なのでなんともいえませんが、
 いちばん気になったのは、「全国の社員」といった広範囲のユーザーを対象にした
 おおがかりなVBAなのに、不安定な(sendkeysで操作)に頼っているところです。 

 >sendkeyがずれてしまうのを
 もともと安定性を重視するプログラムでは、
 重要な箇所に動作が不安定なSendkeysは使用しないものです。
 

 >問題はIEに切り替えたときにリロードタイム  
 IEはActiveXオートメーションで制御しているのではないのでしょうか?
   → Set obj = CreateObject("InternetExplorer.Application")

 参考
http://www.asahi-net.or.jp/~ef2o-inue/download/sub09_020_050.html
http://homepage2.nifty.com/inform/vbmania/source/ievb.htm
 <AppActivate ステートメントと SendKeys ステートメントを Win 32 オペレーティングシステムで使用する場合>
http://support.microsoft.com/default.aspx?scid=kb;ja;408402

  (INA) 


懇切丁寧な回答をありがとうございます。まったくもってINAさんの仰る通りです。

sendkeysと言う不安なコードは使いたくないのですが、
VBAコード歴2ヶ月ド素人の私は、
それしか適当なコードを知らないのです。

こんな付け焼刃マクロではなくて、本当はもっとキチンとした物を作成するべきなんでしょうけれども、

何処の企業もそうなのでしょうが・・・
やんごとなき事情(システム本稼動までの繋ぎ)により・・です。

IEと言ってもLANで繋がったイントラネットなのです。

端末もXPで統一されているので、動作は今の所安定しているように思います。

(必殺のエラー回避コード→エラーが出たら再度送れ!届くまで何度でも送れ!と全員に命令)

ただ、報告用のユーザーフォームを
何度も何度も条件分岐させて繰り返し処理している為に、

これ以上は新たな何かを組み込みたく無いと言う気持ちから

簡単なコードで操作不可に出来れば・・と思って質問を出しました。

そんな魔法みたいなコードは存在しないんでしょうね!

色々参考になる事を教えていただきありがとうございました。(つん)


 なるほど・・・

 >問題はIEに切り替えたときにリロードタイム
 >  Application.Wait (タイム)
 >等を取っているのでその間にキー(特にタブ)を押されると
 > sendkeyがずれてしまうのを防ぎたかったんです。

 IEを非表示で起動して、Wait後に表示しては如何でしょう?

  (INA)


レスが遅れてすみません・・・目を離してしまっておりました。

>IEを非表示で起動して、Wait後に表示しては如何でしょう?

そんな事が出来るんですか?

非表示コードは

 Application.ScreenUpdating = False

しか知らないのですが・・・

アプリケーションを切り替える際に上記コードを書いてもダメでした・・・
よろしければご教授下さい。 どうかお願い致します。
私は全て自己流で覚えているので、基本的な事を知らないのです。

(つん)


 掲載したリンク先のページは見て頂けたのでしょうか・・
 InternetExplorerは、ActiveXオートメーションで制御可能なアプリケーションです。   
 なので、CreateObject関数を用いて起動すれば、VBAでいろいろな制御が可能です。

 Dim obj As Object

    Set obj = CreateObject("InternetExplorer.Application")
    obj.Visible = False
    obj.Navigate "http://www.excel.studio-kazu.jp/" & _
                 "cgi-bin/kazuwiki2.cgi?mycmd=read&mypage" & _
                 "=[[20050225114450]]&mytime=000627"

    Application.Wait (Now + TimeValue("0:00:05"))    
    obj.Visible = True

  (INA)


本当に何度も何度もありがとうございます。

リンク先ページは熟読しましたが、まったくもってちんぷんかんぷんでした・・・

上記コードも今すぐ出来たかどうか?と回答する事が出来ません(まだ理解していないので)

キチンと勉強して理解して、来週中くらいには成果をご連絡差し上げたいと思います。

INA様、何度もありがとうございました。(つん)


 VBAヘルプの CreateObject 関数 のページを読んでみて下さい。
 そこそこ詳しく書いてあります。
  (INA)


INA様 色々とありがとうございます。

 
残念ながらこのPCにはVBAのヘルプがインストールされていない為に
CreateObject関数に関しては全然解らずじまいでした。

ActiveXオートメーションに関してはまったくもってお手上げです。
読めば読むほど迷宮入りしてしまう状態です。

やはり根本的に勉強しなおすべきと思い 少し自分でも調べました。

(30時間位寝てませんw)

sendkeys → keybd_event→ 最終的にはSendInput関数に辿り着きました

この関数だと、キーコードによる入力を受け付けないようです。

http://fukkey.dyndns.org/pins/vb/020315/35491.html

(読んで来たのみです。質問は一切していないのでマルチポストに当たらないと良いのですが)

これでTABキーは送れるようになりました・・・

Const OLECMDID_PASTE = 13

objIE.ExecWB OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT

ペーストにはこのコードを使用することによって sendkeysを排除

あとはENTERキーが送れれば・・・なんですが・・・
もう少しがんばってみます。 (つん)


 >最終的にはSendInput関数に辿り着きました
 API を使うことに比べたら
 ActiveXオートメーション(CreateObject)なんて簡単ですよ。
(用途が違いますけど。)

 Sendkeysに比べたらSendInputは安定しているようですね。(使ったこと無いですが)

 VBAを利用するのにヘルプをインストールしていないのは致命傷です。
 どんな上級者でもヘルプは利用します。
 Office(Excel)のCDからインストールしてください。

http://www.excite.co.jp/world/english/web/body/?wb_url=http%3A%2F%2Fmsdn.microsoft.com%2Flibrary%2Fen-us%2Fwinui%2Fwinui%2Fwindowsuserinterface%2Fuserinput%2Fkeyboardinput%2Fkeyboardinputreference%2Fkeyboardinputfunctions%2Fsendinput.asp&wb_submit=%83E%83F%83u%83y%81%5B%83W%96%7C%96%F3&wb_lp=ENJA&wb_dis=2

http://www.bcap.co.jp/hanafusa/VBHLP/SendMous.htm

http://www.moug.net/skillup/nksw/nksw15-01.htm

  (INA)


INA様 本当に色々とありがとうございます。
VBAヘルプに関しては「必要ない」との見解で貸し出し不可でした・・・

ま、その内無断拝借してインストール致します。

ところで、本件ですが。

ENTERキーは SendInputをtab→RETURN に書き換えてテスト
 →上手く動かないので、モジュールを分けて(call)呼び出しを掛けた所上手く行きました。

・・・ただし、新たなるトラブル発生。モジュールを分けると
ペーストコードが上手く働きません・・・

Const OLECMDID_PASTE = 13

 Const OLECMDEXECOPT_DODEFAULT = 0

 Dim objIE As Object

 Dim a, b

 Set objIE = CreateObject("InternetExplorer.application")

 objIE.Visible = True '可視

 objIE.Navigate "http://******"

 Do While objIE.Busy = True

(拾ってきたコード原文まま使用しています)
これで

 objIE.Execwb OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT 
で貼付出来るんですが
(この時点ではエクセル切替、コピー→貼付も可能)

マクロを切り替えると「実行時エラー91 オブジェクト変数、またはwithブロック変数が設定されていません」と出ます。 

そのまま手作業でペーストすると内容が貼付られるのでクリップボードが空と言うことは無いと思うのですが・・・
Execwbが怪しいような・・・

ここまで来たのだから、何とか頑張ってみます。

またご連絡致します。
ありがとうございます! (つん)


ついに完成しました!
単純にcallで呼び出せば良いだけの話でした・・・

INA様、長々とお付き合いいただいて本当にありがとうございます。

あなたのちょっと辛口(失礼ですが・・)なアドバイスがなければ
きっと諦めていたと思います

本当に本当にありがとうございました!
心から感謝いたします (つん)


 全容が分からないので、あるていど勘で回答していたのですが、
 解決したようで何よりです。  (INA)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.