
実現したいこと
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

NetOfficeを使ったことがないのですが、
デバッグでitemとitem.Objectの型を見ることはできますでしょうか?
yametai さん質問ありがとうございます。
itemとitem.Objectの型との事ですが、的外れの回答となってしまいましたら申し訳ございません。
「item」は、Excel.OLEObject
「item.Object」は、Dynamic(System.__ComObject) と思われます。

コメントありがとうございます。
ActiveXコントロールというのをあまり使ったことがなかったのですが、
Excel.TextBoxとは別物なのかもしれないですね。
(公式のドキュメントからActiveX関係のところが見つけられませんでしたので正しくない理解かもしれませんが・・)
VBAのActiveXコントロールに関するコードを見ると、
「item.Object」に相当するオブジェクトを操作しているように見えましたので、
キャストせずに操作してみたらいかがでしょうか。
(Dynamicはそういうことかなと思いました。)
該当のソースコードの15~16行目を次のようにする感じでしょうか。
`item.Object.Value = "test"`
Excel.TextBox exTb = item as Excel.TextBox;
でいけたりしませんかね?
YAmaGNZ さん コメントありがとうございます。
Excel.TextBox exTb = item as Excel.TextBox; ですと、
エラー (アクティブ) CS0039 参照の変換、ボックス変換、アンボックス変換、折り返しの変換、または null 型の変換で、型 'NetOffice.ExcelApi.OLEObject' を 'NetOffice.ExcelApi.TextBox' に変換できません。 となってしまい、ビルドエラーを起こしてしまいます。
yametai さん ありがとうございます。
item.Object.Value = "test"; ですと、下記ビルドエラーとなってしまします。
エラー (アクティブ) CS1061 'object' に 'Value' の定義が含まれておらず、型 'object' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Value' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。

コメントありがとうございます。
ごめんなさい・・dynamicしばらく使っていなかったので忘れてしまっていました・・
下のような感じですね。
```cs
dynamic obj = item.Object;
obj.Value = "test";
```
yametai さん 再度、回答ありがとうございます。
回答のコードで無事解決いたしました。現時点では、自分自身dynamicについて理解できていませんが
解決いたしましたのでベストアンサーに選びたいと思います。

回答1件
あなたの回答
tips
プレビュー