1

私がやろうとしていることは次のとおりです。

1. goto `worksheet 4`
2. right mouse click on cell `D32`
3. if (first time): 
      a. choose import text file.
   else:
      b. choose the Refresh 
  • mouse_eventsを使用する以外に、よりエレガントな方法はあります か?
  • 使用する場合はmouse_events、左クリックと右クリックを 1 回シミュレートする必要があります。メニューの正確な場所を右クリックするにはどうすればよいですか? 使おうと思ったspy++のですが、単純なことをするのは間違っていて汚い方法のようです。

====マウスイベントをシミュレートするためのリンクからのソースコード: ====

Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10

Private Sub SingleClick()
  SetCursorPos 100, 100 'x and y position
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub DoubleClick()
  'Simulate a double click as a quick series of two clicks
  SetCursorPos 100, 100 'x and y position
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub RightClick()
  'Simulate a right click
  SetCursorPos 200, 200 'x and y position
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub
4

1 に答える 1

1

mouse_events を使用する以外に、よりエレガントな方法はありますか?

はいあります。Worksheet_BeforeRightClickイベントを利用する

また、以下の例では、セル D32 にコンテンツがあるかどうかを確認して、インポートするか更新するかを決定しています。必要に応じてブール変数を使用できます。

コードは、関連するシートのシート コード領域に入ります。スクリーンショットを参照してください。

スクリーンショット

ここに画像の説明を入力

コード

Option Explicit

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    On Error GoTo Whoa

    Application.EnableEvents = False

    '~~> Check if the right click happened on D32
    If Not Intersect(Target, Range("D32")) Is Nothing Then
        '~~> Check if cell is empty
        If Len(Trim(Target.Value)) = 0 Then
            '~~> If empty, import file
        Else
            '~~> if not empty, refresh data
        End If
        Cancel = True
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

HTH

于 2012-11-23T09:53:43.727 に答える