DOBON.NETプログラミング道掲示板

[ 最新記事及び返信フォームをトピックトップへ ]

■35004 / inTopicNo.1)  VBで開いたExcelでのイベントを取得するには
  
□投稿者/ ぶぶ 一般人(1回)-(2022/02/07(Mon) 17:40:36)
  • アイコン環境/言語:[Windows10 vb.net Excel 2007 ] 
    分類:[.NET] 

    VB.netでExcelを起動し、VBでの操作により、Excelを編集するプログラムを
    作成しています。

    この場合、Excelでのイベント(クリックや右クリック、ダブルクリックなど)を

    VB側で取得する方法はありますか?

    Excelは毎回新規で作成して編集するので、Excel側に組み込むことは考えていません。

    よろしくお願いいたします。
マルチポストを報告
違反を報告
引用返信 削除キー/
■35005 / inTopicNo.2)  Re[1]: VBで開いたExcelでのイベントを取得するには
□投稿者/ 魔界の仮面弁士 大御所(1415回)-(2022/02/07(Mon) 18:31:11)
  • アイコンNo35004に返信(ぶぶさんの記事)
    > この場合、Excelでのイベント(クリックや右クリック、ダブルクリックなど)を
    > VB側で取得する方法はありますか?
    > Excelは毎回新規で作成して編集するので、
    > Excel側に組み込むことは考えていません。

    出来るかもしれませんが、かなり面倒だとは思います。

    RelaxTools などのように、Excel 側のアドインとして
    実装する方向についても、併せて検討してみては如何でしょうか。
    https://software.opensquare.net/relaxtools/


    技術的には OLE オートメーションによって、Excel 側で発生したイベントを
    VB 側で捕らえる事もできるのですが、Excel.Application オブジェクトで
    Excel のイベントで使えそうなマウス絡みのイベントといっても、直接的には
     SheetBeforeDoubleClick イベント
     SheetBeforeRightClick イベント
     SheetSelectionChange イベント
    ぐらいしか無いと思います。

    また、Excel がセル編集モードになったり、ダイアログの表示中などは、
    Excel 側で行った操作を、VB 側で受け取ることができません。


    Excel.Application オブジェクトのイベントを捕らえる以外の方法としては、
    RawInput あるいは DirectInput を用いて、マウスボタンの押下を
    捕らえるという手法があります。

    http://bbs.wankuma.com/index.cgi?mode=al2&namber=97964&KLOG=170
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=92410&KLOG=159

    とはいえこれも、ボタンが押されたという事を知ることができる程度で、
    その時のマウス座標が、Excel 上のどの場所を指しているのかについては
    別途判断せねばなりません。要件を満たすまでに昇華するのは難しいかと。
違反を報告
引用返信 削除キー/
■35006 / inTopicNo.3)  Re[2]: VBで開いたExcelでのイベントを取得するには
□投稿者/ ぶぶ 一般人(2回)-(2022/02/08(Tue) 10:38:01)
  • アイコン魔界の仮面弁士様

    返信ありがとうございます。

    やりたいイベントとしても、セルをクリックまたは右クリック等がされたときに、
    そのセルの内容から、処理をしたい。位のものなので、教えていただいたリンクを
    基に試行してみたいと思います。

    > 技術的には OLE オートメーションによって、Excel 側で発生したイベントを
    > VB 側で捕らえる事もできるのですが、Excel.Application オブジェクトで
    > Excel のイベントで使えそうなマウス絡みのイベントといっても、直接的には
    >  SheetBeforeDoubleClick イベント
    >  SheetBeforeRightClick イベント
    >  SheetSelectionChange イベント
    > ぐらいしか無いと思います。

    これで、十分なのではないかとも思うのでやってみます。


    >
    > また、Excel がセル編集モードになったり、ダイアログの表示中などは、
    > Excel 側で行った操作を、VB 側で受け取ることができません。

    この場合は、処理の必要はないので、大丈夫ではないかと思っています。
    >
    > Excel.Application オブジェクトのイベントを捕らえる以外の方法としては、
    > RawInput あるいは DirectInput を用いて、マウスボタンの押下を
    > 捕らえるという手法があります。
    >
    > http://bbs.wankuma.com/index.cgi?mode=al2&namber=97964&KLOG=170
    > http://bbs.wankuma.com/index.cgi?mode=al2&namber=92410&KLOG=159
    >
    > とはいえこれも、ボタンが押されたという事を知ることができる程度で、
    > その時のマウス座標が、Excel 上のどの場所を指しているのかについては
    > 別途判断せねばなりません。要件を満たすまでに昇華するのは難しいかと。

    検索してもなかなかいい情報に巡り合えなかったので、少し糸口が見えました。
    いつもありがとうございます。

違反を報告
引用返信 削除キー/
■35007 / inTopicNo.4)  Re[3]: VBで開いたExcelでのイベントを取得するには
□投稿者/ 魔界の仮面弁士 大御所(1416回)-(2022/02/08(Tue) 18:05:17)
  • アイコンNo35006に返信(ぶぶさんの記事)
    > やりたいイベントとしても、セルをクリックまたは右クリック等がされたときに、
    > そのセルの内容から、処理をしたい。位のものなので、教えていただいたリンクを
    > 基に試行してみたいと思います。

    それであれば、
     Private WithEvents app As Excel.Application
    な変数に、Excel.Application のインスタンスをセットすることで
    イベントを受け取ることができるはずです。
    ワークブックが明確な場合は
     Private WithEvents book As Excel.Workbook
    を使うこともできます。


    Excel の操作方法は既にご存知かもしれませんが、
    とりあえずこのあたりを紹介しておきます。
    "Microsoft Excel x.x Object Library" への参照設定が必要です。
    http://hanatyan.sakura.ne.jp/vb2005/vb2013excel01.htm


    一応、参照設定なしでイベントを捉える方法も貼っておきます。
    参照設定する方法に比べると手間がかかるので、お奨めはしませんけど。
    https://www.petitmonte.com/bbs/answers?question_id=28859


    今回は VB で開いた Excel とのことですが、もし、すでに起動済みの
    Excel を拾う場合は、ROT(Running Object Table)から辿って取得できます。
違反を報告
引用返信 削除キー/
■35017 / inTopicNo.5)  Re[4]: VBで開いたExcelでのイベントを取得するには
□投稿者/ ぶぶ 一般人(3回)-(2022/03/09(Wed) 15:39:26)
  • アイコン魔界の仮面弁士様

    追加の情報までありがとうございました

    なんとかイベントも拾えました。


    抜粋ですが、
    <===================Form
    Option Explicit On
    Public Class frm_test
    Private Sub mnu_AAA_Click(sender As System.Object, e As System.EventArgs) Handles mnu_AAA.Click

    途中略


    ' ----- Excelのイベントを拾えるようにする
    ExObject.appevent = xlApp

    End Sub
    End Class
    <===================Module
    Imports Microsoft.Office.Interop
    Imports Microsoft.Office.Core
    Imports System.Runtime.InteropServices

    Module Bas_Excel
    Public xlApp As Excel.Application
    Public xlClose As Boolean
    Public xlChart As Excel.Chart

    Public xlBooks As Excel.Workbooks
    Public xlBook As Excel.Workbook
    Public xlSheets As Excel.Sheets
    Public xlSheet As Excel.Worksheet

    Public ExObject As New Cls_ExcelClick

    End Module



    <===================Class
    Public Class Cls_ExcelClick

    Public WithEvents appevent As Excel.Application

    Private Sub appevent_SheetBeforeDoubleClick(Sh As Excel.Worksheet, Target As Microsoft.Office.Interop.Excel.Range, _
    ByRef Cancel As Boolean) Handles appevent.SheetBeforeDoubleClick
    ' ' ----- Excelがダブルクリックされた時の処理
    xlSheet = xlApp.ActiveSheet
    If Sh.Name = xlSheet.Name Then

    ' ----- ダブルクリックが対象物の時処理をする
    Shell("c:\test\Bin\Sampletest.exe", AppWinStyle.NormalFocus)
    Else
    ' ----- 対象ではないので、何もしない
    End If
    End Sub
    End Class

    切り取っているので、わかりにくいかもしれません。

    解決をつけさせていただきます。

    ありがとうございました。

解決み!
違反を報告
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

Mode/  Pass/


- Child Tree -