如何简化宏

时间:2016-09-30 15:20:52

标签: excel-vba vba excel

我是这里的新人,也是VBA的世界。 我被要求创建一个电子表格,用户可以输入他们已经给出的作业的任务编号,从这个自动填充其他列中使用主列表中的数据,然后当他们更改作业的状态时行改变颜色。 我知道使用vlookup函数作为每个单元格中的公式和条件格式很容易。 我已经在网上搜索过并找到了可以完成这项工作的不同宏,但是有些宏需要很长时间才能找到匹配项,主任务列表最多可以包含3000项。 因此,我非常粗暴地拼凑出一些有效且快速的东西。 我想知道如何清理这些宏,因为我确定我做的方式将来会导致问题,或者是否有更好的方法来完成这项工作。

另外,如果用户输入的数字与主列表上的任何内容不匹配,还有任何方法可以弹出消息框。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Dim Status As Range

Set KeyCells = Range("B1:B700") 'Range Looking for Change
Set Status = Range("K1:K700")

Application.ScreenUpdating = False

If Not Application.Intersect(KeyCells, Range(Target.Address)) _
       Is Nothing Then

     Dim SourceLastRow As Long
        Dim OutputLastRow As Long
        Dim sourceSheet As Worksheet
        Dim outputSheet As Worksheet


            Set sourceSheet = Worksheets("Task List")
            Set outputSheet = Worksheets("2016")

    'Determine last row of Task List
            With sourceSheet
                SourceLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
            End With

            With outputSheet
 'Determine last row in col B
            OutputLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
 'Put formula in relevant cell
            .Range("F2:F" & OutputLastRow).Formula = _
                 "=VLOOKUP(B2,'Task List'!$A$2:$D$" & SourceLastRow & ",2,0)"
            End With

   With outputSheet
                 OutputLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
                 .Range("H2:H" & OutputLastRow).Formula = _
                 "=VLOOKUP(B2,'Task List'!$A$2:$D$" & SourceLastRow & ",3,0)"
            End With

            With outputSheet
                 OutputLastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
                 .Range("G2:G" & OutputLastRow).Formula = _
                 "=VLOOKUP(B2,'Task List'!$A$2:$D$" & SourceLastRow & ",4,0)"
            End With

End If





If Not Application.Intersect(Status, Range(Target.Address)) _
       Is Nothing Then

    Dim n As Long
        iLastRow = Cells(Rows.Count, "B").End(xlUp).Row

        For n = iLastRow To 1 Step -1

                If Cells(n, "K").Value = "Closed" Then
                    Rows(n).Interior.Color = RGB(57, 255, 20) 
                End If

                If Cells(n, "K").Value = "Bond" Then
                    Rows(n).Interior.Color = RGB(249, 255, 1) 
                End If

                If Cells(n, "K").Value = "Eng Bond" Then
                    Rows(n).Interior.Color = RGB(255, 102, 0) 
                End If


                If Cells(n, "K").Value = "Fail" Then
                    Rows(n).Interior.Color = RGB(255, 1, 1) 
                End If

                If Cells(n, "K").Value = "" Then
                    Rows(n).Interior.ColorIndex = 2
                End If


        Next n

End If

 Application.ScreenUpdating = True    
End Sub

0 个答案:

没有答案