2

我目前正在尝试根据工作表更改编写一个宏,其中表格列中的字母会自动转换为大写。因此,例如,如果我在单元格中输入“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,我感兴趣的列是 Product Number):

If Intersect(Target, Range(ReviewTracker[[@Headers],[Product Number]])) Is Nothing Then Exit Sub

这返回了一个编译错误“预期:列表分隔符或)”。所以它显然有问题,但希望它可以帮助说明我想要完成的事情。

在此先感谢您提供有关此问题的任何帮助。

-肖恩

4

2 回答 2

5

第一的。由于很多原因,您可能会禁用事件。让我们确保您可以执行以下操作的事件:

转到VBA编辑器>>打开即时窗口>>在那里写:Application.EnableEvents = true>>按Enter

第二。要检查交叉点是否与您体内的适当列匹配,ListObject table您需要以下内容:

If Intersect(Target, Range("ReviewTracker[Product Number]")) is Nothing Then

假设这ReviewTracker是表名并且Product Number是表列。您不需要#Headers,因为它只会引用标题行。

于 2013-10-21T14:38:24.570 回答
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它将 in 的第一列中的任何字符串输入转换为大写字母Sheet1。它必须放在 Sheet1 对象文件中(在 VBA 项目资源管理器中:文件夹Sheet1 (Sheet1)Microsoft Excel Object)。使其适应您的实际情况很简单。

于 2013-10-21T14:38:19.990 回答