2014-12-05 94 views
1

当用户选择一个单元格时,通过添加中等厚度的边框来突出显示关联的单元格。这是为了一个时间日历。单元格上的VBA反向格式取消选择

例如,当用户点击D4它必须添加边框B5,并且当用户取消选择D4它必须取消边界B5:

这种情况的代码如下所示和它的工作原理:

If Not Intersect(Target, Range("$D$4")) Is Nothing Then 
    Range("$B$5").Borders(xlEdgeBottom).Weight = xlMedium 
    Range("$B$5").Borders(xlEdgeTop).Weight = xlMedium 
    Range("$B$5").Borders(xlEdgeLeft).Weight = xlMedium 
    Range("$B$5").Borders(xlEdgeRight).Weight = xlMedium 
Else 
    Range("$B$5").Borders(xlEdgeBottom).Weight = xlThin 
    Range("$B$5").Borders(xlEdgeTop).Weight = xlThin 
    Range("$B$5").Borders(xlEdgeLeft).Weight = xlThin 
    Range("$B$5").Borders(xlEdgeRight).Weight = xlThin 
End If 

这样做的麻烦在于,每次选择任何单元格时,它都会运行30个单元格。这意味着,即使没有任何变化,所有30个单元格的格式检查和重置,或者,所有30个“其他”块每次不必要地运行。这只是几百个命令,但它很快就会滞后。有没有办法清除它?否则,它将需要30个单元* 11行代码,看起来过多。

+1

这将有助于显示触发格式的代码。如果我们有更多的上下文,你的代码可能会更简洁。 – 2014-12-05 07:21:07

+1

我假设你正试图为你的excel添加一个“焦点”寄宿生功能,而你的“其他”部分正在重新设置所有其他寄宿生。但是,您需要重置前面1个选定单元的边界。你可以记录当前选中的单元格并将其保存在vba或隐藏的单元格中,并只在“If”部分中重置该单元格? – Larry 2014-12-05 07:29:46

回答

2

您不必单独叫出边界:

Dim wt as Long 

If Not Intersect(Target, Range("$D$4")) Is Nothing Then 
    wt = xlMedium 
Else 
    wt = xlThin 
End If 

Range("$B$5").Borders.Weight = wt 

它,你是如何捕捉选择不是太清楚,但更快的方法可能是整个范围设置为xlThin然后处理选定的单元格。

0

这是我最好的猜测,你想做什么。你只给出一个例子,所以不可能确定,但​​我认为你需要在所选单元格的下方和两个单元格上的厚边框。

'Make them all thin 
Range("B4:B10").Borders.Weight = xlThin 

If Not Intersect(Target, Range("D4:D9")) Is Nothing Then 
    'Make medium border on cell one below and two to the right 
    Target.Offset(1,-2).Borders.Weight = xlMedium 
End If 

此代码属于Worksheet_SelectionChange事件。 (想必你已经知道这一点。)

enter image description here

你没有权利问一个问题;几乎没有任何理由复制粘贴代码多次。如果你发现自己在做这件事,那么你可能错过了一个更简单的做事方式。

相关问题