[[20060409151555]] 『電卓の計算結果』(banzai) ページの最後に飛ぶ

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

 

『電卓の計算結果』(banzai)

 いつも教えていただきありがとうございます。
 早速ですが、ユーザーフォーム上のテキストボックスに
 ウインドウズの電卓で計算した結果を反映させるいい方法があれば
 ご教示願います。
 今は、電卓の結果をCtrl+CでコピーしてCtrl+Vでテキストボックスに
 貼り付けをしています。
 この動作を何か簡単に出来る方法がないものかと思いまして・・
 反映させたい、テキストボックスを選択して、電卓で計算した結果を
 何らかの方法で反映できたらいいなと思うのですが。
 わがままを言えば、電卓の統計ボックスの値も反映できたらいいななんて
 思ってます。
 よろしくご教示願います。

 WinXP エクセル2003

 電卓の結果の単純なコピペの方法です。
 電卓側では
 「編集」→コピー

 ユーザーフォーム側では

   With Me.TextBox1 
        .Paste 
    End With 

 でいかがでしょう?
 (MARBIN)

 エクセルで電卓を作っちゃう、という手もあります。
 ほかにはSendKeysを使った方法もありそうですが、よく
 わかりません。
 (MARBIN)


 ありがとうございます
 SendKeysですね。
 使ったことないので勉強していますが、
 いまいち理解できないです・・
 もう少し勉強してみます。
 (banzai)

 説明不足でした。

 SendKeysを使うには、予め電卓のウィンドウを
 アクティブにしておく必要があります。

 しかも手作業ではなく、プログラムでアクティブ
 にしないといけないと思います。

 そのプログラムでアクティブにする、という部分
 がネックになると思います。
 (MARBIN)

 電卓を起動するのは↓で出来そうです。
 VBAヘルプの記述のほとんどコピペです。

 Sub den()
   Dim ReturnValue As Variant
     ReturnValue = Shell("C:\WINDOWS\SYSTEM32\CALC.EXE", vbNormalFocus)
     AppActivate ReturnValue
 End Sub

 ただ、計算結果の取得は他サイトの過去ログ
 みても出来ないようなことが書いてありまし
 た。

 やはり手作業でコピペするかエクセルで電卓
 を作るしかないようです。
 (MARBIN)

 >ウインドウズの電卓で計算した結果を反映させる
 SendMessage で WM_GETTEXT を送って取得出来ないでしょうか。
 私がテストした感じではうまく取得できているように見えます。

 テストしたコードは正しいものかどうか、
 私には判断できないので書きませんが。 (アカギ)


 MARBINさんアカギさんありがとうございます。
 電卓の起動と終了はなんとかできました。
 終了時に電卓を閉じてるとエラーが出ているのをどうしたものか
 考えておりまして、肝心の内容の検討がまだ十分じゃないのです・・
 電卓の終了時にすでに電卓を閉じてる場合はエラーを飛ばすように
 したらできました。
 アカギさん、もし何らかのエラーが出て構わないので
 もしよろしければテストのコード教えていただけないでしょうか。
 (banzai)


 他サイトで見かけたコードを少し改造したものです。
 電卓が起動しているかどうかチェックします。

 Sub kidouchk()
    Dim Service As Object, PrcSet As Object, Prc As Object
    Dim MesStr As String

    Set Service = _
    CreateObject("WbemScripting.SWbemLocator").ConnectServer
    Set PrcSet = Service.ExecQuery("Select * From Win32_Process")
    For Each Prc In PrcSet
       MesStr = UCase(Prc.Description)
       If MesStr = "CALC.EXE" Then
          MsgBox "電卓が起動中です", 64: Exit For
       End If
    Next

    Set PrcSet = Nothing: Set Service = Nothing
 End Sub
 (MARBIN)

 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
     (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

 Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
     (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

 Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
     (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

 Const WM_GETTEXT As Long = &HD
 Const WM_GETTEXTLENGTH As Long = &HE

 Private Sub CommandButton1_Click()
     Dim hWnd1 As Long, hWnd2 As Long
     Dim length As Long
     Dim s As String

     hWnd1 = FindWindow("SciCalc", "電卓")
     hWnd2 = FindWindowEx(hWnd1, 0, "Edit", vbNullString)

     length = SendMessage(hWnd2, WM_GETTEXTLENGTH, 0, 0)
     s = String(length + 1, vbNullChar)

     Call SendMessage(hWnd2, WM_GETTEXT, length + 1, ByVal s)
     TextBox1.Text = Left(s, InStr(s, vbNullChar) - 1)
 End Sub

 テストしたのはこんな感じです。電卓を起動して実行してください。
 おかしなところがあれば、誰か突っ込んでくれるとうれしいです。 (アカギ)


 ちょっと、的外れですが、テンキー電卓はご存知でしょうか?

 http://www.canon-sales.co.jp/calc/lineup/tenkey-nb.html
 結構便利です。
(浦上)


 浦上さんありがとうございます。
 こんなグッズがあるんですね〜予算があったら購入してみたい・・
 MARBINさんありがとうございます。
 うまくチェックできそうです!
 アカギさん、難しそうなコードですね・・
 私には読解不可能です・・
 で、試しに今のコードに貼り付けて使ってみたのですが、
 前半部分(コマンドボタンクリックより前)の部分でコンパイルエラーって
 表示されます。
 「定数、固定長の文字列、配列、ユーザー定義型および Declare ステートメントは、
 オ ブジェクト モジュールのパブリック メンバとしては使用できません。」
 とメッセージがでます。
 すいません。ヘルプ見ても全く理解できません・・
 (banzai)


 Declareの部分は標準モジュールに貼り付けてください。 (アカギ)


 早速試してみました。
 テキストボックス1の値が空白になりますが、値が入りません。
 何か他に設定する必要があるのでしょうか?
 (banzai)


 電卓は起動してるよね。
 ステップ実行した時に、各変数の値はどうなっていますか? (アカギ)


 ステップ処理してみます。
 その前に・・
 ユーザーフォームを起動するとアプリケーションエラーが出て強制終了
 してしまいます・・
 それも、順調に起動するときとしないときがあるのです。
 コードの書き方が悪いのかもしれません。
 なんとなくですが・・for〜nextのなかのdo〜loopがはいっているのですが、
 やっぱりこれってまずいでしょうか?
 関係のない質問ですいません。
 (banzai)


 ステップ処理した結果です。
 hWnd1   16122874 
 hWnd2  9175770
 length  0
 s       "."

 テキストボックスの値や電卓の結果に関係なくhWnd1とhWnd2は7桁か8桁の
 数値が変わります。テキストボックスと電卓の値が同じでもhWnd1とhWnd2は
 違った値が出力されています。
 テキストボックスは処理後は空白になります。

 (banzai)


 さきほどのアプリケーションエラーの件ですが、
 ユーザーフォームを開いて処理実行後にファイルを保存すると
 ファイルサイズが増えています。
 その後にファイルを開いてユーザーフォームを開こうとすると
 エラーが生じてしまいます。
 コードの中にファイルサイズを増やすような要因があるのでしょうか?
 (banzai)


 >for〜nextのなかのdo〜loopがはいっているのですが、
 >やっぱりこれってまずいでしょうか?
 何のことかまったくわからないです。

 >ユーザーフォームを開いて処理実行後にファイルを保存すると
 >ファイルサイズが増えています。
 再現しません。

 新規ブックで試してもだめなのでしょうか。
 なんにしても私もよくわからないので
 VB掲示板で聞くかあきらめるかした方がいいと思います。 (アカギ)


 ありがとうございます。
 別の質問で掲載させていただきました。
 電卓の件ですが、ステップの結果ですがどうでしょうか?
 やっぱりこれまたわからないでしょうか?
 (banzai)


 少し前のスレですが興味があったので。
 私のWin2000の電卓では計算結果の取得ができなかったので
 調べてみると「Static」でした。
 付属しているOSにより異なるのでしょうかね〜。

 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
     (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

 Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
     (ByVal hWndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

 Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
     (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

 Const WM_GETTEXT As Long = &HD
 Const WM_GETTEXTLENGTH As Long = &HE

 Sub test()
     Dim hWnd1 As Long, hWnd2 As Long
     Dim length As Long
     Dim s As String

     hWnd1 = FindWindow("SciCalc", "電卓")
     hWnd2 = FindWindowEx(hWnd1, 0&, "Static", vbNullString)

     length = SendMessage(hWnd2, WM_GETTEXTLENGTH, 0, 0)
     s = String(length + 1, vbNullChar)

     Call SendMessage(hWnd2, WM_GETTEXT, length + 1, ByVal s)
     MsgBox Left(s, InStr(s, vbNullChar) - 1)
 End Sub
 (やっちん)


 やっちんさんありがとうございます。
 今書き込みに気づいたので明日試してみます!
 まずはその報告まで。

 (banzai)


 自分で何もできないなら、あきらめることをお勧めします。 (アカギ)


 ありがとうございました。
 あきらめます。
 (banzai)


コメント返信:

[ 一覧(最新更新順) ]


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