none
Office PIAからMS-Access2003にデータを入力したい。 RRS feed

  • 質問

  • 1日試行錯誤してみたのですが、まったく解決できそうにないので助けてください。

    開いているマスターフォームにある、検索窓というTextBoxに値を代入したいのですが、このAccess.Control oCtrlの何を使用して
    値を代入したらよいのかがさっぱりわかりません。

    Access.Application oAccessApp;
    oAccessApp = (Access.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Access.Application");
    Access.Form oForm = oAccessApp.Forms["マスターフォーム"];
    Access.Controls oCtrls = oForms.Controls;
    Access.Control oCtrl = (Access.Control)oCtrls["検索窓"];
    oCtrl.Value = "123";  // でも.Valueがない

    もしかしたら、とんちんかんな事をしているのかも知れません。どなたか教えてください。

    ------ 16:29 追記
    oFormの中にあるマクロの実行はできていましたので、ここまではokだと思います。
    2009年2月19日 7:26

回答

  •  リフレクションを使って下さい。

    object[] Parameters = {"123"};  
    oCtrl.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oCtrl, Parameters); 

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月20日 5:32
    モデレータ

すべての返信

  • 少しだけ追記します。
    oFormの中にあるマクロの実行はできていますので、oFormまでは正しいと確信して作業していました。
    2009年2月19日 7:29
  • こんにちは、フォーラムオペレータ大久保です。
    すぐに試せる環境がないので思いつきなんですが…


    oAccessApp.Forms["マスターフォーム"]!["検索窓"] = "123"

    とか

    oAccessApp.Forms["マスターフォーム"].["検索窓"] = "123"

    とか

    (Access.Control)oCtrls["検索窓"] = "123"

    とかではだめでしょうか?だめでしたらごめんなさい!すでに試してたらごめんなさい!!
    マイクロソフト株式会社 フォーラム オペレータ 大久保 直美
    2009年2月20日 2:49
  • 大久保さん、早速の提案ありがとうございました。

    今試してみましたが、
    oAccessApp.Forms["マスターフォーム"].["検索窓"] = "123";
    >IDがありません。
    ならばと
    oAccessApp.Forms["マスターフォーム"].Controls["検索窓"] = "123";
    >プロパティまたはインデクサ 'Access.Controls.this[object]' は読み取り専用なので、割り当てることはできません。

    (Access.Control)oCtrls["検索窓"] = "123";
    > 型 'string' を 'Access.Control' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)

    oAccessApp.Forms["マスターフォーム"]!["検索窓"] = "123";
    は文法のエラーが出ます。

    朝から試行錯誤を続けていますが、プロの方からこのような提案をしていただけるということは、アプローチとしては間違っていないということでしょうから、
    もう少し続けてみます。

    何か良い方法が他にもあるようでしたら、教えてください。
    2009年2月20日 3:37
  • ごめんなさい、誤解を与えてしまったようです。

    私は確かにマイクロソフト社員ですが、PIA のプロでも C# のプロでも Access のプロでもありません。
    Access のことを少し知っている、という程度です。ですので、「アプローチは間違っていない」という保証にはなりません。

    私も手元で動作確認を行ってはいないですし、前の投稿は「できる」と確信を得て投稿をしたものではありません。もしかすると、そもそもAccessアプリケーションが、外部からの値の代入を許可していない(受け取ろうとしてない)可能性もあります。
    誤解を与え大変申し訳ありませんでした。


    私が上記のような方法を提案したのは、Access VBA での構文では、コントロールに値を代入するときには Value プロパティや Text プロパティなど「コントロールの値」を意味するようなプロパティを使わず、コントロールそのものに直接値を代入する書き方をするからです。ですが、

    oAccessApp.Forms["マスターフォーム"].Controls["検索窓"] = "123";
    >プロパティまたはインデクサ 'Access.Controls.this[object]' は読み取り専用なので、割り当てることはできません。

    このエラーメッセージを見る限り、この書き方ではコントロールの中へ値を代入する動作をしていませんね。。。。


    ちなみに、Access VBA で同様のことをした場合、 oCtrl = "123" とだけ書けば値はセットできるはずです。

    マイクロソフト株式会社 フォーラム オペレータ 大久保 直美
    2009年2月20日 4:00
  •  リフレクションを使って下さい。

    object[] Parameters = {"123"};  
    oCtrl.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, oCtrl, Parameters); 

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月20日 5:32
    モデレータ
  • リフレクションを使って代入できるならそのプロパティが存在するわけで…。
    もしかして
    ((Access.TextBox)oCtrl).Value = "123"
    でよかったり?
    2009年2月20日 5:58
  • trapemiyaさん、ありがとうございます!! 見事動作しました!
    これで先に進めます!
    2009年2月20日 6:01
  •  あっ、確かに。難しく考えすぎてしまった・・・orz
    フォローありがとうございます。

    というわけで、
    ((Access.TextBox)oCtrl).Value = "123"
    を使ってください。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月20日 6:02
    モデレータ
  • 佐祐理さんへ

    これは試行錯誤中に試しましたが、コンパイルは通るのですが実行時にExceptionのエラーでとまってしまいました。
    この方向でなんとか! って頑張った時間もありましたが、私には無理でした。
    2009年2月20日 6:05
  • あらあらそうでしたか。ならinterface名が違うのでしょうね。代わりにAccess._TextBoxだとどうでしょう?
    これで外してらどんなinterfaceなのかわかりません。

    ところでこんなときにC# 4.0(Visual Studio 2010)のdynamicキーワードで
    dynamic oCtrl = oCtrls["検索窓"]; 
    oCtrl.Value = "123"
     
    とやれそうな予感。
    2009年2月20日 6:13
  •  trapemiya さん、佐祐理 さん、ありがとうございました!
    ムルティプラおやじ さん、ご迷惑おかけして申し訳ありませんでした。

    # やはり素人が無理してレスするものじゃないですね… 投稿ミスまでしちゃうし。
    ## もう少し慎重になります。
    マイクロソフト株式会社 フォーラム オペレータ 大久保 直美
    2009年2月20日 6:13
  • ムルティプラおやじさん の発言:

    これは試行錯誤中に試しましたが、コンパイルは通るのですが実行時にExceptionのエラーでとまってしまいました。
    この方向でなんとか! って頑張った時間もありましたが、私には無理でした。

    ひょっとして参照設定されているPIAのバージョンがAccess2003より高く、アーリーバインドでは互換性が無いのかもしれませんね。このため、一般的には一番低いバージョンのPIAを参照設定して使います。たぶん、このようにすれば
    ((Access.TextBox)oCtrl).Value = "123";
    で動くのではないかと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月20日 6:26
    モデレータ
  • 簡潔になるのであれば助かるので、全部テストさせていただきます。
    Access._Textboxでも同じでした。
    2009年2月20日 7:11
  • trapemiyaさんへ

    http://msdn.microsoft.com/ja-jp/library/aa159923(Office.11).aspx
    ここに書いてある Microsoft Access11.0 Object Library を入れています。

    検索したらXP用のPIAが出てきたので入れてみたのですが、参照設定の項目がアホになってしまい(T_T)
    ソリューションエクスプローラの参照設定からAccessを消して、再度参照設定してもビックリマークが付いてしまいます。

    直接Valueでの代入はあきらめて、まずはVisualStudioを復旧させることにします。
    ありがとうございました!!

    2009年2月20日 7:35
  • Access2003がターゲットであれば、バージョンは11で良いはずです。私のところで試したところ、
    ((Access.TextBox)oCtrl).Value = "123"; 
    で問題なく動作しました。
    ちなみに例外の詳細はどのような内容だったのでしょうか?
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月20日 7:46
    モデレータ
  • trapemiyaさんへ

    型 'System.__ComObject' の COM オブジェクトをインターフェイス型 'Access.TextBox' にキャストできません。IID '{3B06E946-E47C-11CD-8701-00AA003F0F07}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。

    というエラーでした。
    こちらの環境が悪いようですね。だけど、私以外の環境で使った場合にエラーが出ても困るので、
    最初に教えていただいた方法でコーディングしておきます。
    2009年2月20日 9:38
  • 環境の問題のようですね。このエラーの原因について私もわからない部分が多いのですが、以下が参考になると思います。

    C# Excelのプロパティ>ユーザ設定を扱う方法
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=32068&forum=7&start=8


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月22日 6:49
    モデレータ