VBS中的mid()= foo?

时间:2011-04-11 12:58:55

标签: vba string

在VBA和VB6中,我可以为VBS中的示例mid分配一些内容mid(str,1,1)="A",但这不起作用。 我需要这个,因为字符串连接速度很慢 这是我真正快速入侵的实际代码

Function fastXMLencode(str)
    Dim strlen
    strlen = Len(str)
    Dim buf
    Dim varptr
    Dim i
    Dim j
    Dim charlen
    varptr = 1
    buf = Space(strlen * 7)
    Dim char
    For i = 1 To strlen
        char = CStr(Asc(Mid(str, i, 1)))
        charlen = Len(char)
        Mid(buf, varptr, 2) = "&#"
        varptr = varptr + 2
        Mid(buf, varptr, charlen) = char
        varptr = varptr + charlen
        Mid(buf, varptr, 1) = ";"
        varptr = varptr + 1
    Next
    fastXMLencode = Trim(buf)
End Function

如何让它在VBS中运行?

4 个答案:

答案 0 :(得分:2)

权威来源明确声明它在VBScript中不可用:

Visual Basic for Applications Features Not In VBScript

  

字符串:定长字符串LSet,RSet Mid Statement StrConv

VBA同时具有Mid Statement 和Mid Function 。 VBScript只有Mid函数。

如果您在VBScript中执行此操作,那么另外一个选项是进行API调用。由于您已经习惯直接使用字符串缓冲区,因此这对您来说可能不会太大。这个页面可以帮助您入门:String Functions

很抱歉,看起来API调用也出来了:Rube Goldberg Memorial Scripting Page: Direct API Calls除非你想为你的电话编写一个ActiveX包装器,但我们开始进行大量工作(以及额外的维护要求) )现在。

答案 1 :(得分:1)

你做不到。您必须从头开始重建字符串。

答案 2 :(得分:0)

这是不可能的,mid(str,1,1)是一个只返回一个数字的函数(str不是通过'引用'传递而且不会被改变)。

答案 3 :(得分:0)

提出答案永远不会太晚,即使是一个十年前的问题......

VBScript 的一个优点是,即使它是 VB/VBA 的一个子集,它仍然允许您声明(和使用)类。拥有类意味着它们具有属性,带有 getter 和/或 setter...如果你能猜到我要去哪里...

因此,如果您围绕 Mid() 的 VBA 兼容实现包装一个类,实际上可以使用 Let 属性模拟 Mid() 语句。考虑以下代码:

Class CVBACompat
    ' VB6/VBA-Like Mid() Statement
    Public Property Let LetMid(ByRef Expression, ByVal StartPos, ByVal Length, ByRef NewValue) ' ( As String, As Long, As Long, As String)
        Dim sInsert ' As String
        sInsert = Mid(NewValue, 1, Length)
        Expression = Mid(Expression, 1, StartPos - 1) & sInsert & Mid(Expression, StartPos + Len(sInsert))
    End Property
    
    ' VB6/VBA-Like IIf() Function
    Public Function IIf(Expression, TruePart, FalsePart)
        If CBool(Expression) Then
            IIf = TruePart
        Else
            IIf = FalsePart
        End If
    End Function
End Class: Public VBACompat: Set VBACompat = New CVBACompat: Public Function IIf(X, Y, Z): IIf = VBACompat.IIf(X, Y, Z): End Function

VBA's language specification 表示当 Mid( <string-expression>, <start> [, <length> ] ) 用作语句时,源字符串 <string-expression> 中要替换的内容是给定整个 RHS 表达式的最少字符数 受限于 <lenght> 参数,提供。现在,您不能在 VBScript 中使用可选参数,因此如果您还希望能够使用 Mid( <string-expression>, <start> ) = <expression> 类型的语句,您必须有两个单独的实现。

上面提出的实现可以用下面的代码来检查(不包括对错误抛出条件的检查,不管怎样,这与 Mid() 函数是一样的):

Dim f ' As String
Dim g ' As String

    f = "1234567890"
    g = f
    
    ' VB6 / VBA: Mid(f, 5, 2) = "abc"
    VBACompat.LetMid(f, 5, 2) = "abc"
    ' VB6 / VBA: Mid(g, 5, 4) = "abc"
    VBACompat.LetMid(g, 5, 4) = "abc"
    
    WScript.Echo "First call " & IIf(f = "1234ab7890", "passes", "fails")
    WScript.Echo "Second call " & IIf(g = "1234abc890", "passes", "fails")

在任何情况下,由于提议的解决方案只是对其他本机代码实现(在 VB6、VBA 中)的模拟,并且仍然暗示字符串连接与类实例化 + VTable 翻译的开销,因此 OP 会更好创建并提供 ActiveX 组件 (OCX) 以进行串联连接。