选择表格中的任何单元格后打开UserForm

时间:2017-04-06 18:10:36

标签: excel-vba userform vba excel

我使用以下代码在用户的表格中选择单元格时打开用户表单,其中每个表格有30行,一个表格中有多个表格。我将不得不一次又一次地写出100行。

我知道这不是一种有效的方法。如何在不影响功能的情况下简化和缩短此代码?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Address = "$D$31:$E$31" Then
 Open_Text_Form
End If

If Target.Address = "$D$32:$E$32" Then
 Open_Text_Form
End If

If Target.Address = "$D$33:$E$33" Then
 Open_Text_Form
End If

If Target.Address = "$D$34:$E$34" Then
 Open_Text_Form
End If

If Target.Address = "$D$35:$E$35" Then
 Open_Text_Form
End If

If Target.Address = "$D$36:$E$36" Then
 Open_Text_Form
End If

If Target.Address = "$D$37:$E$37" Then
 Open_Text_Form
End If

End Sub

1 个答案:

答案 0 :(得分:0)

您可以使用“相交”功能查找范围(单元格)是否在给定范围内。如果不知道如何在工作表中设置数据,我无法说出最好的检查方法是什么。如果多个"表"在你的工作表上实际上是Excel表,你可以做这样的事情,让它检查你是否已经点击其中一个。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim tableRange As Range

For i = 1 To ListObjects.Count

    If i = 1 Then
        Set tableRange = ListObjects(i).DataBodyRange
    Else
        Set tableRange = Application.Union(tableRange, ListObjects(i).DataBodyRange)
    End If

Next

If tableRange Is Nothing Then Exit Sub

If Not Application.Intersect(Target, tableRange) Is Nothing Then
    Open_Text_Form
End If

End Sub

然而,如果"表"在工作表中只是您可以在命名范围内定义它们的正常数据范围,您需要做的就是

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Application.Intersect(Target, Range("MyNamedRange")) Is Nothing Then
    Open_Text_Form
End If

End Sub