문자열은 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이 생성됩니다.
언급URL : https://stackoverflow.com/questions/30194208/is-a-string-an-array-in-vba-that-can-be-iterated-through
'programing' 카테고리의 다른 글
| 판다 그룹:줄 조합을 얻는 방법 (0) | 2023.10.22 |
|---|---|
| 각 루프별로 mysql 결과 집합 데이터에 액세스하는 방법 (0) | 2023.10.22 |
| 중첩된 키가 딕트에 존재하는지 확인하는 우아한 방법? (0) | 2023.10.17 |
| php로 ISO8601을 날짜 형식으로 변환하는 방법 (0) | 2023.10.17 |
| pyCharm이 파이썬을 가져오는 것을 숨기거나(개버리기) 중지하려면 어떻게 해야 합니까? (0) | 2023.10.17 |
