2017-04-06 48 views
0

我正在使用以下代码在用户表格中选择单元格时打开一个用户窗体,其中每个表格有一行中有多个表格的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

堆栈概述题为一段代码审查将是效率工作的最佳场所。 http://codereview.stackexchange.com/ – Cyril

回答

0

您可以使用Intersect函数来查找范围(单元格)是否在给定范围内。不知道如何在表单中设置数据,我不能说最好的检查方法是什么。如果工作表中的多个“表格”实际上是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 
+0

亲爱的Wedge,巨大的拥抱和非常感谢您的帮助,是的,您的第二个建议的解决方案为我工作,并将整个35行代码转换为2-3行!是的,这正是我所要求的!非常感谢,并且非常感谢! – user7828601

相关问题