トップ回答者
Office PIAからMS-Access2003にデータを入力したい。

質問
-
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:31
回答
すべての返信
-
大久保さん、早速の提案ありがとうございました。
今試してみましたが、
oAccessApp.Forms["マスターフォーム"].["検索窓"] = "123";
>IDがありません。
ならばと
oAccessApp.Forms["マスターフォーム"].Controls["検索窓"] = "123";
>プロパティまたはインデクサ 'Access.Controls.this[object]' は読み取り専用なので、割り当てることはできません。
(Access.Control)oCtrls["検索窓"] = "123";
> 型 'string' を 'Access.Control' に暗黙的に変換できません。明示的な変換が存在します。(cast が不足していないかどうかを確認してください)
oAccessApp.Forms["マスターフォーム"]!["検索窓"] = "123";
は文法のエラーが出ます。
朝から試行錯誤を続けていますが、プロの方からこのような提案をしていただけるということは、アプローチとしては間違っていないということでしょうから、
もう少し続けてみます。
何か良い方法が他にもあるようでしたら、教えてください。
-
ごめんなさい、誤解を与えてしまったようです。
私は確かにマイクロソフト社員ですが、PIA のプロでも C# のプロでも Access のプロでもありません。
Access のことを少し知っている、という程度です。ですので、「アプローチは間違っていない」という保証にはなりません。
私も手元で動作確認を行ってはいないですし、前の投稿は「できる」と確信を得て投稿をしたものではありません。もしかすると、そもそもAccessアプリケーションが、外部からの値の代入を許可していない(受け取ろうとしてない)可能性もあります。
誤解を与え大変申し訳ありませんでした。
私が上記のような方法を提案したのは、Access VBA での構文では、コントロールに値を代入するときには Value プロパティや Text プロパティなど「コントロールの値」を意味するようなプロパティを使わず、コントロールそのものに直接値を代入する書き方をするからです。ですが、
oAccessApp.Forms["マスターフォーム"].Controls["検索窓"] = "123";
>プロパティまたはインデクサ 'Access.Controls.this[object]' は読み取り専用なので、割り当てることはできません。
このエラーメッセージを見る限り、この書き方ではコントロールの中へ値を代入する動作をしていませんね。。。。
ちなみに、Access VBA で同様のことをした場合、 oCtrl = "123" とだけ書けば値はセットできるはずです。
マイクロソフト株式会社 フォーラム オペレータ 大久保 直美 -
ムルティプラおやじさん の発言:ひょっとして参照設定されているPIAのバージョンがAccess2003より高く、アーリーバインドでは互換性が無いのかもしれませんね。このため、一般的には一番低いバージョンのPIAを参照設定して使います。たぶん、このようにすれば
これは試行錯誤中に試しましたが、コンパイルは通るのですが実行時にExceptionのエラーでとまってしまいました。
この方向でなんとか! って頑張った時間もありましたが、私には無理でした。
((Access.TextBox)oCtrl).Value = "123";
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
trapemiyaさんへ
http://msdn.microsoft.com/ja-jp/library/aa159923(Office.11).aspx
ここに書いてある Microsoft Access11.0 Object Library を入れています。
検索したらXP用のPIAが出てきたので入れてみたのですが、参照設定の項目がアホになってしまい(T_T)
ソリューションエクスプローラの参照設定からAccessを消して、再度参照設定してもビックリマークが付いてしまいます。
直接Valueでの代入はあきらめて、まずはVisualStudioを復旧させることにします。
ありがとうございました!!
-
trapemiyaさんへ
型 'System.__ComObject' の COM オブジェクトをインターフェイス型 'Access.TextBox' にキャストできません。IID '{3B06E946-E47C-11CD-8701-00AA003F0F07}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。
というエラーでした。
こちらの環境が悪いようですね。だけど、私以外の環境で使った場合にエラーが出ても困るので、
最初に教えていただいた方法でコーディングしておきます。
-
環境の問題のようですね。このエラーの原因について私もわからない部分が多いのですが、以下が参考になると思います。
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/