1

所以我有一个 Excel 工作簿,里面有一个全局映射方案。所以我在excel中对每个国家都有一个形状。根据区域选择,相对于数据/查询,它将以各种方式对区域/国家进行着色。

所以我知道如何在颜色、渐变阴影等方面操纵每个形状......

我不知道该怎么做是在子例程结束时“取消选择”形状。我的代码看起来像这样(非常简单):

sheet1.shapes("CountryName").select
selection.shaperange.fill.solid
selection.shaperange.fill.visible = true
selection.shaperange.fill.forecolor.rgb=rgb(110,110,110)
selection.shaperange.fill.onecolorgradiend msogradienthorizontal, 2, 0.45

好的,所以从一个形状/国家/地区到另一个形状/国家/地区,“取消选择”并不是什么大不了的事,因为焦点会跳跃,但最后????

我已经猜到/尝试了很多东西,但可惜没有运气

谢谢!

4

3 回答 3

3

你的源代码最后一行有错字,...gradiend --> ...gradient

selection.shaperange.fill.onecolorgradienT msogradienthorizontal, 2, 0.45

“取消选择”形状对象的一种非常简单的方法是添加这行代码

sheet1.[A1].select

这会将焦点移动到工作表中的单元格 A1,从而远离您的对象。非常粗鲁,我不推荐它。我也不建议按照上面的建议“保存当前选择”,因为我们不知道光标是在单元格中还是在另一个(范围)对象中。

更好的方法是在整个脚本中完全避免“选择”。将您的形状分配给一个对象并操作该对象(注意:我在 sheet3 中使用测试中的第一个可用对象进行了模拟),即

Sub test()
Dim MyShape As Shape
    Set MyShape = Sheet3.Shapes(1) ' or whatever shape according to the user input
    With MyShape.Fill
        .Solid
        .Visible = True
        .ForeColor.RGB = RGB(110, 110, 110)
        .OneColorGradient msoGradientHorizontal, 2, 0.45
    End With
End Sub

更好的是,如果您正在处理一个为您提供形状名称的列表,请执行以下操作

Sub Test()
    '
    ' get the shape's name into ShapeName
    ' ...

    ColorShape Sheet3.Shapes(ShapeName)

    ' ...

End Sub

Sub ColorShape(MyShape As Shape)
    With MyShape.Fill
        .Solid
        .Visible = True
        .ForeColor.RGB = RGB(110, 110, 110)
        .OneColorGradient msoGradientHorizontal, 2, 0.45
    End With
End Sub

希望这有帮助 祝你好运 MikeD

于 2009-11-04T13:49:15.943 回答
2

不能简单的记录下被选中的原始单元格吗?

Dim oCell as Range
set oCell = activecell

'' Do stuff here

oCell.activate

更新:这段代码记录了当前的选择,然后在选择范围(“A4”)后重新选择它。在不知道您的工作簿中有哪些形状的情况下,我无法验证这是否可行,但到目前为止,我已经测试过它。

Set mySel = Application.Selection
[A4].Select
mySel.Select
于 2009-11-04T04:04:13.087 回答
0

我遇到了一个类似的问题,我需要在点击后隐藏一个形状。我的解决方案是用来SendKeys逃避选择

SendKeys "{Esc}"
于 2018-10-13T12:28:25.873 回答