programing

문자열은 VBA에서 반복할 수 있는 배열입니까?

jooyons 2023. 10. 17. 20:15
반응형

문자열은 VBA에서 반복할 수 있는 배열입니까?

문자열이 VBA의 배열입니까?

예를 들어, C/C++에서 할 수 있는 것처럼 반복할 수 있습니까?

다음과 같은 작업을 수행합니다.

char myArray[10]; 

for (int i = 0; i < length; i++)
{
    cout << myArray[i];
}

VBA에 해당하는 것은 무엇입니까?그것은 내가 기대했던 것처럼 행동하지 않습니다.VBA에서 실제로 많은 문자열을 조작해 본 적이 없습니다! :)

문자열은 바이트 배열이며 문자열의 2바이트 구현(또는 유니코드(보통 문자당 2바이트이지만 그 이상일 수 있음)을 알고 있다면 문자열을 반복할 수 있습니다. 문자열이 VBA에서 시작된 경우 항상 2바이트가 됩니다).

말은, 타입 변환이 필요 없고, 잘 될 겁니다.

Public Sub TestByteString()

    Dim strChars As String
    Dim arrBytes() As Byte
    Dim i As Integer


    strChars = "The quick Brown Fox"
    arrBytes = strChars

    Debug.Print strChars
    Debug.Print

    For i = LBound(arrBytes) To UBound(arrBytes) Step 2 

        Debug.Print Chr(arrBytes(i)) & vbTab & "Byte " & i & " = " & arrBytes(i)

    Next i

    arrBytes(0) = Asc("?")
    arrBytes(2) = Asc("!")
    arrBytes(4) = Asc("*")

    strChars = arrBytes

    Debug.Print
    Debug.Print strChars

    Erase arrBytes

End Sub

결과는 다음과 같습니다.

재빠른 브라운 폭스

T 바이트 0 = 84h 바이트 2 = 104e 바이트 4 = 101바이트 6 = 32q 바이트 8 = 113u 바이트 10 = 117i 바이트 12 = 105c 바이트 14 = 99k 바이트 16 = 107바이트 18 = 32B 바이트 20 = 66r 바이트 22 = 114o 바이트 24 = 111w 바이트 26 = 119n 바이트 28 = 110바이트 30 = 32F 바이트 32 = 70o 바이트 34 = 111x 바이트 36 = 120

?!* 퀵 브라운 폭스

루프의 '2단계'를 기록합니다.나는 그것이 평바닐라 라틴 문자인 'ASCII' 텍스트를 시작하지 않은 문자로 알고 있기 때문에 다른 바이트를 모두 폐기합니다.

아랍어와 핀인 텍스트를 다루어야 할 때 흥미로워집니다. 그리고 실제 워크시트에서 제가 시연 작품에서 했던 것처럼 항상 평범한 바닐라 US ASCII를 다루게 될 것이라고 가정해서는 절대 안 됩니다.

자세한 설명과 함께 Excellerando의 보다 포괄적인 예를 들어 보십시오.

CSV 파일에 Excel 범위 쓰기: 최적화 및 유니코드 호환성

Byte-array 최적화는 아래 표제 아래에 있습니다.

VBA 문자열 처리를 사용하는 대신 바이트 배열에서 실행되는 Adler-32 체크섬의 VBA 구현입니다.

문자열의 근본적인 특성은 코드에 자주 사용할 문제가 아니라 유니코드와 라틴어가 아닌 알파벳의 많은 문제는 코드의 변수를 더 깊이 이해할 때 더 쉬워집니다.

배열은 아니지만 원하는 작업은 사용할 수 있습니다.MID

Sub test()
    Dim strSentence As String
    Dim lngCount As Long    

    strSentence = "This is a string"

    For lngCount = 1 To Len(strSentence)
        Debug.Print Mid(strSentence, lngCount, 1)
    Next lngCount             
End Sub

추가적인 장점에 대해서는 매트의 머그잔 답변도 참고하세요.

편집

실제로 문자열을 통해 반복하는 두 번째 방법이 있는데, 문자열을 한 자리 수의 문자열 배열로 변환한 다음 이를 통해 반복하는 것입니다.이를 위해 우선 Null 문자를 구분자로 사용할 수 있도록 원래 문자열을 유니코드 형식으로 변환해야 합니다.다음은 재현 가능한 예입니다.

Sub test2()
    Dim strSentence As String
    Dim lngCount As Long
    Dim strArray() As String

    strSentence = "This is a string"
    strSentence = StrConv(strSentence, vbUnicode)

    strArray = Split(strSentence, vbNullChar)

    For lngCount = 0 To UBound(strArray)
        Debug.Print strArray(lngCount)
    Next lngCount
End Sub

호기심으로 두 가지 접근법을 비교해 보았습니다(Mat's version Mid, 더 빠른 버전 사용).

Sub test_sub()
    Dim strTest(1 To 5000) As String
    Dim lngStringIter As Long
    Dim lngChars As Long, dblTick As Double

    ' Generate  some long strings first
    For lngStringIter = 1 To 5000
        strTest(lngStringIter) = vbNullChar
        For lngChars = 1 To 10
            strTest(lngStringIter) = strTest(lngStringIter) & _
                Chr(Int((90 - 65 + 1) * Rnd + 65)) & strTest(lngStringIter)
        Next lngChars
    Next lngStringIter

    ' Lets see what happens..
    dblTick = CDbl(Now())
    For lngStringIter = 1 To 5000
      test strTest(lngStringIter)
    Next lngStringIter
    Debug.Print "Time Mid: ", CDbl(Now()) - dblTick

    dblTick = CDbl(Now())
    For lngStringIter = 1 To 5000
      test2 strTest(lngStringIter)
    Next lngStringIter
    Debug.Print "Time Split: ", CDbl(Now()) - dblTick
End Sub

결과:

Time Mid:     4.62962998426519e-05 
Time Split:    1.15740767796524e-05 

그래서 스플릿 접근이 다소 빠른 것 같습니다.


VBA 문자열은 BSTR 데이터 유형으로 구현됩니다.이 데이터 유형에 대한 자세한 정보는 여기여기에서 확인할 수 있습니다.

Mid문자열에서th n 문자를 가져오도록 작동하지만 a를 반환합니다.Variant, 에 대한 암묵적인 전환을 야기합니다.String.

"strong-type" 합니다.Mid$대신.

VBA는 문자열을 변환하지 않고 배열로 취급하게 하지 않는다고 생각합니다.

그러나 사용할 수 있습니다.MID캐릭터를 한 번에 하나씩 얻는 것.

코드는 OTOMH

declare i as integer
declare strlen as int

strlen = Len (YourIncomingString)

for i = 0 to strlen
    print Mid (YourIncomingString, i, 1)

간단한 대답: 아니요. 문자열은 VBA의 개체가 아닙니다.미드 기능과 렌 기능을 사용하여 당시 캐릭터를 구분해야 할 것입니다.

사용자 지정 열거형 문자열을 직접 만들 수도 있습니다.

열거형 문자열은 다음과 같이 사용할 수 있습니다.

Dim es As EnumerableString
Set es = New EnumerableString
es.Value = ActiveCell.Value
Dim ch As Variant
For Each ch In es
    ActiveCell.Offset(1, 0).Activate
    ActiveCell.Value = ch
Next ch

이 코드를 이름이 있는 파일에 저장합니다.EnumerableString.clsVBA 프로젝트에서 수입합니다.

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = "EnumerableString"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit

Private m_characters As Collection

Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Attribute NewEnum.VB_MemberFlags = "40"
    Set NewEnum = m_characters.[_NewEnum]
End Property

Public Property Let Value(ByVal newValue As String)
    Dim pos As Integer
    Set m_characters = New Collection
    For pos = 1 To Len(newValue)
        m_characters.Add Mid$(newValue, pos, 1)
    Next pos
End Property

Public Function Length() As Long
    Length = m_characters.Count
End Function

Public Function Item(ByVal index As Variant) As String
Attribute Item.VB_UserMemId = 0
    Item = m_characters(index)
End Function

Private Sub Class_Initialize()
    Set m_characters = New Collection
End Sub

ASCII, ANSI 및 Unicode UTF-8 문자의 경우 Excel이 생성됩니다.

enter image description here

언급URL : https://stackoverflow.com/questions/30194208/is-a-string-an-array-in-vba-that-can-be-iterated-through

반응형