Excel 命令按钮单击可调整的计数器并链接到形状
我有一个CommandButton,可以将形状添加到工作表中。每次按下CommandButton,我都希望计数向上索引1。我还希望将此计数值应用于形状。例如,如果命令按钮按下一次,我希望形状包含text.character“1”,按下两次,我希望形状包含text.character“2”,依此类推 我还希望能够将计数器重置回特定值。例如,如果形状#14被删除且CommandButton计数为16,则需要将计数调整回14,以便通过CommandButton创建另一个形状#14。这也可用于将计数重置为0 基本上,我想要一个计数器来跟踪CommandButton点击的次数。然后,可以将该数字分配给全局变量,该变量随后可以由计数器更新或由用户输入操作 下面是与添加形状和CommandButton单击计数器相关的所有代码 这在第1页:Excel 命令按钮单击可调整的计数器并链接到形状,excel,vba,Excel,Vba,我有一个CommandButton,可以将形状添加到工作表中。每次按下CommandButton,我都希望计数向上索引1。我还希望将此计数值应用于形状。例如,如果命令按钮按下一次,我希望形状包含text.character“1”,按下两次,我希望形状包含text.character“2”,依此类推 我还希望能够将计数器重置回特定值。例如,如果形状#14被删除且CommandButton计数为16,则需要将计数调整回14,以便通过CommandButton创建另一个形状#14。这也可用于将计数重置
Private Sub CommandButton2_Click() 'Add Shape to Picture, index click
Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")
CountWelds CommandButton2
Call ShapeWithNum
End Sub
以下是一个模块:
点击计数子按钮
Option Explicit
Dim wb As Workbook
Dim ws As Worksheet
Public buttonCell As Range
Sub CountWelds(WeldControl As MSForms.CommandButton) 'Counter of clicks
Set buttonCell = WeldControl.TopLeftCell
buttonCell = buttonCell + 1
buttonCell.Offset(0, 1).Value = buttonCell & " visitors from " & WeldControl.name & "."
End Sub
用户输入剩余的单击计数子项
Sub Set_buttonCellCount() 'Set the counter to a specific value
Dim answer As Long
CountWelds ThisWorkbook.Sheets("Sheet1").CommandButton2
answer = InputBox("Choose Weld Number i.e. 1, 2, 3")
buttonCell = answer
MsgBox "Weld Number set to " & buttonCell + 1
End Sub
将形状添加到图纸1
Sub ShapeWithNum() 'Sub which adds the shape to sheet 1
Dim weldw, weldl As Variant
CountWelds ThisWorkbook.Sheets("Sheet1").CommandButton2
If buttonCell < 10 Then
weldw = 20
weldl = 20
Else
weldw = 40
w eldl = 20
End If
Index errors occur at each of the "Selection." locations.
ActiveSheet.Shapes.AddShape(msoShapeOval, 650, 100, weldw, weldl).Select
Selection.ShapeRange.TextFrame2.TextRange.ParagraphFormat.Alignment = _
msoAlignCenter
Selection.ShapeRange.TextFrame2.VerticalAnchor = msoAnchorMiddle
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = buttonCell
With Selection.ShapeRange(1).TextFrame2.TextRange.Characters(1, 0). _
ParagraphFormat
.FirstLineIndent = 0
.Alignment = msoAlignLeft
End With
With Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Font
.NameComplexScript = "+mn-cs"
.NameFarEast = "+mn-ea"
.Fill.Visible = msoTrue
.Fill.ForeColor.ObjectThemeColor = msoThemeColorLight1
.Fill.ForeColor.TintAndShade = 0
.Fill.ForeColor.Brightness = 0
.Fill.Transparency = 0
.Fill.Solid
.Size = 11
.name = "+mn-lt"
End With
MsgBox buttonCell 'Used to see if the ButtonCell is indeed indexing
这似乎能解决问题,但我不确定
有什么建议吗?这里是一个简单的示例,假设有一个ActiveX按钮
Private Sub CommandButton1_Click()
Dim s As Shape, n As Long, s1 As Shape
For Each s1 In ActiveSheet.Shapes
If s1.AutoShapeType = msoShapeOval Then n = n + 1
Next s1
n=n+1
Set s = ActiveSheet.Shapes.AddShape(msoShapeOval, 650, 100 + n * 50, 50, 50)
s.TextFrame.Characters.Text = n
s.TopLeftCell.Offset(1, 2).Value = "This is button press number " & n
End Sub
为什么不在按钮代码的开头加上形状的数量?因为我还需要在创建形状时将形状的数量分配给形状。如果我创建一个形状,我需要这个形状也有“1”值作为它的文本。我不明白为什么我的建议不能满足这个要求。FWIW@SJR有一个坚实的观点:如果你计算方法调用的数量,你会得到方法调用的数量(即,这不是你工作表上的形状数量).我知道我可以使用Shapes.count计算出形状的总数,但是有没有办法计算特定类型的形状?这背后的原因是,我在工作表中有许多形状,但我只想计算一种类型Sub CountShapes()Set wb=thispook Set ws=wb.Sheets(“Sheet1”)将shp作为ws.Shapes中每个shp的形状进行调暗,如果不是shp.AutoShapeType=msoShapeOval,那么ws.Shapes.Count=ws.Shapes.Count-1结束,如果下一个shp“这是我想说的地方,但你写的比我写的要高效得多。这部分是不相关的,但是有没有一种方法可以从这个子对象之外调用'n'变量?我希望能够使用单独的命令按钮/模块重置“n”。是的,您可以将所有代码放在另一个过程中,然后从按钮调用该过程,或者将
n
声明为公共变量。是的。我所做的是将你的解决方案的计数和形状部分添加到模块1中单独的公共子模块中。他们被命令按钮2连续调用。如果你也在记录历史性的变化,是的,我认为你需要单独的计数器。谢谢你的时间和帮助SJR,我很感激!
Private Sub CommandButton1_Click()
Dim s As Shape, n As Long, s1 As Shape
For Each s1 In ActiveSheet.Shapes
If s1.AutoShapeType = msoShapeOval Then n = n + 1
Next s1
n=n+1
Set s = ActiveSheet.Shapes.AddShape(msoShapeOval, 650, 100 + n * 50, 50, 50)
s.TextFrame.Characters.Text = n
s.TopLeftCell.Offset(1, 2).Value = "This is button press number " & n
End Sub