【问题标题】:Trouble with VBS InStr - using a nested InStr as the optional start argumentVBS InStr 的问题 - 使用嵌套的 InStr 作为可选的开始参数
【发布时间】:2015-04-22 14:27:03
【问题描述】:

大家早上好...我需要一些帮助将函数从 VBA 移植到 VBS

这是我的问题所基于的数据集的示例。

USA_66544_File.doc
RUS_3465_File.txt

我使用该函数提取两个下划线之间的数字字符串。万一这很重要,我首先根据下划线将字符串分成几段,然后将它们拼凑在一起以隔离我想要的字符串。

=MID(A5,FIND("_",A5)+1,FIND("_",A5,FIND("_",A5)+1)-FIND("_",A5)-1) '##original working in Excel

上面的输出分别是 66544 和 3465。

然后我需要将此功能移植到 VBS。 MID 没问题,但 FIND 更改为 InStr。此外,我的单元格引用 (A5) 更改为大小为 array(1,7) 的二维数组

MID(array(0,x),InStr(array(0,x),"_")+1,InStr(InStr(array(0,x),"_")+1),array(0,x),"_")'-(Instr(array(0,x),"_")-1)

我收到错误“参数数量错误或属性分配无效”。

这就是我认为我正在做的事情。 MID 接受三个参数,最后一个是可选的。

MID(string, start, [# of char to return]
  1. 字符串 = 数组(0,x)
  2. start = InStr(array(0,x),"_")+1(这应该找到一个下划线, 然后返回下一个数字)
  3. 长度 = Instr(Instr(array(0,x),""),array(0,x),"")-Instr(array(0,x),"_")-1李>

因此,为了以防万一,在我的二维数组中,第一个维度将包含完整的字符串

USA_66544_File.doc
RUS_3465_File.txt

第二个,函数的输出

66544
3465

任何人都可以帮助我理解这一点,我将不胜感激。 谢谢, 药草

【问题讨论】:

  • 为什么不:Split(array(0,x), "_")(1)

标签: vba excel vbscript


【解决方案1】:

简单的解决方案是使用 Split():

>> Dim array(0,0)
>> array(0,0) = "USA_66544_File.doc"
>> WScript.Echo array(0,0), Split(array(0,0), "_")(1)
>>
USA_66544_File.doc 66544

我在这个演示中使用了变量名array,因为我想确保重新/误用Array()函数的名称不会引发错误。建议还是选择一个更好的名字。

如果要使用 Mid() 和 Instr(),请按部就班:

>> s = "USA_66544_File.doc"
>> f = InStr(1, s, "_") + 1
>> t = InStr(f, s, "_")
>> l = t - f
>> WScript.Echo Mid(s, f, l)
>>
66544

正确完成后,优化很容易:

>> s = "USA_66544_File.doc"
>> f = InStr(1, s, "_") + 1
>> WScript.Echo Mid(s, f, InStr(f, s, "_") - f)
>>
66544

内联 f(即重复表达式)肯定不会是一种优化,尤其是当您考虑需要添加一些错误检查时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 2014-02-14
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多