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

質問編集履歴

5

追記日付を太字に修正

2022/01/06 06:05

投稿

dn_
dn_

スコア141

title CHANGED
File without changes
body CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  ---
22
22
 
23
- 2020年1月5日18時00分追記
23
+ **2020年1月5日18時00分追記**
24
24
 
25
25
  環境検証、ソースコード、実行結果を記載します。
26
26
 
@@ -100,7 +100,7 @@
100
100
 
101
101
  ---
102
102
 
103
- 2020年1月6日15時00分追記
103
+ **2020年1月6日15時00分追記**
104
104
 
105
105
  現象が出るマシンと出ていないマシンがあり、
106
106
  環境に依存して現象が発生しているようです。

4

追加情報記載

2022/01/06 06:05

投稿

dn_
dn_

スコア141

title CHANGED
File without changes
body CHANGED
@@ -96,4 +96,35 @@
96
96
  ・64ビットビルド時
97
97
 
98
98
  ビルド:64ビット
99
- NG
99
+ NG
100
+
101
+ ---
102
+
103
+ 2020年1月6日15時00分追記
104
+
105
+ 現象が出るマシンと出ていないマシンがあり、
106
+ 環境に依存して現象が発生しているようです。
107
+ 現象が出るマシンと出ていないマシンの違いは次の通りでした。
108
+
109
+ 現象が出ているマシンで64ビットビルドしたものは、
110
+ Type.GetTypeFromProgID("Excel.Application")で
111
+ Typeとして、「System.__ComObject」が返って来ていました。
112
+
113
+ しかし32ビットビルドだと
114
+ Typeとして、「Microsoft.Office.Interop.Excel.ApplicationClass」が
115
+ 返って来ます。
116
+
117
+ 現象が出ていないマシンでは、
118
+ 32ビットと64ビットのどちらでも、
119
+ Typeとして、「Microsoft.Office.Interop.Excel.ApplicationClass」が返って来ます。
120
+
121
+
122
+ COMオブジェクトの場合はGetType()をすると「System.__ComObject」という
123
+ クラスで取得されることもあるようです。
124
+ どのようなケースでそうなるか明確な情報は見つけられませんでした。
125
+
126
+ 下記URLでも類似の現象が出ており、
127
+ Excel(ストアアプリ)→ オフィス2016のデスクトップ版
128
+ の変更により解消した様です。
129
+ しかしストアアプリでも遅延バインディングは利用できる為、今回現象とは関係ないかもしれません。
130
+ https://social.technet.microsoft.com/Forums/Windows/ja-JP/77942146-7be9-4409-81cc-aa19e1ba4ad9/1245012503125221236312425excel12364216281240320986123791239412356?forum=Office2016ITProJP

3

水平線追加

2022/01/06 06:04

投稿

dn_
dn_

スコア141

title CHANGED
File without changes
body CHANGED
@@ -18,8 +18,8 @@
18
18
 
19
19
  見識のある方がいらっしゃいましたら、よろしくお願いします。
20
20
 
21
+ ---
21
22
 
22
-
23
23
  2020年1月5日18時00分追記
24
24
 
25
25
  環境検証、ソースコード、実行結果を記載します。

2

環境検証、ソースコード、実行結果を記載

2022/01/05 09:07

投稿

dn_
dn_

スコア141

title CHANGED
File without changes
body CHANGED
@@ -16,4 +16,84 @@
16
16
  このページの方法は試しておりませんが、GUID指定によりExcelバージョンに依存してしまう為除外しています。
17
17
  https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/dc59b406-3f86-4fac-817a-f4fafd3ffdb9/36933243101249612452125311248712451125311246412391excel1239812452?forum=csharpgeneralja
18
18
 
19
- 見識のある方がいらっしゃいましたら、よろしくお願いします。
19
+ 見識のある方がいらっしゃいましたら、よろしくお願いします。
20
+
21
+
22
+
23
+ 2020年1月5日18時00分追記
24
+
25
+ 環境検証、ソースコード、実行結果を記載します。
26
+
27
+ 検証環境
28
+ OS:Windows10 20H2
29
+ ビルド環境:Microsoft Visual Studio Professional 2019 Version 16.11.3
30
+ フレームワーク:.NET Framework4.8
31
+ Excel2013 15.0.5381.1000 32ビット
32
+
33
+ ```C#
34
+ using System;
35
+ using System.Collections.Generic;
36
+ using System.Linq;
37
+ using System.Reflection;
38
+ using System.Threading.Tasks;
39
+ using System.Windows.Forms;
40
+ using System.Threading;
41
+ namespace WindowsFormsApp13 {
42
+
43
+ static class Program {
44
+
45
+ [STAThread]
46
+ static void Main() {
47
+ Console.WriteLine("ビルド:"+(IntPtr.Size==4?"32ビット":"64ビット"));
48
+
49
+ Type objeType = Type.GetTypeFromProgID("Excel.Application");
50
+
51
+ dynamic _APPLICATION = Activator.CreateInstance(objeType);
52
+
53
+ _APPLICATION.Visible = true;
54
+
55
+ EventInfo eventInfo = _APPLICATION.GetType().GetEvent("SheetSelectionChange");
56
+
57
+ if(eventInfo!=null){
58
+ Console.WriteLine("OK");
59
+
60
+ Type eventType = eventInfo.EventHandlerType;
61
+
62
+ Type type = typeof(Program);
63
+
64
+ MethodInfo methodInfo = type.GetMethod("SheetSelectionChangeEvent");
65
+
66
+ Delegate d = Delegate.CreateDelegate(eventType, methodInfo);
67
+
68
+ eventInfo.AddEventHandler(_APPLICATION, d);
69
+ }else{
70
+ Console.WriteLine("NG");
71
+ }
72
+ Console.ReadKey();
73
+ }
74
+
75
+ public static void SheetSelectionChangeEvent(object sheet, object range){
76
+ Console.WriteLine("SheetSelectionChangeEvent");
77
+ }
78
+ }
79
+ }
80
+ ```
81
+
82
+
83
+ 実行結果はビルド毎に下記の通りとなりました。
84
+
85
+ ・32ビットビルド時
86
+  ※起動したエクセルで新規ファイルを開いてセル選択を何度か実行
87
+
88
+ ビルド:32ビット
89
+ OK
90
+ SheetSelectionChangeEvent
91
+ SheetSelectionChangeEvent
92
+ SheetSelectionChangeEvent
93
+ SheetSelectionChangeEvent
94
+
95
+
96
+ ・64ビットビルド時
97
+
98
+ ビルド:64ビット
99
+ NG

1

原因が64ビットビルドであることが判明した為、64ビットビルドを論点とした内容へ編集

2022/01/05 09:05

投稿

dn_
dn_

スコア141

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,6 @@
1
1
  前提として、Excelバージョンに依存しない様にラッパークラスであるMicrosoft.Office.Interop.Excelは利用せずに、遅延バインディングしたいと思っております。
2
2
 
3
+ 64ビットビルドすると、
3
4
  Type.GetTypeFromProgID("Excel.Application")
4
5
  で取得したTypeからGetEventsメソッドやGetMethodsメソッドを呼んでも
5
6
  Microsoft.Office.Interop.Excel.Applicationクラスの
@@ -8,12 +9,11 @@
8
9
  ここでイベントが取れない為、イベントハンドラーが登録できず困りました。
9
10
 
10
11
 
11
- まさに下記ページの方法を行おうとしておりますが、GetEventメソッドの戻り値がnullになってしまいイベントが取れません。環境依存なのか、記事が間違っているのかわかりせん
12
+ まさに下記ページの方法を行おうとしておりますが、64ビットビルドだとGetEventメソッドの戻り値がnullになってしまいイベントが取れません。32ビットビルドで正常に動作し
12
13
  https://littlepower-suesan.hatenadiary.org/entry/20110628/1309266642
13
14
 
14
15
 
15
16
  このページの方法は試しておりませんが、GUID指定によりExcelバージョンに依存してしまう為除外しています。
16
17
  https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/dc59b406-3f86-4fac-817a-f4fafd3ffdb9/36933243101249612452125311248712451125311246412391excel1239812452?forum=csharpgeneralja
17
18
 
18
- 遅延バインディングの場合はイベントのフックは行えないのでしょうか。
19
19
  見識のある方がいらっしゃいましたら、よろしくお願いします。