Excel VBA: как передать строку в качестве указателя на процедуру для добавления строки?

#excel #kernel32 #vba

#excel #kernel32 #vba

Вопрос:

Я хочу передать строку в качестве параметра ввода / вывода в процедуру. Я знаю, что обычно VBA работает не так, но это из-за особого случая. У меня уже есть инструмент code generator — генерирующий код для анализатора формата файла. И я не хочу взламывать этот код. Сгенерированный синтаксис можно легко преобразовать в vba, используя text replace, это не имеет большого значения (я это уже делал). Но это сложно изменить программы на функции.

Я выяснил, как я могу расширить строку, передав ее указатель. Но как я могу добавить символы к строке?

 Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (Destination As Any, Source As Any, _
    ByVal length As Long)

Private Declare Function lstrlenA Lib "kernel32" _
   (ByVal lpString As Long) As Long

Private Declare Function lstrlenW Lib _
  "kernel32" (ByVal lpString As Long) As Long


Sub AppendString(i_pt As Long, i_what As String)
    Dim strLentgh As Long                  ' variable to hold the length of string
    Dim ptrLengthField As Long             ' pointer to 4-byte length field

    ' get the length of the string
    ptrLengthField = i_pt - 4              ' length field is 4 bytes behind
    CopyMemory strLentgh, ByVal ptrLengthField, 4

    ' extend the String length
    strLentgh = strLentgh   (Len(i_what) * 2)
    CopyMemory ByVal ptrLengthField, strLentghamp;, 4

    ' How to apped the string?
    ' CopyMemory ByVal i_pt, ????
End Sub

Sub test2()
    Dim str As String
    Dim sPtr As Long

    str = "hello"
    sPtr = strPtr(str)

    Debug.Print Len(str)
    Call AppendString(sPtr, " there")
    Debug.Print Len(str)
    Debug.Print str
End Sub
  

Ответ №1:

VBA может сделать это изначально

 Sub AppendString(byref str as string, i_what As String)
    str = str amp; i_what
end sub
  

Для тестирования

 Sub Test()
    Dim s As String

    s = "Hello"

    AppendString s, " World"
    Debug.Print s
End Sub
  

Комментарии:

1. ох .. Я думал, что пробовал это, но… aaa .. хм … 🙂 спасибо, Крис!

2. знаете ли вы, что AppendString(s, "World") они не работают таким же образом, как AppendString s, "World" или Call AppenString(s, "World") ? Просто потому, что это интересно, почему это другое поведение?