Excel 命令按钮单击可调整的计数器并链接到形状

Excel 命令按钮单击可调整的计数器并链接到形状,excel,vba,Excel,Vba,我有一个CommandButton,可以将形状添加到工作表中。每次按下CommandButton,我都希望计数向上索引1。我还希望将此计数值应用于形状。例如,如果命令按钮按下一次,我希望形状包含text.character“1”,按下两次,我希望形状包含text.character“2”,依此类推 我还希望能够将计数器重置回特定值。例如,如果形状#14被删除且CommandButton计数为16,则需要将计数调整回14,以便通过CommandButton创建另一个形状#14。这也可用于将计数重置

我有一个CommandButton,可以将形状添加到工作表中。每次按下CommandButton,我都希望计数向上索引1。我还希望将此计数值应用于形状。例如,如果命令按钮按下一次,我希望形状包含text.character“1”,按下两次,我希望形状包含text.character“2”,依此类推

我还希望能够将计数器重置回特定值。例如,如果形状#14被删除且CommandButton计数为16,则需要将计数调整回14,以便通过CommandButton创建另一个形状#14。这也可用于将计数重置为0

基本上,我想要一个计数器来跟踪CommandButton点击的次数。然后,可以将该数字分配给全局变量,该变量随后可以由计数器更新或由用户输入操作

下面是与添加形状和CommandButton单击计数器相关的所有代码

这在第1页:

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