Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 mid()=VBS中的foo?_Vba_String - Fatal编程技术网

Vba mid()=VBS中的foo?

Vba mid()=VBS中的foo?,vba,string,Vba,String,在VBA和VB6中,我可以为mid分配一些内容,例如mid(str,1,1)=“A”在VBS中,这不起作用。 我需要这个,因为字符串连接非常慢 这是我很快拼凑起来的实际代码 Function fastXMLencode(str) Dim strlen strlen = Len(str) Dim buf Dim varptr Dim i Dim j Dim charlen varptr = 1 buf = Space(strl

在VBA和VB6中,我可以为
mid
分配一些内容,例如
mid(str,1,1)=“A”
在VBS中,这不起作用。 我需要这个,因为字符串连接非常慢 这是我很快拼凑起来的实际代码

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中实现此功能?

您不能这样做。您必须从头开始重建字符串。

这是不可能的,
mid(str,1,1)
是一个只返回数字的函数(str不是“通过引用”传递的,也不会被更改)。

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

:

字符串:固定长度字符串LSet、RSetMid语句

VBA同时具有Mid语句和Mid函数。VBScript仅具有Mid功能

如果在VBScript中无法执行此操作,则另一个选项是进行API调用。因为您已经习惯了直接使用字符串缓冲区,所以这对您来说可能不会有太大的飞跃。本页将帮助您开始:


很抱歉,API调用似乎也被取消了:除非您想为调用编写ActiveX包装器,但我们现在开始投入大量工作(以及额外的维护要求)。

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

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

因此,如果将类包装在与VBA兼容的
Mid()
实现周围,实际上可以使用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
表示当将
Mid(,[,])
用作语句时,源字符串
中要替换的字符数是给定整个RHS表达式的最小字符数,或者在提供时受
参数的限制。现在,VBScript中不能有可选的参数,所以如果您想同时使用sort
Mid(,)=
语句,您必须有两个单独的实现

可以使用以下代码检查上述建议的实现(不包括错误抛出条件的检查,这与
Mid()
函数相同):


在任何情况下,由于建议的解决方案只是对其他本机代码实现(在VB6、VBA中)的模拟,并且仍然意味着字符串连接,同时还要承担类实例化+VTable转换的开销,因此OP最好创建并提供ActiveX组件(OCX)以串联方式进行连接。

我知道这毫无意义,但说真的,至少可以使用VBA,尝试在excel中运行它。我接受这一点,并结合Mwolf02的答案。我知道我不能用mid来做这件事,但我希望有另一种方法来修改字符串。这篇文章可能也会引起你的兴趣:遗憾的是,我被VBS卡住了。我最后只是换了几个造成问题的角色,现在已经足够快了。一旦有人使用我在替换列表中没有的新字符,我会再次感到有趣
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")