Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba str函数与str的奇怪问题_Vba_Excel - Fatal编程技术网

Vba str函数与str的奇怪问题

Vba str函数与str的奇怪问题,vba,excel,Vba,Excel,我有一个多年来遇到的奇怪问题。我有一个工作簿,里面有很多验证用户数据的代码,现在已经使用了很多年了。一位用户报告说,该文件的最新版本正在使excel崩溃,并给他一个“自动化错误”。据我所知,对最近的文件所做的更改很小,不应该导致这种情况。经过分析,问题的原因是直截了当的,但我不知道它是如何发生的,为什么会发生,以及如何解决。 出现此问题的原因是以下代码行需要数字,但用户提供了字符串: Ltrim(Str(Usersdata(UsersDataRow,UUID_Col))) 请注意str上的大写

我有一个多年来遇到的奇怪问题。我有一个工作簿,里面有很多验证用户数据的代码,现在已经使用了很多年了。一位用户报告说,该文件的最新版本正在使excel崩溃,并给他一个“自动化错误”。据我所知,对最近的文件所做的更改很小,不应该导致这种情况。经过分析,问题的原因是直截了当的,但我不知道它是如何发生的,为什么会发生,以及如何解决。 出现此问题的原因是以下代码行需要数字,但用户提供了字符串:

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
        是正确的。您得到的是
        str
        ,因为您很可能在代码中的某个地方声明了一个具有该名称的变量。因此,应该避免使用保留名称作为变量。也有可能您有一个同名的过程。在VBA项目中搜索
        str
        Siddharth Rout-接受str是正确的,但我没有将str作为变量,如果我这样做了,Ltrim(str(Usersdata(UsersDataRow,UUID_Col))肯定不会编译?(确实如此,并且已经工作了5年多)编译不是问题
        Dim str(1)作为字符串:str(0)=“sid”:Debug.Print str(0)
        也将编译,但它与
        Debug.Print str(0)
        ;)不同我可以看一下您的文件吗?您不必还有一个名为
        str
        的变量-如果您在该工作簿中的任何时候看到了,您都会看到这种行为。只需添加
        Dim Str
        ,编译,然后删除声明,您就会看到
        Str
        自动更正为
        Str
        。注意:VBA在这种情况下不区分大小写,因此这可能是毫无意义的。:)@罗里:是的,这可能是毫无意义的,但我感觉不是。。。(我可能错了)如果你有时间,只要看看聊天窗口中的评论就可以了。。也许我错过了什么?用新鲜的眼光看待事物总是更好的。:)
        Val(Usersdata(UsersDataRow,UUID\u Col))
        这是一个错误的建议。请阅读聊天窗口中的评论。问题是,用户在每个数字前都添加了“a”,因此出现了错误。Op现在计划在用户输入内容时进行验证<代码>?val(“a123”)将为您提供OP不需要的
        0
        :)谢谢@SiddharthRout。我用更相关的信息更新了答案谢谢Siddharth Rout的Paul Bica-我在发布之前就知道我需要在违规专栏中添加一个验证,以确保它是数字的(令人惊讶的是,考虑到其他广泛的验证,它还没有出现)。我的问题是关于其他奇怪的行为。你们都帮助了我的理解,我导出了所有代码,重新导入到一个全新的工作簿中,复制了旧工作簿中的所有工作表,复制了我的功能区代码,现在有了新版本的工作簿,问题就解决了。所以干净的代码就是答案。谢谢大家
        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