Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Sub main() Dim s As String
s = "我爱你中国" Debug.Print MyMid(s, 4, 2) End SubPublic Function MyMid(ByRef strSource As String, ByVal nStart As Long, ByVal nLength As Long) As String Dim strBuffer As String
If nStart <= 0 Or Len(strSource) - nStart < 0 Then Exit Function If nLength > Len(strSource) - nStart + 1 Then nLength = Len(strSource) - nStart + 1
呵呵 既然是自定义 那我也来个简单的 Function midX(ByVal s As String, ByVal p As Integer, ByVal l As Integer) As String Dim bs() As Byte Dim i As Integer s = StrConv(s, vbFromUnicode) ReDim bs(Len(s) - 1) bs() = s If p < 1 Then p = 1 If p > UBound(bs) + 1 Then p = UBound(bs) + 1 If l < 1 Then l = 1 If l > UBound(bs) - p + 1 Then l = UBound(bs) - p + 2 For i = p To l + p - 1 midX = midX & Chr(bs(i - 1)) Next End Function
真的佩服江南大侠的代码,呵呵!对API函数的运用已经炉火纯青了学习了!
之所以重写是因为一段宏代码是本机运行很正常,但在windows7 + office2007下提示"can't find project or library", 其中Mid找不到,所以尝试使用自定义方式。可能问题不在于Mid,这些基本的函数为什么不支持呢, 那位大侠遇到过.google中
msdn:
MyString = "The dog jumps" ' Initialize string.
Mid(MyString, 5, 3) = "fox" ' MyString = "The fox jumps".
Dim sLeft, sRight As String
If IsMissing(length) Then
MyMid = Right(str, Len(str) - Len(Left(str, start - 1)))
Else
sLeft = Left(str, start - 1)
sRight = Right(str, Len(str) - Len(sLeft) - length)
str = Replace(str, sLeft, " ")
str = LTrim(str)
str = Replace(str, " ", sLeft)
str = Replace(str, sRight, " ")
str = RTrim(str)
str = Replace(str, " ", sRight)
MyMid = str
End If
End Function
Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Sub main()
Dim s As String
s = "我爱你中国"
Debug.Print MyMid(s, 4, 2)
End SubPublic Function MyMid(ByRef strSource As String, ByVal nStart As Long, ByVal nLength As Long) As String
Dim strBuffer As String
If nStart <= 0 Or Len(strSource) - nStart < 0 Then Exit Function
If nLength > Len(strSource) - nStart + 1 Then nLength = Len(strSource) - nStart + 1
strBuffer = String(nLength, vbNullChar)
CopyMemory ByVal StrPtr(strBuffer), ByVal StrPtr(strSource) + (nStart - 1) * 2, nLength * 2
MyMid = strBuffer
End Function
vMid = Left(Right(s, Len(s) - l1 + 1), l2 - l1 + 1)
End Function
Function midX(ByVal s As String, ByVal p As Integer, ByVal l As Integer) As String
Dim bs() As Byte
Dim i As Integer
s = StrConv(s, vbFromUnicode)
ReDim bs(Len(s) - 1)
bs() = s
If p < 1 Then p = 1
If p > UBound(bs) + 1 Then p = UBound(bs) + 1
If l < 1 Then l = 1
If l > UBound(bs) - p + 1 Then l = UBound(bs) - p + 2
For i = p To l + p - 1
midX = midX & Chr(bs(i - 1))
Next
End Function
不一定是mid。