gpt4 book ai didi

excel - 如何使用 vba 监控工作表中的形状选择?

转载 作者:行者123 更新时间:2023-12-04 20:03:44 25 4
gpt4 key购买 nike

我正在尝试使用 VBA 在 Excel 中做一些非常简单的事情。在工作表中,我有几个文本框(形状)。我只想获取用户通过鼠标单击选择的形状的值和颜色代码。而当盒子移动的时候,我也想得到盒子的位置。这可能吗?
我尝试了以下方法,但不确定这是否可行。我想我缺少的是使用哪个函数来持续监控工作表。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sr As Variant

Set sr = Selection.ShapeRange

If Not sr Is Nothing Then
MsgBox "selecting box"

End If

End Sub
我也尝试使用 Worksheet_Activate() ,但它仅在用户激活工作表时才起作用。

最佳答案

I have several textboxes (shapes). I just want to get the value and the color code of the shape that the user selects by mouse clicks. And when the box is moved, I also want to get the position of the box. Is this possible?


如果是形状文本框;通过 Insert Tab | Shapes | Textbox 插入那么是的,可以使用 Application.Caller propertyGetAsyncKeyState API。
基础准备:
  • 通过单击 Insert Tab | Shapes | Textbox 添加 2 到 3 个形状(文本框) .
  • 添加文本或更改颜色以进行测试。
  • 插入一个模块并粘贴以下代码。
  • 右键单击文本框并单击 Assign Macro .选择Sample(in this case) .
  • 点击OK .
  • 对其他文本框重复这些步骤。

  • 逻辑:
  • Application.Caller将返回有关如何调用 Visual Basic 的信息。在这种情况下,它将返回形状的名称。例如 Text Box1
  • 我们从中得到一个形状对象
  • Shape.TextFrame2.TextRange.Text将给出文本框的内容
  • Shape.Fill.ForeColor.RGB将给出文本框的颜色
  • 现在是最棘手的部分。由于形状没有鼠标事件,当用户释放鼠标左键时,我们将获得新的位置。我们将使用 Shape.Top 获取初始位置和 Shape.left .
  • 要退出循环,我们将使用 F9 键(随意更改)或当用户释放左键时停止它。
  • 我们正在使用 GetAsyncKeyState(VK_F9)作为在用户不移动形状的情况下停止循环的附加措施。如果您不想使用它,那么您可以使用 bool 变量来停止循环,您可以在 Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 中设置变量。这样当用户选择一个单元格时循环就会停止。

  • 缺点:
  • 如果在显示位置的消息框之后已经选择了形状,则代码将不起作用,因为未模拟“左键单击”。您将不得不单击一个单元格或其他东西(基本上取消选择形状),然后重新单击该形状。
  • 如果您右键单击形状然后选择要移动它的形状,则代码将不起作用,因为没有模拟“左键单击”。

  • 基本上,要使此代码正常工作,您必须左键单击以前未选择的形状。
    代码:
    Option Explicit

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Private Const VK_F9 = &H78

    Dim oldLeft As Single, oldTop As Single
    Dim newLeft As Single, newTop As Single

    Sub Sample()
    Dim shp As Shape

    oldLeft = 0: oldTop = 0

    '~~> Get the shape that called the clicking of the shape
    Set shp = ActiveSheet.Shapes(Application.Caller)

    '~~> This is required so that the shape is selected
    '~~> when clicked else clicking will simply run the macro
    shp.Select

    oldTop = shp.Top: oldLeft = shp.Left

    '~~> Show the textbox text and color
    MsgBox "Shape Text = " & shp.TextFrame2.TextRange.Text & vbNewLine & _
    "Shape Color = " & shp.Fill.ForeColor.RGB

    '~~> Track the cursor postion till the time user presses F9
    Do Until GetAsyncKeyState(VK_F9)
    '~~> Need to reset this
    newTop = 0: newLeft = 0

    '~~> Get the new position
    newTop = shp.Top: newLeft = shp.Left

    '~~> If it is different then store it in a variable
    '~~> and exit (User has released the mouse)
    If newTop <> oldTop Or newLeft <> oldLeft Then
    MsgBox "Old position: X=" & oldTop & ":Y=" & oldLeft & vbNewLine & _
    "New position: X=" & newTop & ":Y=" & newLeft
    Exit Do
    End If
    DoEvents
    Loop
    End Sub
    在行动
    enter image description here

    关于excel - 如何使用 vba 监控工作表中的形状选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62964108/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com