根据excel中的下拉列表自动填充单元格

时间:2020-03-12 09:54:27

标签: excel vba autofill

我正在尝试创建一个VBA,该VBA根据表单中的下拉列表为我提供自动值。问题是,当我运行宏时,它将导致错误并且excel停止工作。在这种情况下,我们非常欢迎您提供帮助。

Private Sub Worksheet_Change(ByVal Target As Range)
If Range("$G$11") = "UD Sheet" Then
        Rows("20:25").EntireRow.Hidden = False
    Else
        Rows("21:25").EntireRow.Hidden = True
    End If

If Range("G12").Value = "Flex Tape" Then
        Range("B20").Value = "None"
    Else
        Range("B20").Value = ""
    End If
exitHandler:
  Application.EnableEvents = True
  Exit Sub

End Sub

1 个答案:

答案 0 :(得分:0)

首先,在您的代码中,无需在End Sub之前放置一个Exit Sub。 该代码将在该行之后结束,因此这是多余的。

您需要了解的下一件事是,如果您未明确禁用更改事件,则更改事件将继续触发。因此,这意味着当您在工作表上隐藏一行时,更改事件将继续发生,因为工作表上将发生更改。即(隐藏行)。

为此,您需要使用Application.EnableEvents = False禁用应用程序的EventsListeners。因此,应用程序可以基于该第一个事件来做一件事。

接下来需要记住的一件事是跟踪更改发生的位置并启动程序。目标是一个范围对象,它将返回在图纸上发生特定更改的范围。

为此,您需要验证是否需要使用Intersect函数基于目标触发例程。

整个代码如下:

     Private Sub Worksheet_Change(ByVal Target As Range)
     Application.EnableEvents = False

     If Not Intersect(Target, Range("G11")) Is Nothing Then
         If Range("$G$11") = "UD Sheet" Then    
             Rows("20:25").EntireRow.Hidden = False
         Else
             Rows("21:25").EntireRow.Hidden = True
         End If
     End If

     If Not Intersect(Target, Range("G12")) Is Nothing Then
         If Range("G12").Value = "Flex Tape" Then
             Range("B20").Value = "None"
         Else
             Range("B20").Value = ""
         End If
     End If
     Application.EnableEvents = True
     End Sub