在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中运行?
答案 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) 以进行串联连接。