str函数与Str的奇怪问题

时间:2015-09-07 18:18:52

标签: vba excel-vba excel

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

Ltrim(Str(Usersdata(UsersDataRow,UUID_Col)))

注意str上的大写字母S.以前版本的工作簿具有相同的行,但str是全部小写,并且不会崩溃excel。 两种文件语法检查完美。但最奇怪的是,当我在VBA编辑器中打开旧版本和新版本的文件时。 如果我编辑旧文件中的行并将str更改为Str,则编辑器会将其自动更正回所有小写str。 如果我编辑新工作簿并将Str更改为str,则编辑器会将其自动更新回init cap Str。 因此,我无法更正新文件。 这种行为很奇怪,我希望有人能告诉我它是如何发生的,可能还有如何解决它?

1 个答案:

答案 0 :(得分:1)

关于修复主要问题,我建议更换行

Ltrim(Str(Usersdata(UsersDataRow,UUID_Col)))

具有更彻底的输入验证,可以处理字母数字值

正如Siddharth Rout在评论中所说:

您描述的症状表明 VBA名称空间已损坏

最常见的来源是变量名称,例如&#34; str &#34;,&#34; val &#34;,&#34; < strong>名称&#34;,&#34; 文件&#34;,&#34; 计数&#34;,&#34; 单元&#34;,&#34; &#34;等

检查名称冲突的快捷方法是在变量名称内单击并按 F1 ;

  • 帮助应显示&#34; 未找到关键字&#34;

下面的实验可以证明问题:打开一个新的Excel,并为VBA Alt + F11

  1. 将此代码粘贴到标准模块中:
  2. Sub test1()
    
        Dim txt As String   'valid variable name
    
        txt = Str("123")    'Str() remains with a capital S
    
    End Sub
    

    1. 现在用这个(显而易见的问题)替换代码:
    2. Sub test2()
      
          Dim str As String   'invalid variable name
      
          str = str("123")    'Str() is converted to lower case "s"
      
      End Sub
      

      VBA现已损坏,以下是修复它的一种方法:

      • 关闭文件
      • 重新打开它,不允许运行宏
      • 打开VBA编辑器( Alt + F11
      • 所有VBA模块中为&#34; str&#34;执行搜索和替换 (替换&#34; str&#34;用&#34; Str&#34;)

        • 比赛案例
        • 仅查找整个单词
        • 当前项目&lt; - 最重要的设置

      替换操作只会执行一次,因为VBA会自动转换&#34; str&#34;的所有其他实例。到&#34; Str&#34;在任何其他替换之前

      下次打开文件时,名称空间现已恢复

      (该程序强制重新编译为所有模块生成的P代码)

      重新生成干净的P代码的另一种方法是将每个单独的标准模块导出为* .bas文件,将* .cls导出为类模块,将* .frm导出为用户表单代码,并将所有标准模块导入新的Excel文件