過去ログ

                                Page     283
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼VBで作られたアプリに対して  kawata 02/10/30(水) 9:13
   ┗Re:VBで作られたアプリに対して  JuJu 02/10/31(木) 1:41
      ┗Re:VBで作られたアプリに対して  kawata 02/10/31(木) 8:39
         ┗Re:VBで作られたアプリに対して  JuJu 02/10/31(木) 16:40
            ┗Re:VBで作られたアプリに対して  kawata 02/11/1(金) 8:36

 ───────────────────────────────────────
 ■題名 : VBで作られたアプリに対して
 ■名前 : kawata
 ■日付 : 02/10/30(水) 9:13
 -------------------------------------------------------------------------
   kawataです、よろしくお願いします。(Windows2000/Excel2000)

VBで作られたアプリケーションに対し、ExcelのSECDKEYSをめったやたら(^^;
組み合わせて、ツールを作っているのですが、ここで、そのアプリをアクティブ
にするのに、ダイアログのタイトルを書き写して処理しています。
しかし、そのアプリでエラー(データ件数0等)になったときは、Excel側でそれを
知る方法がありません(もちろん私のレベルでということで、実際はあるのかも知
れない(^^;)。(・・・OKの時は続いて、Alt+E+Cを発行できます)

で、コードを、

on error goto エラー処理
appactivate "エラー"
  エラー時に処理するコード
エラー処理:
  OK時に処理するコード

としているのですが、なんとなくおかしいような気がしてきて。というか、これで
いいのか自信がなくなってきまして(^^;。

他に何かいい方法ありますでしょうか?、ぜひ、指標を!よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:VBで作られたアプリに対して  ■名前 : JuJu <juju-bbs@su-u.com>  ■日付 : 02/10/31(木) 1:41  -------------------------------------------------------------------------
   kawataさん、こんにちはぁ

VB側のアプリに手を加えることはできますか?
一番確実な方法は、VBのアプリを改造して Excelと通信できるようにすることです。
通信方法としては、
 1.ActiveX
 2.ファイル
 3.DDE
 4.API
などがあります。

VB側のアプリに手を加えられないとすれば、結構厄介です。

>on error goto エラー処理
>appactivate "エラー"
>  エラー時に処理するコード
>エラー処理:
>  OK時に処理するコード

お手軽なのはこの方法だと思います。
VB(A)のAppActivate関数はエラーの文字を含むウインドウがあればエラーにならないので、別のウィンドウを見つける可能性があり、確実性はかなり落ちます。
それを踏まえて使ってください。

完全一致のウインドウを探すときは、FindWindow APIが便利です。

不明点がありましたら、再度ご質問ください。

ではではぁ
 ───────────────────────────────────────  ■題名 : Re:VBで作られたアプリに対して  ■名前 : kawata  ■日付 : 02/10/31(木) 8:39  -------------------------------------------------------------------------
   JuJuさん、はじめまして、回答どうもありがとうございました。
(夜遅くにすいません、ありがとうございます)

何か変な質問してしまったかなぁと思っていたところ、期待していた
ままの回答が得られて、最高な気持ちです、感謝します。

>VB側のアプリに手を加えることはできますか?
>一番確実な方法は、VBのアプリを改造して Excelと通信できるようにすることです。

そうなんですか、理解できないまでも、なんとなくイメージすることが
できます、通信できるように持っていくと、ユーザーフォームを使うみたいに
VBのコントロールのプロパティを取得したりできる、と考えていいのですか。

>VB側のアプリに手を加えられないとすれば、結構厄介です。

つまりはこれですね、結果として、不可能です(^^;。
なんとかしたいとは思うのですが、なかなか難しいです。

>お手軽なのはこの方法だと思います。
>VB(A)のAppActivate関数はエラーの文字を含むウインドウがあればエラーに
>ならないので、別のウィンドウを見つける可能性があり、確実性はかなり落ちます。
>それを踏まえて使ってください。

はい、当面これで進めていくしかなさそうです。まだまだ工夫がいりますけど
やってみます。

>完全一致のウインドウを探すときは、FindWindow APIが便利です。

そのVBのアプリなんですが、エラーメッセージのウインドウタイトルは何も設定
されていないらしく、エラーの種類は数種あっても、どれも同じタイトルです。
で、そのエラー時にでるタイトルでAppactivateすると、ほかの入力ウインドウ
etc、どれにでも有効になってしまいます。(VBアプリの手抜き?)

それで、そのFindWindow APIでウインドウを探す手法を、ぜひご教授お願い
します。APIは殆ど使ったことありません(参考書をコピペで1〜2度あるだけです)。
解析自体、私のレベルでは厳しくなってきそうですが、トライしてみたいと
思います、お手数おかけしますが、ぜひよろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:VBで作られたアプリに対して  ■名前 : JuJu <juju-bbs@su-u.com>  ■日付 : 02/10/31(木) 16:40  -------------------------------------------------------------------------
   kawataさん、こんにちはぁ

>何か変な質問してしまったかなぁと思っていたところ、期待していた
>ままの回答が得られて、最高な気持ちです、感謝します。

とんちんかんな回答をしてしまったかなと心配してました^^;

>そうなんですか、理解できないまでも、なんとなくイメージすることが
>できます、通信できるように持っていくと、ユーザーフォームを使うみたいに
>VBのコントロールのプロパティを取得したりできる、と考えていいのですか。

DDEを使う時は、テキストボックスの.Text、ラベルの.Caption を取得設定できます。
ファイルを使うときは、お互いのアプリでファイルを監視して中身でやり取り。
ActiveX化すれば、制御する側は非常に簡単にやり取りするとこができますが、制御される側か結構大変な変更が必要です。

>そのVBのアプリなんですが、エラーメッセージのウインドウタイトルは何も設定
>されていないらしく、エラーの種類は数種あっても、どれも同じタイトルです。
>で、そのエラー時にでるタイトルでAppactivateすると、ほかの入力ウインドウ
>etc、どれにでも有効になってしまいます。(VBアプリの手抜き?)

画面に表示表示しているのはエラー表示は、メッセージボックスですか?
メッセージボックスだと仮定して、表示されているメッセージを取得するサンプルを作ってみました。
(メッセージボックス以外は取得しません)

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Sub Macro1()
  Dim hWnd1 As Long, hWnd2 As Long
  Dim strBuffer As String

  strBuffer = ""
  ' ↓ここをメッセージボックスに表示されるタイトルに変更してください。
  hWnd1 = FindWindowEx(0&, 0&, "#32770", "メッセージボックスのタイトル")
  If hWnd1 <> 0& Then
    '' メッセージボックス発見したときは、表示されているメッセージの取得
    hWnd2 = FindWindowEx(hWnd1, 0&, "Static", vbNullString)
    If hWnd2 <> 0& Then
      strBuffer = String$(1024, vbNullChar)
      GetWindowText hWnd2, strBuffer, Len(strBuffer)
      strBuffer = Left$(strBuffer, InStr(strBuffer, vbNullChar) - 1)
    End If
  End If
  If Len(strBuffer) > 0 Then
    MsgBox strBuffer
  Else
    MsgBox "メッセージはありません"
  End If
End Sub

ではではぁ
 ───────────────────────────────────────  ■題名 : Re:VBで作られたアプリに対して  ■名前 : kawata  ■日付 : 02/11/1(金) 8:36  -------------------------------------------------------------------------
   kawataです、JuJu さん、どうもありがとうございます。

>とんちんかんな回答をしてしまったかなと心配してました^^;

とんでもないです、お世話になります。

で、すごい!、こういうコードをそらで書けるようになりたいものです、
けど、無理です(^^;。
提示いただいたコードを、即解析/理解するスキルもないし(^^;。
しかし、速攻でテストしながら解析に挑戦します(当然、最初はコピペです(^^;)。

APIに関連する情報ってヘルプで調べられるのでしょうか?。
あちこちでF1を押しても、「見つかりません」ばっかりだし・・・・。
そのあたりから、勉強する必要あるみたいです。

とにかくありがとうございました。(っていうか、もう感謝しきりです)
また、よろしくお願い致します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 283