根据条件删除单元格

时间:2010-02-01 16:32:15

标签: excel vba excel-vba

我在列A中列出了员工列表,以及他们在B列中的状态(从下拉菜单中选择“活动”或“非活动”)。它们位于名为“员工列表”的工作表中。

当员工的状态设置为“非活动”时,我想自动将员工剪切并粘贴到另一个工作表。另一张被称为“杂项”

如果状态设置为“非活动”时无法自动完成,那么我可以设置一个按钮来调用该工作表中的VBA命令,从列表中清除所有非活动员工并将其移动到另一个工作表

2 个答案:

答案 0 :(得分:5)

开始使用Excel VBA的最佳方法之一是记录宏并查看它们生成的代码。这样,您将看到如何使用VBA代码在Excel中操作对象。

另外,请考虑获取VBA Developer's Handbook。它基于旧版本的Office,但VBA在Office的最后一个视图版本中没有太大变化(如果有的话),所以它仍然是一个很好的阅读。

学习基本的东西,如对象实例化,循环,条件逻辑,字符串连接等,这将带你走很长的路。


对于您当前的问题,您可能要做的是记录剪切和粘贴移动的宏,并查看它产生的代码。然后看看你是否可以弄清楚如何修改该代码以满足您的目的。

回到Stack Overflow并询问非常具体的问题,如果你遇到困难,这是获得良好答案的麻烦方式。例如,您可能会说“我如何遍历我的单元格区域以应用此复制和粘贴?”。

答案 1 :(得分:4)

我比Ben M更渴望声誉,所以我会给你发一些代码。 :)你当然应该接受他的建议,并开始阅读好书。

以下可能会使用一些微调,但应该是一个很好的起点。如果您在编写时希望Excel在执行非活动选项后立即自动移动员工姓名和状态,那么这应该可以解决问题:

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    ' Only react to edits in Column B:  '
    If Not Intersect(Target, Sheets("Employee List").Range("B:B")) Is Nothing Then

        ' Dont do anything if > 1 cell was just changed:   '
        If Target.Cells.Count = 1 Then

            ' Only make the change if the new value in Col B is "inactive":    '
            If Target.Value = "Inactive" Then

                ' Find the next available cell on the Misc sheet for a name:   '
                Dim nextRange As Range
                Set nextRange = Sheets("Misc").Range("A65536").End(xlUp).Offset(1, 0)

                ' Cut the employee name and status and paste onto the Misc sheet:   '
                Range(Target, Target.Offset(0, -1)).Cut
                Sheets("Misc").Paste       Destination:=Sheets("Misc").Range(nextRange.Address)

            End If
        End If

    End If


    Application.EnableEvents = True

End Sub

请注意,每当您针对某个事件编写代码时,您可能需要禁用事件,以便Excel不会进入任何类型的无限循环。