【发布时间】:2021-11-02 06:30:52
【问题描述】:
长时间聆听,第一次来电。
无论如何,我需要一些帮助。我有一个添加文本框的宏,并将它们命名为“Fig Num”和 ActiveSheet.Shapes.count。
一旦所有这些文本框都分布在工作簿中,我想用名称“Fig Num*”重命名所有形状,或者至少是其中的文本,从第一页到最后一页,从上到下,从左到右。
目前,我的代码将根据资历重命名文本框。换句话说,如果我添加了一个文本框并且它被标记为“Fig Num 3”,那么无论是在第一页还是在最后一页,它仍然会被命名为“Fig Num 3”。
在此处输入代码
Sub Loop_Shape_Name()
Dim sht As Worksheet
Dim shp As Shape
Dim i As Integer
Dim Str As String
i = 1
For Each sht In ActiveWorkbook.Worksheets
For Each shp In sht.Shapes
If InStr(shp.Name, "Fig Num ") > 0 Then
sht.Activate
shp.Select
shp.Name = "Fig Num"
End If
Next shp
For Each shp In sht.Shapes
If InStr(shp.Name, "Fig Num") > 0 Then
sht.Activate
shp.Select
shp.Name = "Fig Num " & i
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = _
"FIG " & i
i = i + 1
End If
Next shp
Next sht
End Sub
---
我有一个工作簿示例,但我不知道如何加载它,这是我的第一次。
编辑: 我找到了一个可以做我正在寻找的代码,但是它有点笨拙。我还需要一种很好的方法来找到包含形状的工作表上的最后一行。由于形状名称是基于创建的,如果我在第 35 行插入一个形状并使用 shape.count。如下所示,它将跳过第 35 行之后的所有形状,除非我添加额外的行使代码陷入困境。
最新代码(循环分组形状):
Private Sub Rename_FigNum2()
'Dimension variables and data types
Dim sht As Worksheet
Dim shp As Shape
Dim subshp As Shape
Dim i As Integer
Dim str As String
Dim row As Long
Dim col As Long
Dim NextRow As Long
Dim NextRow1 As Long
Dim NextCol As Long
Dim rangex As Range
Dim LR As Long
i = 1
'Iterate through all worksheets in active workbook
For Each sht In ActiveWorkbook.Worksheets
If sht.Visible = xlSheetVisible Then
LR = Range("A1").SpecialCells(xlCellTypeLastCell).row + 200
If sht.Shapes.Count > 0 Then
With sht
NextRow1 = .Shapes(.Shapes.Count).BottomRightCell.row + 200
'NextCol = .Shapes(.Shapes.Count).BottomRightCell.Column + 10
End With
If LR > NextRow1 Then
NextRow = LR
Else
NextRow = NextRow1
End If
End If
NextCol = 15
Set rangex = sht.Range("A1", sht.Cells(NextRow, NextCol))
For row = 1 To rangex.Rows.Count
For col = 1 To rangex.Columns.Count
For Each shp In sht.Shapes
If shp.Type = msoGroup Then
For Each subshp In shp.GroupItems
If Not Intersect(sht.Cells(row, col), subshp.TopLeftCell) Is Nothing Then
If InStr(subshp.Name, "Fig Num") > 0 Then
subshp.Name = "Fig Num " & i
subshp.TextFrame2.TextRange.Characters.Text = _
"FIG " & i
i = i + 1
End If
End If
Next subshp
Else
If Not Intersect(sht.Cells(row, col), shp.TopLeftCell) Is Nothing Then
If InStr(shp.Name, "Fig Num ") > 0 Then
shp.Name = "Fig Num " & i
shp.TextFrame2.TextRange.Characters.Text = _
"FIG " & i
i = i + 1
End If
End If
End If
Next shp
Next col
Next row
End If
Next sht
End Sub
【问题讨论】:
-
当您说“页面”时,您的意思是“工作表”吗?
-
是的,工作表会更正确。这最终会打印到“页面”描述符的来源处。