質問するログイン新規登録

Q&A

解決済

1回答

429閲覧

C#からExcel ActiveXコントロール テキストボックスのテキスト設定

bgc

総合スコア2

0グッド

0クリップ

投稿2024/07/14 19:52

0

0

実現したいこと

Excel上に作成したActiveXコントロールのテキストボックスに、指定した文字列を設定したい。

発生している問題・分からないこと

Excel.TextBox exTb = item.Object as Excel.TextBox; の部分が悪いと思うのですが、
どのように記述していいのか分かりません

該当のソースコード

using Excel = NetOffice.ExcelApi; private void Excel_Output() { Excel.Application xlApp = Excel.Application.GetActiveInstance(); using(xlApp) { Excel.Workbook xlBook = xlApp.Workbooks[1]; Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets.First(); Excel.OLEObjects oleObjects = xlSheet.OLEObjects() as Excel.OLEObjects; foreach (Excel.OLEObject item in oleObjects) { if (item.ProgId == "Forms.TextBox.1") { Excel.TextBox exTb = item.Object as Excel.TextBox; exTb.Text = "test"; } } xlApp.Dispose(); } }

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

下記、エラーになってしまいます。

System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。' exTb が null でした。

補足

OS Windows11
C#
NetOfficeFw.Excel 1.9.3
Excel 2021

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2024/07/15 11:20

NetOfficeを使ったことがないのですが、 デバッグでitemとitem.Objectの型を見ることはできますでしょうか?
bgc

2024/07/15 13:39

yametai さん質問ありがとうございます。 itemとitem.Objectの型との事ですが、的外れの回答となってしまいましたら申し訳ございません。 「item」は、Excel.OLEObject 「item.Object」は、Dynamic(System.__ComObject) と思われます。
退会済みユーザー

退会済みユーザー

2024/07/15 23:54

コメントありがとうございます。 ActiveXコントロールというのをあまり使ったことがなかったのですが、 Excel.TextBoxとは別物なのかもしれないですね。 (公式のドキュメントからActiveX関係のところが見つけられませんでしたので正しくない理解かもしれませんが・・) VBAのActiveXコントロールに関するコードを見ると、 「item.Object」に相当するオブジェクトを操作しているように見えましたので、 キャストせずに操作してみたらいかがでしょうか。 (Dynamicはそういうことかなと思いました。) 該当のソースコードの15~16行目を次のようにする感じでしょうか。 `item.Object.Value = "test"`
YAmaGNZ

2024/07/16 00:34

Excel.TextBox exTb = item as Excel.TextBox; でいけたりしませんかね?
bgc

2024/07/16 12:38

YAmaGNZ さん コメントありがとうございます。 Excel.TextBox exTb = item as Excel.TextBox; ですと、 エラー (アクティブ) CS0039 参照の変換、ボックス変換、アンボックス変換、折り返しの変換、または null 型の変換で、型 'NetOffice.ExcelApi.OLEObject' を 'NetOffice.ExcelApi.TextBox' に変換できません。 となってしまい、ビルドエラーを起こしてしまいます。
bgc

2024/07/16 12:53

yametai さん ありがとうございます。 item.Object.Value = "test"; ですと、下記ビルドエラーとなってしまします。 エラー (アクティブ) CS1061 'object' に 'Value' の定義が含まれておらず、型 'object' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Value' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。 
退会済みユーザー

退会済みユーザー

2024/07/16 12:57

コメントありがとうございます。 ごめんなさい・・dynamicしばらく使っていなかったので忘れてしまっていました・・ 下のような感じですね。 ```cs dynamic obj = item.Object; obj.Value = "test"; ```
bgc

2024/07/16 13:07

yametai さん 再度、回答ありがとうございます。 回答のコードで無事解決いたしました。現時点では、自分自身dynamicについて理解できていませんが 解決いたしましたのでベストアンサーに選びたいと思います。
guest

回答1

0

ベストアンサー

コメントありがとうございます。
解決したようで良かったです。
自己解決でクローズしていただいても良かったのですが回答しますね。

VBAでActiveXコントロールを操作するコードについて
ネットの記事を見るとitem.Objectに相当するオブジェクトを操作しているようでした。
item.ObjectはDynamicのようですので、dynamic型で受け取って操作すると良いかなと思いました。
次のような感じですね。

cs

1dynamic obj = item.Object; 2obj.Value = "test";

現時点では、自分自身dynamicについて理解できていませんが

dynamicについては次のリンク先を見ると良いかなと思います。

dynamic 型は静的な型ですが、dynamic 型のオブジェクトは静的な型チェックをバイパスします。 ほとんどの場合、object 型を使用する場合と同様に機能します。 コンパイラは、dynamic 要素がすべての操作をサポートしていることを前提としています。 したがって、オブジェクトが COM API、IronPython などの動的言語、HTML ドキュメント オブジェクト モデル (DOM)、リフレクション、プログラムの他の場所のいずれから値を取得するのかを決定する必要はありません。 ただし、コードが無効な場合には、実行時にエラーが発生します。
dynamic 型の使用 - C# | Microsoft Learn

ビルド時に型チェックがされないため積極的に使うようなものではないと思いますが、
COMとか操作する際に使う必要があるかなと思います。
型定義がなくてもプロパティやメソッドを参照することができます。
(上の引用に記載されている通り、ビルド時にエラーにならないだけで、存在しないプロパティやメソッドを参照すると実行時にエラーになってしまいますので注意が必要ですね。)

投稿2024/07/16 23:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bgc

2024/07/17 10:12

yametai さん 丁寧で分かりやすい回答ありがとうございます。 解決できた事が非常に嬉しいです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問