【问题标题】:How do i select/activate multiple sheets to transfer Userform data into cells?如何选择/激活多个工作表以将用户表单数据传输到单元格?
【发布时间】:2014-01-22 14:48:44
【问题描述】:

我在用户窗体中有复选框,并且根据选择了哪些复选框,我想选择/激活与复选框相对应的 Excel 工作表。

例如。单击复选框 A、B、C 我想选择/激活选项卡 A、B、C,以便我可以将信息传输到这些工作表。我知道如何传输数据,但我不确定如何根据复选框的条件选择多张工作表。

If A_Checkbox.value = True Then
Cells(emptyRow, 1).value=NOD_Text.value 

但问题是我有大约 8 个复选框,我不确定如何根据单击的复选框将数据传输到多个工作表中...

是否有一个功能可以让我说“如果任何复选框的值为真,则将用户表单数据传输到相应的工作表中?


所以我使用了响应中的代码,但我似乎无法让它工作? (我对vba不是很熟悉..对不起...)

Private Sub Add_Button_Click ()
    Dim ctrl As Control
    Dim emptyRow As Long
    emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1

For Each ctrl In UserForm1.Controls
      If TypeName(ctrl) = "Checkbox" Then
    Transfervalues ctrl, emptyRow
End If
Next
End Sub

Function Transfervalues(cb As MSForms.CheckBox, emptyRow As Long)
Dim ws As Worksheet

     If cb Then
        Select Case cb.Name
            Case "A"
               Sheets("A").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("A").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("A").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("A").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("A").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("A").Cells(emptyRow, 6).Value = CPN_Text.Value
           Case "B"
               Sheets("B").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("B").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("B").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("B").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("B").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("B").Cells(emptyRow, 6).Value = CPN_Text.Value
          Case "C"
               Sheets("C").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("C").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("C").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("C").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("C").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("C").Cells(emptyRow, 6).Value = CPN_Text.Value
          Case "D"
               Sheets("D").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("D").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("D").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("D").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("D").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("D").Cells(emptyRow, 6).Value = CPN_Text.Value
          Case "E"
               Sheets("E").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("E").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("E").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("E").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("E").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("E").Cells(emptyRow, 6).Value = CPN_Text.Value
          Case "F"
               Sheets("F").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("F").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("F").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("F").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("F").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("F").Cells(emptyRow, 6).Value = CPN_Text.Value
          Case "G"
               Sheets("G").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("G").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("G").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("G").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("G").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("G").Cells(emptyRow, 6).Value = CPN_Text.Value
          Case "H"
               Sheets("H").Cells(emptyRow, 1).Value = NOD_Text.Value
               Sheets("H").Cells(emptyRow, 2).Value = TOD_Text.Value
               Sheets("H").Cells(emptyRow, 3).Value = Program_Text.Value
               Sheets("H").Cells(emptyRow, 4).Value = email_Text.Value
               Sheets("H").Cells(emptyRow, 5).Value = OPN_Text.Value
               Sheets("H").Cells(emptyRow, 6).Value = CPN_Text.Value
     End Select
End If

End Function

【问题讨论】:

  • 试试Select Case Left(cb.Name, 1)。另外我会根据你所做的对我的做一些修改。

标签: vba excel userform


【解决方案1】:

假设您的复选框对象名为A_CheckboxB_Checkbox 等,对应于名称与"A""B" 等完全相同的工作表,则类似于:

Private Sub Add_Button_Click()
Dim ctrl As Control
For Each ctrl In UserForm1.Controls
    If TypeName(ctrl) = "CheckBox" Then
        'Pass this CheckBox to the subroutine below:
        TransferValues ctrl
    End If
Next
End Sub

修订

根据复选框的选择,您似乎正在将相同的数据从用户表单转储到每个工作表。为此,您不需要案例选择语句,只需基于CheckBox.Name 定义一个worksheet 变量。请注意,我将其从Function 更改为Sub,尽管这并不重要。我也对此进行了更改,因此每次都会计算emptyRow 的值,因为这将根据您正在处理的工作表而改变。

Sub TransferValues(cb As MSForms.CheckBox)
Dim ws As Worksheet
Dim emptyRow as Long

    If cb Then
       'Define the worksheet based on the CheckBox.Name property:
        Set ws = Sheets(Left(cb.Name, 1))
        emptyRow = WorksheetFunction.CountA(ws.Range("A:A")) + 1
           With ws
               .Cells(emptyRow, 1).Value = NOD_Text.Value
               .Cells(emptyRow, 2).Value = TOD_Text.Value
               .Cells(emptyRow, 3).Value = Program_Text.Value
               .Cells(emptyRow, 4).Value = email_Text.Value
               .Cells(emptyRow, 5).Value = OPN_Text.Value
               .Cells(emptyRow, 6).Value = CPN_Text.Value
           End With
    End If

End Sub

根据 OP 的 cmets 进行编辑以澄清

TypeName 是一个内置方法,它返回一个标识对象的类型 的字符串。在这种情况下,我们会遍历用户表单上的所有控件,因此您需要一些逻辑来确保该函数仅在CheckBox 控件上运行。

cbTransferValues 子例程的局部变量。在调用子例程中(在我的示例中为CommandButton1_Click),我们将对象ctrl(一个复选框控件)发送到该子例程。

布尔语句If cb 仅评估复选框是否已被选中。您可以使用If cb.Value = True,但我个人的偏好是简化它。

更新和测试

这是一个包含三个复选框和一些虚拟文本框的示例用户表单的之前图片:

现在这是我按下“添加”按钮后的工作表“C”:

最后,我可以继续更改文本框的值并一遍又一遍地按下添加按钮,如下所示:

【讨论】:

  • 恕我直言,但这不是操作员所要求的(或者是吗?)他想选择多张工作表并将数据一次传输到所有工作表。我的意思是我是这样理解的,但是 OP 的一些澄清会很好。
  • @mehow 澄清会很好。我将其理解为 CheckBox/Worksheet 之间的 1:1 关系。这应该循环表单中的每个复选框。不过我会做一个小修改,因为可能需要一些额外的逻辑。
  • @DavidZemens 我已经尝试了以下编码,但我无法让它工作......我对 excel 不是很熟悉。我不太了解 TypeName(ctrl) = "Checkbox" 部分以及 cb 的含义。我了解案例但我不了解其他陈述...
  • 查看我的答案的修订和 cmets。
  • 我尝试使用您提供的修改后的编码,但它突出显示 Set ws = Sheets(LEft(cb.Name,1)) 并给我一个错误“订阅超出范围”我应该如何解决这个?
【解决方案2】:

非常感谢大卫泽门斯!

我不得不对他的代码稍作修改,因为我无法根据复选框选择粘贴到多个工作表中。

查看下面的修改代码 - 现在我可以选择我的任何复选框,并且保存按钮会粘贴到每张工作表的空行中。

Private Sub    
Dim cb As Control    
Dim ws As Worksheet    
Dim emptyRow As Long

For Each cb In UserForm3.Controls

    If TypeName(cb) = "CheckBox" Then
        'Pass this CheckBox to the subroutine below:
        If cb Then
        Set ws = Sheets(Left(cb.Name, 2))
        emptyRow = (WorksheetFunction.CountA(ws.Range("A7:A5000")) + 6) + 1
           With ws
               .Cells(emptyRow, 1).Value = TextBox1.Value
               .Cells(emptyRow, 2).Value = TextBox2.Value
               .Cells(emptyRow, 3).Value = TextBox3.Value
               .Cells(emptyRow, 4).Value = TextBox6.Value
               .Cells(emptyRow, 5).Value = TextBox4.Value
               .Cells(emptyRow, 6).Value = TextBox5.Value
           End With
        End If        
    End If
Next cb

Unload UserForm3    
UserForm2.Show    
End Sub

enter image description here

【讨论】:

    猜你喜欢
    • 2022-01-28
    • 2021-04-19
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多