Vba str函数与str的奇怪问题
我有一个多年来遇到的奇怪问题。我有一个工作簿,里面有很多验证用户数据的代码,现在已经使用了很多年了。一位用户报告说,该文件的最新版本正在使excel崩溃,并给他一个“自动化错误”。据我所知,对最近的文件所做的更改很小,不应该导致这种情况。经过分析,问题的原因是直截了当的,但我不知道它是如何发生的,为什么会发生,以及如何解决。 出现此问题的原因是以下代码行需要数字,但用户提供了字符串:Vba str函数与str的奇怪问题,vba,excel,Vba,Excel,我有一个多年来遇到的奇怪问题。我有一个工作簿,里面有很多验证用户数据的代码,现在已经使用了很多年了。一位用户报告说,该文件的最新版本正在使excel崩溃,并给他一个“自动化错误”。据我所知,对最近的文件所做的更改很小,不应该导致这种情况。经过分析,问题的原因是直截了当的,但我不知道它是如何发生的,为什么会发生,以及如何解决。 出现此问题的原因是以下代码行需要数字,但用户提供了字符串: Ltrim(Str(Usersdata(UsersDataRow,UUID_Col))) 请注意str上的大写
Ltrim(Str(Usersdata(UsersDataRow,UUID_Col)))
请注意str上的大写字母S。工作簿的早期版本有相同的行,但str都是小写,并且不会使excel崩溃。
两个文件的语法都检查得很好。但最奇怪的是,当我在VBA编辑器中打开文件的旧版本和新版本时。
如果我编辑旧文件中的行并将str更改为str,编辑器会自动将其更正回所有小写str。
如果我编辑新工作簿并将Str更改为Str,编辑器会自动将其更正回init cap Str。
因此,就目前情况而言,我无法更正新文件。
这种行为非常奇怪,我希望有人能告诉我它是如何发生的以及可能如何解决的?关于解决主要问题,我建议更换线路
Ltrim(Str(Usersdata(UsersDataRow,UUID\u Col)))
具有更彻底的输入验证,可以处理字母数字值
正如Siddharth Rout在评论中所建议的: 您描述的症状表明VBA名称空间已损坏 最常见的来源是变量名,如“str”、“val”、“名称”、“文件”、“计数”、“单元格”、“行”等 检查名称冲突的快速方法是在变量名称内单击并按F1键
- 帮助应显示“未找到关键字”
下面的实验可以演示这个问题:打开一个新的Excel,并使用Alt+F11进行VBA
VBA现在已损坏,以下是修复它的一种方法:
- 关闭文件
- 重新打开它,不允许运行宏
- 打开VBA编辑器(Alt+F11)
- 在所有VBA模块中对“str”执行搜索和替换(将“str”替换为“str”)
- 火柴盒
- 只找到整个单词
- 当前项目
是正确的。您得到的是Str
,因为您很可能在代码中的某个地方声明了一个具有该名称的变量。因此,应该避免使用保留名称作为变量。也有可能您有一个同名的过程。在VBA项目中搜索str
Siddharth Rout-接受str是正确的,但我没有将str作为变量,如果我这样做了,Ltrim(str(Usersdata(UsersDataRow,UUID_Col))肯定不会编译?(确实如此,并且已经工作了5年多)编译不是问题str
也将编译,但它与Dim str(1)作为字符串:str(0)=“sid”:Debug.Print str(0)
;)不同我可以看一下您的文件吗?您不必还有一个名为Debug.Print str(0)
的变量-如果您在该工作簿中的任何时候看到了,您都会看到这种行为。只需添加str
,编译,然后删除声明,您就会看到Dim Str
自动更正为Str
。注意:VBA在这种情况下不区分大小写,因此这可能是毫无意义的。:)@罗里:是的,这可能是毫无意义的,但我感觉不是。。。(我可能错了)如果你有时间,只要看看聊天窗口中的评论就可以了。。也许我错过了什么?用新鲜的眼光看待事物总是更好的。:)Str
这是一个错误的建议。请阅读聊天窗口中的评论。问题是,用户在每个数字前都添加了“a”,因此出现了错误。Op现在计划在用户输入内容时进行验证<代码>?val(“a123”)将为您提供OP不需要的Val(Usersdata(UsersDataRow,UUID\u Col))
:)谢谢@SiddharthRout。我用更相关的信息更新了答案谢谢Siddharth Rout的Paul Bica-我在发布之前就知道我需要在违规专栏中添加一个验证,以确保它是数字的(令人惊讶的是,考虑到其他广泛的验证,它还没有出现)。我的问题是关于其他奇怪的行为。你们都帮助了我的理解,我导出了所有代码,重新导入到一个全新的工作簿中,复制了旧工作簿中的所有工作表,复制了我的功能区代码,现在有了新版本的工作簿,问题就解决了。所以干净的代码就是答案。谢谢大家0
Sub test1() Dim txt As String 'valid variable name txt = Str("123") 'Str() remains with a capital S End Sub
Sub test2() Dim str As String 'invalid variable name str = str("123") 'Str() is converted to lower case "s" End Sub