自动文本大小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
它转换成Sheet1
中Table1
的第一列中任何stringinput的大写字母。 它必须放置在Sheet1目标文件中(在Microsoft Excel Object
文件夹内的VBA项目资源pipe理器中: Sheet1 (Sheet1)
)。 适应你的实际情况很简单。