在vba模块中使用target.row时出错

我正在创build一个Excel 2007应用程序,它使用完全相同的VBA代码来强制大写字母在2列中。 此代码在8个不同的工作表中使用。 我试图在一个模块中创build一个子程序,这样我就可以在8个工作表中的每一个下面调用这个子程序,但是它不起作用。

当我在每个工作表下直接添加下面的代码:

Private Sub Worksheet_Change(ByVal Target As Range) Dim TargetRowNumber As Integer Dim targetColumnNumber As Integer If (Target.Row >= 6 And Target.Row <= 500) Then If (Not Intersect(Target, Range("F6:F500")) Is Nothing) Then If Target.Column = 6 Then Application.EnableEvents = False Range("$F" & Target.Row).Value = UCase(Range("$F" & Target.Row).Value) Application.EnableEvents = True End If End If If (Not Intersect(Target, Range("K6:K500")) Is Nothing) Then If Target.Column = 11 Then Application.EnableEvents = False Range("$K" & Target.Row).Value = UCase(Range("$K" & Target.Row).Value) Application.EnableEvents = True End If End If end if end sub 

但是,如果我创build一个模块具有相同的代码,并尝试调用每个工作表下的子例程,我得到以下错误:运行时错误“424”:所需的对象。

代码模块:

 Sub convert_upper() Dim TargetRowNumber As Integer Dim targetColumnNumber As Integer If (Target.Row >= 6 And Target.Row <= 500) Then If (Not Intersect(Target, Range("F6:F500")) Is Nothing) Then If Target.Column = 6 Then Application.EnableEvents = False Range("$F" & Target.Row).Value = UCase(Range("$F" & Target.Row).Value) Application.EnableEvents = True End If End If If (Not Intersect(Target, Range("K6:K500")) Is Nothing) Then If Target.Column = 11 Then Application.EnableEvents = False Range("$K" & Target.Row).Value = UCase(Range("$K" & Target.Row).Value) Application.EnableEvents = True End If End If End If End Sub 

每个工作表下的代码调用子程序:

 Private Sub Worksheet_Change(ByVal Target As Range) convert_upper End Sub 

这是我第一次尝试用vba编程。 我试图在网上find一个解决scheme,但没有成功。 如果有人能帮助我,我将不胜感激。

非常感谢。

克里斯有一个很好的答案让你的个人事件子程序工作。

但是,更简单的方法是使用工作簿级SheetChange事件。 这与工作表级别的事件相同,只是每当工作簿中的任何工作表发生更改时都会触发它。 它的参数包括除了Target之外的Sh ,以便您可以testing哪个表触发了该事件。 假设您不希望工作簿中的每个工作表都触发该事件,则需要执行此操作。

以下是我认为可以为您工作的一些代码。 我也收紧了一些逻辑。 将其粘贴到工作簿的ThisWorkbook模块中:

 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim RangeToUpper As Excel.Range Dim AreaToUpper As Excel.Range Select Case Sh.Name Case "Sheet1", "Sheet2" If (Not Intersect(Target, Sh.Range("F6:F500")) Is Nothing) Or _ Not Intersect(Target, Sh.Range("K6:K500")) Is Nothing Then Set RangeToUpper = Intersect(Target, Union(Sh.Range("F6:F500"), Sh.Range("K6:K500"))) On Error GoTo Err_Handler Application.EnableEvents = False For Each AreaToUpper In RangeToUpper.Areas AreaToUpper.Value = UCase(AreaToUpper.Value) Next AreaToUpper End If End Select Err_Handler: Application.EnableEvents = True End Sub 

你需要考虑Variable Scope

将您的Sub声明更改为

 Sub convert_upper(Target as Range) 

并称之为

 convert_upper Target 

您还需要限定公用SubRange引用(否则代码将引用ActiveSheet )。 例如(适用于Range所有用途)

 With Target.Parent .Range("$F" & Target.Row).Value = UCase(.Range("$F" & Target.Row).Value) End With