gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:32:06 26 4
gpt4 key购买 nike

我正在创建一个 Excel 2007 应用程序,它使用完全相同的 VBA 代码强制在两列中使用大写字母。此代码用于 8 个不同的工作表。我尝试在模块中创建一个子例程,以便可以在 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

但是,如果我使用相同的代码创建一个模块并尝试调用每个工作表下的子例程,则会收到以下错误:运行时错误“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编程。我尝试在网上寻找解决方案但没有成功。如果有人能帮助我,我将非常感激。

非常感谢。

最佳答案

克里斯有一个很好的答案,可以让您的个人事件子例程正常运行。

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

这是一些我认为适合您的代码。我还加强了你的逻辑一些。将其粘贴到工作簿的 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

关于excel - 在 vba 模块中使用 target.row 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com