codememo

내장형 Excel의 이벤트 처리 방법OleObjects 또는 Excel입니다.모양들

tipmemo 2023. 7. 2. 20:45
반응형

내장형 Excel의 이벤트 처리 방법OleObjects 또는 Excel입니다.모양들

작업중다니에서 있습니다.C#그리고 지금은VB.NET 京都의 .VBA프로그램.많이 있습니다.MSForms/OleObjects처럼 그 안에 박혀 있는.CommandButton또는 심지어 이미지.

의 첫 을 제첫번생각모든버다튼음같것과다이니습었선는언하이을은째▁all로 선언하는 것이었습니다.Microsoft.Vbe.Interop.Forms.CommandButton하지만 그것은 다음으로 이어집니다.COM의 .System._COM type 빠질 수 ...Forms.CommandButton솔루션의 더 일반적인 버전을 시도하면 항목이 없고 모든 항목을 검색하려고 하면VBComponets 나는 그것들이 모두 시트라는 것을 주목합니다.workbook하지만 통제장치는 없습니다.

foreach (VBComponent xxx in Globals.ThisWorkbook.VBProject.VBComponents) {
    Interaction.MsgBox(xxx.Name);
    Interaction.MsgBox(xxx.ToString);
}

이 은 따서이모컨다은있않음지다습니에트롤라든▁in▁are▁not다▁thus에 있지 않습니다..VBComponets하지만 OLE 개체로 찾을 수 있습니다.thisworkbook.worksheets(n).OLEobjects(이것은 저에게 반직관적이지만, 저는 아마도 처음부터 시스템을 이해하지 못할 것입니다.)

이러한 개체에서 클릭 작업을 처리하려면 어떻게 해야 합니까?

제 생각에는 제가 그 컴퓨터를 사용해야 할 것 같습니다.Excel.OLEObjectEvents_Event인터페이스, 하지만 방법을 알 수가 없어요.▁events로 사용자 하면,delegates저는 그들에게 할당할 수 없을 것 같습니다.OleObjects사용할 경우ActionClickEventHandler.CreateDelegate저는 그것이 막다른 골목이라고 생각하게 만드는 매우 다양한 오류를 얻을 수 있습니다.

MS의 공식 문서는 도움이 되지 않는 것 같습니다. 비록 그것이 저에게 아이디어를 소개했지만.Verb제가 조사하고 있는 것입니다.지금까지는 "응용 프로그램 시작 실패"와 같은 COM 오류만 발생했습니다.

두 가지 표준 이벤트 중 하나를 사용하려고 해도,.GotFocus나는 항상 0x80040200 오류를 끌어냅니다.예:

Excel.OLEObject ButtonCatcher = Globals.ThisWorkbook.Worksheets(1).OLEObjects("CommandButton1");
ButtonCatcher.GotFocus += CommandButton1_Click;

예외 COME 예를합다니를 .Exception from HRESULT: 0x80040200두 번째 줄에사무실 개발 사이트에서 코드 번호를 조회한 후 확인한 버튼이 활성화되었습니다.

컨트롤이 포함된 시트에 대해 코드 내에서 보다 일반적인 접근 방식 시도:

object CommandButtonStart = this.GetType().InvokeMember("CommandButton1", System.Reflection.BindingFlags.GetProperty, null, this, null);

메서드 누락 오류를 발생시킵니다.

어떤 도움이든 정말 감사합니다, 이건 분명해야 할 것 같고 놓치고 있습니다.


**이을 **로 할 수 되었습니다.Excel.Shape하지만 VSTO의 기능이나 서브를 실행하는 데는 더 이상 도움이 되지 않습니다.가지고 놀고 있어요Excel.Shape.OnAction하지만 여기에는 VBA 서브를 호출해야 합니다.아마도 VSTO가 COM으로 표시되는 한 VSTO에서 서브를 호출하는 VBA 서브를 호출할 수 있을 것입니다.이것은 정말 우회적인 것 같고 마지막 수단으로만 하고 싶습니다.

솔루션 유형: VSTO 문서 수준

시나리오:
1.) 훌륭합니다.런타임에 생성된 워크시트입니다.(워크시트 호스트 항목 아님)
2.) 런타임에 워크시트에 클릭 시 C# 코드를 트리거하는 버튼을 추가합니다.

어셈블리 참조:
마이크로소프트.Vbe.Interop(마이크로소프트).Vbe.Interop.dll)
마이크로소프트.Vbe. 인터럽트.양식(Microsoft).Vbe. 인터럽트.Forms.dll)
마이크로소프트.Visual Basic(Microsoft).VisualBasic.dll)

테스트/작업 코드:

using MSForms = Microsoft.Vbe.Interop.Forms;
using System.Windows.Forms;

...

Microsoft.Vbe.Interop.Forms.CommandButton CmdBtn;

private void CreateOLEButton()
{
   Excel.Worksheet ws = Globals.ThisWorkbook.Application.Sheets["MyWorksheet"];

   // insert button shape
   Excel.Shape cmdButton = ws.Shapes.AddOLEObject("Forms.CommandButton.1", Type.Missing, false, false, Type.Missing, Type.Missing, Type.Missing, 500, 5, 100, 60);
   cmdButton.Name = "btnButton";

   // bind it and wire it up
   CmdBtn = (Microsoft.Vbe.Interop.Forms.CommandButton)Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(ws, null, "btnButton", new object[0], null, null, null);
   CmdBtn.Caption = "Click me!";
   CmdBtn.Click += new MSForms.CommandButtonEvents_ClickEventHandler(ExecuteCmd_Click);
}

private void ExecuteCmd_Click()
{
   MessageBox.Show("Click");
}

NewLateBinding을 사용해 보셨습니까?늦은 겟?

using MSForms = Microsoft.Vbe.Interop.Forms;
using Microsoft.VisualBasic.CompilerServices;

...

MSForms.CommandButton CommandButton1 = (MSForms.CommandButton)NewLateBinding.LateGet(Globals.ThisWorkbook.Worksheets(1), null, "CommandButton1", new object[0], null, null, null);                
CommandButton1.Click += new Microsoft.Vbe.Interop.Forms.CommandButtonEvents_ClickEventHandler(CommandButton1_Click);

VSTO 포럼 및 이전 블로그 게시물에서 MSDN에 참조됩니다.

이렇게 워크북의 코드 모듈에 코드를 프로그래밍 방식으로 추가할 수 있습니까?

Private Sub CommonButton_Click(ByVal buttonName As String)
  MsgBox "You clicked button [" & buttonName & "]"
End Sub

Private Sub CreateEventHandler(ByVal buttonName As String)
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim codeText As String
    Dim LineNum As Long

    Set VBComp = ThisWorkbook.VBProject.VBComponents(Me.CodeName)
    Set CodeMod = VBComp.CodeModule
    LineNum = CodeMod.CountOfLines + 1

    codeText = codeText & "Private Sub " & buttonName & "_Click()" & vbCrLf
    codeText = codeText & "  Dim buttonName As String" & vbCrLf
    codeText = codeText & "  buttonName = """ & buttonName & "" & vbCrLf
    codeText = codeText & "  CommonButton_Click buttonName" & vbCrLf
    codeText = codeText & "End Sub"
    CodeMod.InsertLines LineNum, codeText
End Sub

interop forms 툴킷을 사용합니다.마이크로소프트로부터 무료입니다..NET에서 VBA로 이벤트 데이터를 주고 받는 컴 래퍼 및 이벤트 메신저 클래스를 제공합니다..NET의 VBA에서 발생하는 제어 이벤트와 .NET에서 발생하는 VBA에서 발생하는 이벤트를 처리하는 데 사용했습니다.당신은 인터럽트를 사용할 것입니다.

http://www.codeproject.com/Articles/15690/VB-C-Interop-Form-Toolkit .

툴킷 설명서에서 다음을 참조하십시오.

Interop UserControls는 Visual Basic 6.0에서 기본적인 일련의 고유 이벤트(Click, GotFocus, Validate 등)를 제공합니다.Visual Studio .NET에서 사용자 지정 이벤트를 정의하고 RaiseEvent를 사용하여 이벤트를 발생시킬 수 있습니다.Visual Basic 6.0에서 이벤트를 처리하려면 프로젝트 참조를 추가하고 코드에 WithEvents 변수 선언을 추가한 다음 컨트롤 자체가 아닌 WithEvents 변수를 사용하여 이벤트를 처리해야 합니다.

Interop 사용자 컨트롤 사용자 지정 이벤트 처리 방법

Visual Basic 6.0의 프로젝트 메뉴에서 참조를 누르십시오.ControlNameCtl에 대한 참조가 이미 있습니다. 여기서 ControlName은 Interop UserControl의 이름입니다.

사용 가능한 참조 목록에서 ControlName에 대한 참조를 찾아 확인한 다음 확인을 클릭합니다.

코드 편집기에서 WithEvents 변수에 대한 선언을 추가합니다.

Dim WithEvents ControlNameEvents As ControlLibrary.ControlName

Form_Load 이벤트 핸들러에서 다음 코드를 추가하여 WithEvents 변수를 초기화합니다.

Private Sub Form_Load()
    Set ControlNameEvents = Me.ControlNameOnVB6Form
End Sub

WithEvents 변수의 이벤트 핸들러에서 사용자 지정 이벤트를 처리할 코드를 추가합니다.

Private Sub ControlNameEvents_MyCustomEvent()
    MsgBox("My custom event fired")
End Sub

감사합니다 레오 구르디안
VB.Net에서는 다음과 같이 표시됩니다.

어셈블리 참조:
마이크로소프트.Vbe.Interop(마이크로소프트).Vbe.Interop.dll)
마이크로소프트.Vbe. 인터럽트.양식(마이크로소프트).Vbe. 인터럽트.Forms.dll)
마이크로소프트.Visual Basic(Microsoft).VisualBasic.dll)

Imports Microsoft.Office.Interop.Excel
Imports Microsoft.VisualBasic
Imports MSForms = Microsoft.Vbe.Interop.Forms

Private Sub CreateOLEButton()
    Dim ws As Excel.Worksheet = (CType(Application.ActiveSheet, Excel.Worksheet))
    Dim cmdButton As Excel.Shape = ws.Shapes.AddOLEObject("Forms.CommandButton.1", Type.Missing, False, False, Type.Missing, Type.Missing, Type.Missing, 500, 5, 100, 60)
    cmdButton.Name = "btnButton"
    Dim CmdBtn As Microsoft.Vbe.Interop.Forms.CommandButton = CType(Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(ws, Nothing, "btnButton", New Object(-1) {}, Nothing, Nothing, Nothing), Microsoft.Vbe.Interop.Forms.CommandButton)
    CmdBtn.Caption = "Click me!"
    AddHandler CmdBtn.Click, AddressOf ExecuteCmd_Click
End Sub
Private Sub ExecuteCmd_Click()
    'do something 
End Sub

언급URL : https://stackoverflow.com/questions/22368680/how-to-handle-events-from-embedded-excel-oleobjects-or-excel-shapes

반응형