Excel VBA-链接标签和复选框

Excel VBA-链接标签和复选框,excel,vba,Excel,Vba,我有以下用户表单: 使用下面的代码,我可以将每个选中复选框的名称保存到工作表中。值将保存在同一列中,但在不同的行上(当然),因为可以选择多个复选框 Dim indProdWs As Worksheet Dim ctl As Control Dim i As Long Set indProdWs = tWb.Worksheets("INDICATION-PRODUCT") i = 4 ' This is the row where i want to save the f

我有以下用户表单:

使用下面的代码,我可以将每个选中复选框的名称保存到工作表中。值将保存在同一列中,但在不同的行上(当然),因为可以选择多个复选框

Dim indProdWs As Worksheet
Dim ctl As Control
Dim i As Long

Set indProdWs = tWb.Worksheets("INDICATION-PRODUCT")

i = 4
' This is the row where i want to save the first value
For Each ctl In seg_multipage.Pages(1).Controls
   If TypeName(ctl) = "CheckBox" Then
        If ctl.Value = True Then
            indProdWs.Cells(i, 9) = ctl.Caption: i = i + 1
        End If
    End If
Next ctl
但是,正如您在第一幅图中所看到的,每一行产品都有一个标签

这就是我想要实现的目标:

如果选择了第二行中的Product 22,则我希望名称以以下格式保存在单元格中:

标签2-22

或者,如果选择了第二行中的产品51:

标签5-产品51

如您所见,标签编号始终与产品的第一位数字匹配。我试着用它作为变量,但没有成功

谢谢你能给我的任何帮助

名称实际上是“Product22”还是这只是一个例子西德哈特路6分钟前


@悉达多只是一个例子,但格式是相似的。实际名称为seg_cb_selInd_22(例如)。-Soraai635 1分钟前

这就是你想要的吗

将下一步的
代码更改为以下代码

For Each ctl In seg_multipage.Pages(1).Controls
   If TypeName(ctl) = "CheckBox" Then
        If ctl.Value = True Then
            indProdWs.Cells(i, 9) = Controls("seg_l_selInd_" & _
                                    GetNumber(ctl.Name)).Caption & _
                                    " - " & _
                                    ctl.Name
            i = i + 1
        End If
    End If
Next ctl
然后将此函数添加到代码中

Private Function GetNumber(s As String)
    Dim numb As Long
    Dim i As Long
    
    For i = 1 To Len(s)
        Select Case Mid(s, i, 1)
        Case 0 To 9
            numb = Mid(s, i, 1)
            Exit For
        End Select
    Next
    
    GetNumber = numb
End Function
注意:此函数假定您将向其传递字母数字字符串

名称实际上是“Product22”还是这只是一个例子西德哈特路6分钟前


@悉达多只是一个例子,但格式是相似的。实际名称为seg_cb_selInd_22(例如)。-Soraai635 1分钟前

这就是你想要的吗

将下一步的
代码更改为以下代码

For Each ctl In seg_multipage.Pages(1).Controls
   If TypeName(ctl) = "CheckBox" Then
        If ctl.Value = True Then
            indProdWs.Cells(i, 9) = Controls("seg_l_selInd_" & _
                                    GetNumber(ctl.Name)).Caption & _
                                    " - " & _
                                    ctl.Name
            i = i + 1
        End If
    End If
Next ctl
然后将此函数添加到代码中

Private Function GetNumber(s As String)
    Dim numb As Long
    Dim i As Long
    
    For i = 1 To Len(s)
        Select Case Mid(s, i, 1)
        Case 0 To 9
            numb = Mid(s, i, 1)
            Exit For
        End Select
    Next
    
    GetNumber = numb
End Function

注意:此函数假定您将向其传递一个字母数字字符串。

名称实际上是“Product22”还是这只是一个示例?@SiddharthRout只是一个示例,但格式类似。实际名称为seg_cb_selInd_22(例如)。如果将所有复选框命名为
cb_LineNumber\u ProductNumber
,将标签命名为
lbl_LineNumber
,则可以将每个复选框名称转换为标签名称
Me.Controls(“lbl”&Split(checkBoxNameHere,“”)(1))。标题
名称实际上是“Product22”还是这只是一个示例?@SiddharthRout只是一个示例,但格式类似。实际名称为seg_cb_selInd_22(例如)。如果将所有复选框命名为
cb_LineNumber\u ProductNumber
,将标签命名为
lbl_LineNumber
,则可以将每个复选框名称转换为标签名称
Me.Controls(“lbl”&Split(checkBoxNameHere,”)(1))。说明
感谢您的帮助,但我可能没有解释清楚,我道歉!所有的标签都有不同的标题。例如,在第二行中,标签标题为ABC,但标签名称为label_2。因此,对于Product21(例如),我需要ABC-Product21。在这种情况下,您必须从复选框标题中提取第一个数字。因此,请向我澄清这一点。例如,如果名称是
Sid123
,那么我们需要从中提取
1
?例如,第一行有1个标签和4个产品。标签标题为SID。如果选择产品11,则需要“SID-Product11”。我提到数字是因为我认为这可能是一种匹配同一行中的标签和复选框的方法。我说的是复选框标题。如果复选框标题为
Sid123
,那么我们需要从中提取
1
?因此它变成了
Label1-Sid123
?哦,复选框标题是Porto(例如)。另一方面,复选框名称是Product11(例如)。是的,第一个数字是我们需要使用的数字。谢谢你的帮助,但我可能没有解释清楚,我道歉!所有的标签都有不同的标题。例如,在第二行中,标签标题为ABC,但标签名称为label_2。因此,对于Product21(例如),我需要ABC-Product21。在这种情况下,您必须从复选框标题中提取第一个数字。因此,请向我澄清这一点。例如,如果名称是
Sid123
,那么我们需要从中提取
1
?例如,第一行有1个标签和4个产品。标签标题为SID。如果选择产品11,则需要“SID-Product11”。我提到数字是因为我认为这可能是一种匹配同一行中的标签和复选框的方法。我说的是复选框标题。如果复选框标题为
Sid123
,那么我们需要从中提取
1
?因此它变成了
Label1-Sid123
?哦,复选框标题是Porto(例如)。另一方面,复选框名称是Product11(例如)。是的,第一个数字是我们需要使用的数字。