質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1106閲覧

C# 遅延バインディングを使用してExcelのセルにプルダウンを表示させる方法

Taffy

総合スコア33

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2023/07/24 06:10

編集2023/07/24 06:38

実現したいこと

C#を使用し、Excelファイルの特定セルにプルダウンを作成します。
遅延バインディングを使用した実装方法について教えてください。

前提

  1. プルダウンの選択肢は都度変わりますので、プログラム的に選択肢を切り替えられるようにしたいです。
  2. 既存のソースコードが遅延バインディングを使用しているため、同様に遅延バインディングを使用したいです。
    (Microsoft.Office.Interop.Excelを使用しない)
  3. VBAで作成した以下のコードと同様の動作になるように C#でコーディングする方法が分からないです。

 

VBA

1 Range("P1").Validation.Delete 2 Range("P1").Validation.Add Type:=xlValidateList, Formula1:="選択肢1,選択肢2,選択肢3" 3 Range("P1").Validation.InCellDropdown = True

発生している問題・エラーメッセージ

System.Reflection.TargetInvocationException: '呼び出しのターゲットが例外をスローしました。' COMException: HRESULT からの例外:0x800A01A8

該当のソースコード

C#

1string cellAddress = "C3"; 2// Rangeを指定 3dynamic oRange = m_oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null 4 , m_oSheet, new object[] { cellAddress }); 5dynamic oValidation = oRange.GetType().InvokeMember("Validation", BindingFlags.GetProperty, null, oRange, null); 6dynamic oDelete = oValidation.GetType().InvokeMember("Delete", BindingFlags.GetProperty, null, oRange, null); 7 8// 遅延バインディングでデータバリデーションを設定  (※ここでエラー発生) 9oValidation.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, oValidation, new object[] 10{ 11 3, // Excel.XlDVType.xlValidateList 12 1, // Excel.XlFormatConditionOperator.xlEqual 13 1, // Excel.XlValueOperator.xlBetween 14 "選択肢1,選択肢2,選択肢3", 15 Type.Missing // Excel.XlDataBarBorderType.xlDataBarBorderSolid ではなく Type.Missing 16}); 17 18// セルにプルダウンを表示させる 19oRange.GetType().InvokeMember("Select", BindingFlags.InvokeMethod, null, oRange, null); 20m_oExcel.Selection.InCellDropdown = true;

試したこと

上記ソースコードにてC3セルにプルダウンを作成することを試したが、
上述のエラーが発生するため、Validationの Addができない。

補足情報(FW/ツールのバージョンなど)

言語 : C# (.NET Framework 4)
開発環境 : Microsoft Visual Studio Express 2017 for Windows Desktop

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
DeleteはValidationが存在するかチェックしてから行うこと と
Delete後、RangeとValidationのオブジェクト再取得を行うようにしました。

C#

1string cellAddress = "C3"; 2// Rangeを指定 3dynamic oRange = m_oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null 4 , m_oSheet, new object[] { cellAddress }); 5 6string[] dropdownItems = new string[] { "選択肢11", "選択肢22", "選択肢33" }; 7 8// Validationが存在するかチェック 9dynamic validation = oRange.Validation; 10bool hasValidation = validation != null; 11 12if (hasValidation) 13{ 14 dynamic oValidation = oRange.GetType().InvokeMember("Validation", BindingFlags.GetProperty, null, oRange, null); 15 dynamic oDelete = oValidation.GetType().InvokeMember("Delete", BindingFlags.GetProperty, null, oRange, null); 16} 17 18dynamic oRange2 = m_oSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null 19 , m_oSheet, new object[] { cellAddress }); 20dynamic oValidation2 = oRange2.GetType().InvokeMember("Validation", BindingFlags.GetProperty, null, oRange2, null); 21 22 23// 遅延バインディングでデータバリデーションを設定 24oValidation2.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, oValidation2, new object[] 25{ 26 3, // Excel.XlDVType.xlValidateList 27 1, // Excel.XlFormatConditionOperator.xlBetween ではなく Type.Missing 28 1, // Excel.XlValueOperator.xlBetween ではなく Type.Missing 29 "選択肢1,選択肢2,選択肢3", 30 1 // Excel.XlDataBarBorderType.xlDataBarBorderSolid ではなく Type.Missing 31}); 32 33// セルにプルダウンを表示させる 34oRange2.GetType().InvokeMember("Select", BindingFlags.InvokeMethod, null, oRange2, null);

投稿2023/07/24 06:55

Taffy

総合スコア33

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問