自动文本大小Excel VBA

我目前正在试图写一个基于表更改的macros,其中表中的字母自动转换为大写。 因此,例如,如果我在单元格中input“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 

这会返回一个编译错误“Expected:list separator or”)。 所以显然有些问题,但希望这可能有助于说明我正在努力完成什么。

提前感谢在这个问题上的任何帮助。

-Sean

第一。 您可以由于许多原因而禁用事件。 让我们确保您可以执行以下事件:

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

第二。 要检查交集是否匹配ListObject table中的相应列,你需要像这样的东西:

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

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

UCase所做的是将给定string中的所有字符转换为大写,因此可以将其应用于任何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 

它转换成Sheet1Table1的第一列中任何stringinput的大写字母。 它必须放置在Sheet1目标文件中(在Microsoft Excel Object文件夹内的VBA项目资源pipe理器中: Sheet1 (Sheet1) )。 适应你的实际情况很简单。