Excel 取消选择单元格时的VBA反向格式

Excel 取消选择单元格时的VBA反向格式,excel,vba,formatting,Excel,Vba,Formatting,现在,当用户选择一个单元格时,通过添加中等厚度的边框来高亮显示关联的单元格。这是一个日历的时间 例如,当用户单击D4时,它必须将边框添加到B5,当用户取消选择D4时,它必须取消边框B5: 这方面的代码如下所示,并且可以正常工作: If Not Intersect(Target, Range("$D$4")) Is Nothing Then Range("$B$5").Borders(xlEdgeBottom).Weight = xlMedium Range("$B$5").Bo

现在,当用户选择一个单元格时,通过添加中等厚度的边框来高亮显示关联的单元格。这是一个日历的时间

例如,当用户单击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个“else”块每次都会不必要地运行。这仅仅是几百个命令,但它肯定会很快地延迟。有没有办法清理一下?否则它将需要30个单元格*11行代码,这似乎太多了。

您不必单独调用边框:

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
,然后处理选定的单元格。

这是我对您想要做什么的最佳猜测。您只给出了一个示例,因此无法确定,但我认为您希望单元格上有一个厚边框,一个在下面,两个在所选单元格的左侧

'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
此代码属于
工作表\u selection change
事件。(想必你已经知道了。)


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

这将有助于显示触发格式化的代码。如果我们有更多的上下文,您的代码可能会更简洁。我假设您正在尝试向excel中添加“焦点”boarder功能,而您的“其他”部分正在重置所有其他boarder。但您只需重置前1个选定单元格的边界。是否可以记录当前选定的单元格并将其保存在vba或隐藏单元格中,然后仅在“如果”部分重置该单元格?