コントロールをワークシートに直接追加すると、例外が発生し続けます。コードはフォーム内に配置され、リボンの一部ではありません。
これが私のコードです:
// using TExcel = Microsoft.Office.Tools.Excel;
// MyGlobalsWrapper references the Globals object, which has been passed across an
// AppDomain barrier
Excel.Worksheet activeWorksheet = MyGlobalsWrapper.Application.ActiveSheet;
TExcel.Worksheet toolsSheet = MyGlobalsWrapper.Factory.GetVstoObject(activeWorksheet);
var range = activeWorksheet.Range["A1:F20"];
var button = new System.Windows.Forms.Button();
button.Text = "HELLO!";
button.Visible = true;
// Both of these fail with the same exception
// Add manually (as the Range object might be the problem
toolsSheet.Controls.AddControl(button,10,10,button.Width,button.Height,id);
// Add using a range (which is more ideal for my usage)
toolsSheet.Controls.AddControl(button,range ,id);
例外は次のとおりです。
System.Runtime.Serialization.SerializationException occurred
Message=Type 'Microsoft.Office.Tools.Excel.ControlCollectionImpl' in Assembly 'Microsoft.Office.Tools.Excel.Implementation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable.
Source=mscorlib
StackTrace:
Server stack trace:
at System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)
at System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
at System.Runtime.Remoting.Channels.CrossAppDomainSerializer.SerializeMessageParts(ArrayList argsToSerialize)
at System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage..ctor(IMethodReturnMessage mrm)
at System.Runtime.Remoting.Messaging.SmuggledMethodReturnMessage.SmuggleIfPossible(IMessage msg)
at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoDispatch(Byte[] reqStmBuff, SmuggledMethodCallMessage smuggledMcm, SmuggledMethodReturnMessage& smuggledMrm)
at System.Runtime.Remoting.Channels.CrossAppDomainSink.DoTransitionDispatchCallback(Object[] args)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Microsoft.Office.Tools.Excel.Worksheet.get_Controls()
私の参考文献は次のとおりです。
Microsoft.Office.Interop.Excel
v12-CLR:v1.1.4322
Microsoft.Office.Interop.Excel.Extensions
v12
-CLR:2.0.50727
Microsoft.Office.ToolsMicrosoft.Office.Tools.CommonMicrosoft.Office.Tools.Common
。 v4.0.Utilities
Microsoft.Office.Tools.Excel
Microsoft.Office.Tools.Excel.v4.0.Utilities
v10-CLR:4.0.30919
でラップしてみましたSystem.Windows.Forms.UserControl
が、同じ問題があります。
注:ボタンだけでなく、ユーザーコントロールをシートに埋め込むつもりなので、Windowsコントロールを利用したいと思います。私は単純なコントロールから始めて、作業を進めていました。そのため、Excelフレームワークによって提供されるコントロールではなく、Windowsフォームコントロール(できればUserControl)を使用するソリューションが必要です。