我想选择并隐藏名称中含有特定单词的形状。
我正在使用 Excel 制作地图。
我有一个宏,可以在地图的右上角插入一个图钉/新形状,然后将其拖动到地图中的正确位置。
宏为每个新引脚/形状赋予新名称。
例如A23_AXR42_Towncar
A23 是形状的顺序(即这是插入的第 23 个形状)
AXR42是车的id号
Towncar属于类别
总共有七类引脚。
将添加新的引脚。
我需要选择一张纸中名称中包含“Towncar”一词的所有形状。因此,当我单击按钮时,它会选择所有形状,然后使用窗格窗口隐藏/显示它们。
我通过选择名称中包含某个单词的所有形状来录制宏。
问题是它根据名称选择所有形状。
我需要它来选择名称中包含“towncar”的所有形状。
Sub Select_towncar_shapes()
'
' Select_towncar_shapes Makro
'
'
ActiveSheet.Shapes.Range(Array("A19_XRT44_Towncar")).Select
ActiveSheet.Shapes.Range(Array("A19_XRT44_Towncar", "A23_ZWE18_Towncar")). _
Select
ActiveSheet.Shapes.Range(Array("A19_XRT44_Towncar", "A23_ZWE18_Towncar", _
"A20_VBV77_Towncar")).Select
ActiveSheet.Shapes.Range(Array("A19_XRT44_Towncar", "A23_ZWE18_Towncar", _
"A20_VBV77_Towncar", "A24_RTC53_Towncar")).Select
ActiveSheet.Shapes.Range(Array("A24_RTC53_Towncar")).Visible = msoFalse
ActiveSheet.Shapes.Range(Array("A23_ZWE18_Towncar")).Visible = msoFalse
ActiveSheet.Shapes.Range(Array("A20_VBV77_Towncar")).Visible = msoFalse
ActiveSheet.Shapes.Range(Array("A19_XRT44_Towncar")).Visible = msoFalse
ActiveSheet.Shapes.Range(Array("A19_XRT44_Towncar")).Visible = msoTrue
ActiveSheet.Shapes.Range(Array("A20_VBV77_Towncar")).Visible = msoTrue
ActiveSheet.Shapes.Range(Array("A23_ZWE18_Towncar")).Visible = msoTrue
ActiveSheet.Shapes.Range(Array("A24_RTC53_Towncar")).Visible = msoTrue
End Sub
以下例程将显示或隐藏工作表中形状名称包含特定单词的所有形状。无需选择任何形状并手动设置可见性:
Sub ShowHideShapes(ws As Worksheet, word As String, show As Boolean)
Dim sh As Shape
For Each sh In ws.Shapes
If InStr(1, sh.Name, word, vbTextCompare) > 0 Then
sh.Visible = show
End If
Next
End Sub
现在在工作表上放置 2 个按钮,一个用于显示形状,一个用于隐藏形状。这个按钮的代码是
Sub buttonShow_click()
ShowHideShapes ActiveSheet, "Towncar", True
End Sub
Sub buttonHide_click()
ShowHideShapes ActiveSheet, "Towncar", False
End Sub
请注意,您还可以使用形状来执行宏,只需将它们放在工作表上,右键单击它并使用“分配宏”即可。
如果您想显示和隐藏具有不同名称的其他形状,只需将第二个参数从
"Towncar"
更改为您想要显示或隐藏的任何形状。
调用流程
Sub ShowTownCar()
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
ShowHideShapes "TownCar", wb, "Sheet1"
End Sub
Sub HideTownCar()
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
ShowHideShapes "TownCar", wb, "Sheet1", True
End Sub
被调用的过程(方法)
Sub ShowHideShapes( _
ByVal EndsWith As String, _
ByVal wb As Workbook, _
Optional ByVal WorksheetName As String = "", _
Optional ByVal DoHide As Boolean = False)
Dim ws As Worksheet:
If Len(WorksheetName) = 0 Then
Set ws = wb.ActiveSheet
Else
Set ws = wb.Sheets(WorksheetName)
End If
Dim eLen As Long: eLen = Len(EndsWith)
Dim dict As Object, shp As Shape, shpName As String, IsFirstFound As Boolean
For Each shp In ws.Shapes
shpName = shp.Name
If Len(shpName) >= eLen Then
If StrComp(Right(shp.Name, eLen), EndsWith, vbTextCompare) = 0 Then
If Not IsFirstFound Then
Set dict = CreateObject("Scripting.Dictionary")
dict.CompareMode = vbTextCompare
IsFirstFound = True
End If
dict(shpName) = Empty
End If
End If
Next shp
If dict Is Nothing Then
MsgBox "No shapes ending with """ & EndsWith & """ found.", _
vbExclamation
Exit Sub ' no shapes found
End If
ws.Shapes.Range(dict.Keys).Visible = Not DoHide
End Sub
我让它尽可能简单。 最好给出名称作为参数,但对于初学者来说,这个更容易
Public Sub SelectShapesByName()
Dim i As Long
Dim f() As Variant, z As Long
Dim StepField As Long
Dim ws As Worksheet
Set ws = ActiveSheet
On Error GoTo errExit
StepField = 5
ReDim f(StepField)
z = -1
For i = 1 To ws.Shapes.Count
On Error Resume Next
If ws.Shapes(i).Type <> 4 Then
If ws.Shapes(i).Name Like "*Towncar*" Then ' Here is the name
If Err.Number = 0 Then
z = z + 1
If z > StepField Then
StepField = StepField + 5
ReDim Preserve f(StepField)
End If
f(z) = i
End If
End If
End If
Next i
On Error GoTo errExit
If z > -1 Then
If UBound(f) <> z Then ReDim Preserve f(z)
ws.Shapes.Range(f).Select
End If
Exit Sub
errExit:
End Sub
试试这个:
Sub select_towncar_shapes()
select_shapes "towncar"
End Sub
Sub hide_towncar_shapes()
shapes_visibility "towncar", False
End Sub
Sub show_towncar_shapes()
shapes_visibility "towncar", True
End Sub
Sub shapes_visibility(includedStr As String, is_visible As Boolean)
Dim sht As Worksheet: Set sht = ThisWorkbook.Sheets("Sheet3")
Dim shapes_array() As String: shapes_array = get_shapes_array(sht, includedStr)
On Error Resume Next
sht.Shapes.Range(shapes_array).Visible = is_visible
End Sub
Sub select_shapes(includedStr As String)
Dim sht As Worksheet: Set sht = ThisWorkbook.Sheets("Sheet3")
Dim shapes_array() As String: shapes_array = get_shapes_array(sht, includedStr)
On Error Resume Next
sht.Shapes.Range(shapes_array).Select
End Sub
Function get_shapes_array(sht As Worksheet, includedStr As String) As String()
Dim shp As Shape
Dim output() As String
Dim arrayCount As Long
For Each shp In sht.Shapes
If InStr(1, shp.Name, includedStr, vbTextCompare) > 0 Then
arrayCount = arrayCount + 1
ReDim Preserve output(1 To arrayCount)
output(arrayCount) = shp.Name
End If
Next shp
get_shapes_array = output
End Function