VBA来格式化基于另一个单元格不工作的单元格

解决:find我自己的工作表错误我遇到的问题是试图在同一个工作簿中使用两个工作表change_change。 因为我认为这是可能的,当我收到一个错误时,我只是重命名工作表事件,没有考虑到这一点。 当我的原始代码和答案提供了工作,当我的其他worksheet_change事件结合起来。 感谢大家。

原始要求:

我正试图运行一个这样的macros:

每当单元格r6发生更改时,运行一个macros查看单元格s9中的值是否大于或等于1,然后基于此格式化单元格s9:t100。

我有自己的macros来做第二部分:

sub macro1() If Range("S9").Value < 1 Then Range("S9:S100,T9:T100").Select Selection.NumberFormat = "0.0%" Else Range("S9:S100,T9:T100").Select Selection.NumberFormat = "#,##0" End If end sub 

这个macros自己运行,完全按照我的想法和格式化单元格。

然后我有工作表事件来调用这个macros:

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$R$6" Then Call Macro1 End If End Sub 

当它运行时调用相同的macros,它不格式化单元格。 无论单元格r6何时改变,它们都保持为%。

任何想法为什么工作表事件导致macros不起作用?

尝试将工作表对象传递给您的macros。 这完全符合Ranges以确保您在正确的区域工作。

另外,你根本不需要Select 。 只需使用该范围,并直接更改设置。

 Public Sub Macro1(ws as Worksheet) If ws.Range("S9").Value < 1 Then ws.Range("S9:S100,T9:T100").NumberFormat = "0.0%" Else ws.Range("S9:S100,T9:T100").NumberFormat = "#,##0" End If end sub Sub test() Macro1 ActiveSheet End Sub 

并在您的Worksheet_Change

 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$R$6" Then Macro1 Target.Worksheet End If End Sub