在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
您还需要限定公用Sub
的Range
引用(否则代码将引用ActiveSheet
)。 例如(适用于Range
所有用途)
With Target.Parent .Range("$F" & Target.Row).Value = UCase(.Range("$F" & Target.Row).Value) End With