自动文本大写Excel VBA

时间:2013-10-21 14:19:37

标签: excel excel-vba formatting vba

我正在尝试根据工作表更改编写宏,其中表列中的字母会自动转换为大写。因此,例如,如果我将“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

2 个答案:

答案 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)中)。使其适应您的实际情况很简单。