我在列A中列出了员工列表,以及他们在B列中的状态(从下拉菜单中选择“活动”或“非活动”)。它们位于名为“员工列表”的工作表中。
当员工的状态设置为“非活动”时,我想自动将员工剪切并粘贴到另一个工作表。另一张被称为“杂项”
如果状态设置为“非活动”时无法自动完成,那么我可以设置一个按钮来调用该工作表中的VBA命令,从列表中清除所有非活动员工并将其移动到另一个工作表
答案 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不会进入任何类型的无限循环。