我正在尝试根据工作表更改编写宏,其中表列中的字母会自动转换为大写。因此,例如,如果我将“abcde-12345-678”输入到单元格中,它将自动更正为“ABCDE-12345-678”。在做了一些挖掘之后,我发现了一些适用于某些人的代码,但是我无法根据自己的需要进行调整。
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("E:E")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Target = UCase(Target)
Application.EnableEvents = True
End Sub
我想解决两件事。第一个是,这个代码目前不适合我。我根据作者(位于Sheet1对象中)在正确的位置。有什么想法为什么这不起作用?
第二个是我想修改代码以引用表列而不是范围。例如,我尝试将上面代码的第二行更改为以下内容(我的表名是ReviewTracker,我感兴趣的列是产品编号):
If Intersect(Target, Range(ReviewTracker[[@Headers],[Product Number]])) Is Nothing Then Exit Sub
这返回了编译错误“Expected:list separator or)”。所以它显然有些不对劲,但希望它可能有助于说明我想要实现的目标。
提前感谢您对此问题的任何帮助。
-Sean
答案 0 :(得分:5)
首先。您可以因为很多原因而停用活动。让我们确保您可以按照以下方式执行事件:
转到VBA编辑器>>打开立即窗口>>写在那里:Application.EnableEvents = true
>>按Enter键
第二。要检查交叉点是否匹配您ListObject table
中的相应列,您需要这样的内容:
If Intersect(Target, Range("ReviewTracker[Product Number]")) is Nothing Then
假设ReviewTracker
是表名,Product Number
是表列。您不需要#Headers
,因为它只会引用标题行。
答案 1 :(得分:3)
UCase
的作用是将给定字符串中的所有字符转换为大写字母,因此您可以将其应用于任何Range.Value。每次单元格的值发生变化时都会调用Worksheet_Change
,因此是放置代码的好地方。但是你用来引用表的方式是错误的。您发布的代码符合您的要求:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Sheet1.ListObjects("Table1").ListColumns(1).Range) Is Nothing Then Exit Sub
Target.Value = UCase(Target.Value)
End Sub
它会在Table1
的{{1}}的第一列中将任何字符串输入转换为上限。它必须放在Sheet1对象文件中(在Sheet1
文件夹中的VBA项目资源管理器:Sheet1 (Sheet1)
中)。使其适应您的实际情况很简单。