【问题标题】:Excel If Else Statement For Copying Data with CheckboxesExcel If Else 语句用于复制带有复选框的数据
【发布时间】:2013-09-20 01:31:05
【问题描述】:

我想设置一些代码来复制带有复选框的单元格

我有 30 个复选框

我复制了下面的代码并修改了 30 次

这无疑是多余的

每个复选框在一行,它将复制的数据在同一行

当复选框被点击时,下一个单元格中的行数据将被复制并移动到其他地方

这些数据将被转储到同一个工作表中的某处

我尝试创建 elseif 语句,不幸的是它们不起作用

If ThisWorkbook.Worksheets(1).Shapes("Check Box 2").OLEFormat.Object.Value = 1 Then
     Range("f2").Select
     Selection.Cut
     Sheets("Sheet1").Select
     Range("f15").Select
     ActiveSheet.Paste
     Range("f15").Select
     Selection.Insert Shift:=xlDown    
     End If
     End Sub

If ThisWorkbook.Worksheets(1).Shapes("Check Box 3").OLEFormat.Object.Value = 1 Then
     Range("f3").Select
     Selection.Cut
     Sheets("Sheet1").Select
     Range("f15").Select
     ActiveSheet.Paste
     Range("f15").Select
     Selection.Insert Shift:=xlDown    
     End If
     End Sub

If ThisWorkbook.Worksheets(1).Shapes("Check Box 4").OLEFormat.Object.Value = 1 Then
     Range("f4").Select
     Selection.Cut
     Sheets("Sheet1").Select
     Range("f15").Select
     ActiveSheet.Paste
     Range("f15").Select
     Selection.Insert Shift:=xlDown    
     End If
     End Sub

如您所见,这是非常重复的

关于如何编写此代码使其类似于嵌套 if 语句的任何建议

如果复选框 1 为真,请执行此操作 如果复选框 2 为真,请执行此操作 等等等等

[IMG]http://i44.tinypic.com/2db78dj.jpg[/IMG]

请指教谢谢

【问题讨论】:

  • 复选框和它应该操作的单元格之间是什么关系?如果您可以描述这种关系,那么将其合并为几行代码就很容易,而不是 30 条 If/Else 语句或 Select Case 语句。
  • 复选框形状应该有一个 TopLeftCell 和一个 BottomRightCell 属性 - 这应该允许您计算出每个复选框位于哪一行。
  • 抱歉,我似乎永远无法在这里以正确的格式复制和粘贴代码,它的第一块代码重复了 30 次,用于 30 个复选框,当单击复选框时,行数据将被复制并搬到别处
  • 我对我的回答做了些许修改。看起来您的目的地永远不会改变,只有您需要剪切/粘贴的范围。同样,如果您可以描述与工作表结构相关的这些复选框的排列或提供屏幕截图等,这可能会进一步简化。否则,我只是与@987654326 中复选框的.Name 属性进行比较@块,并为每个复选框分配不同的cutRange
  • 嗨大卫,我添加了一个截图,感谢您的帮助。我只想将一些数据移动到工作表的另一部分。工作表非常慢,有 30 个宏 [IMG]i44.tinypic.com/2db78dj.jpg[/IMG]

标签: excel if-statement checkbox copy


【解决方案1】:

在不了解工作簿结构的情况下,这是我能想到的最好的方法。复选框和需要操作的单元格之间可能存在某种“关系”,这可以让您使用公式或其他逻辑来确定要剪切/粘贴的单元格,而不是依赖于If/Then 或 Case 逻辑。

Sub Test()

Dim cb As Shape
Dim cutRange As Range
'## The destination doesn't change, so we put this outside the loop
'    also make it a constant value:
Cosnt destRange As String = "F15"

'## Now, iterate over each checkbox control in the sheet:
For Each cb In ActiveSheet.Shapes
    '## Make sure the shape is an xlCheckBox AND value = True/checked
    If cb.FormControlType = xlCheckBox And cb.OLEFormat.Object.Value = 1 Then
        '## Assign the cutRange based on the CheckBox name
        Select Case cb.Name
            Case "Check Box 2"
                Set cutRange = Range("F3")
            Case "Check Box 3"
                Set cutRange = Range("F4")
            Case "Check Box 4"
                Set cutRange = Range("F5")
            'etc.

            '## You can add as many Case values as you need
        End Select

        '## One statement cuts & inserts:
        cutRange.Cut Range(destRange)
        Range(destRange).Insert Shift:=xlDown

    End If
Next
End Sub

【讨论】:

  • 嗨大卫,我想这就是我想要创建的,你可以想象我复制了 30 次相同的代码,我只是每次都更改了复选框编号。请让我把它复制到工作簿中,谢谢
  • 嗨大卫,destRange.Insert Shift:=xlDown 给了我一个错误,我不知道为什么,我完全复制了代码并将一个复选框插入到工作表中,我将代码添加为一个模块对吗?
  • 另外,当我点击复选框时,它会给我一个错误 424 object required
  • destrange.insert 上的错误信息是什么??还有你知道复选框是表单控件还是ActiveX控件?
  • 嗨大卫,错误是需要 424 对象,在调试模式下,destRange.Insert Shift:=xlDown 突出显示。我在表单中插入了复选框 - 它们将是表单控件。 [IMG]i42.tinypic.com/14u9j54.png[/IMG] 和 [IMG]i39.tinypic.com/35aot4o.png[/IMG]
猜你喜欢
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
相关资源
最近更新 更多