Szukaj…


Wprowadzenie

VBA może odczytywać i zapisywać ciągi znaków w dowolnym języku lub skrypcie przy użyciu Unicode . Istnieją jednak surowsze zasady dotyczące tokenów identyfikacyjnych .

Tekst niełaciński w kodzie VBA

W komórce arkusza kalkulacyjnego A1 mamy następujący arabski pangram:

صِف خَلقَ خَودِ كَمِثلِ الشَمسِ إِذ بَزَغَت - يَحظى الضَجيعُ بِها نَجلاءَ مِعطارِ

VBA zapewnia funkcje AscW i ChrW do pracy z wielobajtowymi kodami znaków. Możemy również użyć tablic Byte do bezpośredniej manipulacji zmienną łańcuchową:

Sub NonLatinStrings()

Dim rng As Range
Set rng = Range("A1")
Do Until rng = ""
    Dim MyString As String
    MyString = rng.Value
    
    ' AscW functions
    Dim char As String
    char = AscW(Left(MyString, 1))
    Debug.Print "First char (ChrW): " & char
    Debug.Print "First char (binary): " & BinaryFormat(char, 12)
    
    ' ChrW functions
    Dim uString As String
    uString = ChrW(char)
    Debug.Print "String value (text): " & uString        ' Fails! Appears as '?'
    Debug.Print "String value (AscW): " & AscW(uString)
    
    ' Using a Byte string
    Dim StringAsByt() As Byte
    StringAsByt = MyString
    Dim i As Long
    For i = 0 To 1 Step 2
        Debug.Print "Byte values (in decimal): " & _
            StringAsByt(i) & "|" & StringAsByt(i + 1)
        Debug.Print "Byte values (binary): " & _
            BinaryFormat(StringAsByt(i)) & "|" & BinaryFormat(StringAsByt(i + 1))
    Next i
    Debug.Print ""

    ' Printing the entire string to the immediate window fails (all '?'s)
    Debug.Print "Whole String" & vbNewLine & rng.Value
    Set rng = rng.Offset(1)
Loop

End Sub

Daje to następujący wynik dla arabskiej litery Sad :

Pierwszy znak (ChrW): 1589
Pierwszy znak (binarny): 00011000110101
Wartość ciągu (tekst):?
Wartość ciągu (AscW): 1589
Wartości bajtów (dziesiętnie): 53 | 6
Wartości bajtów (binarne): 00110101 | 00000110

Cały ciąg
??? ????? ????? ??????? ??????? ??? ??????? - ????? ???????? ???? ??????? ???????

Zauważ, że VBA nie może wydrukować tekstu niełacińskiego w bezpośrednim oknie, nawet jeśli funkcje łańcucha działają poprawnie. Jest to ograniczenie IDE, a nie języka.

Identyfikatory inne niż łacińskie i zakres językowy

Identyfikatory VBA (nazwy zmiennych i funkcji) mogą korzystać ze skryptu łacińskiego, a także mogą korzystać ze skryptów japońskiego , koreańskiego , chińskiego uproszczonego i tradycyjnego chińskiego .

Rozszerzony skrypt łaciński ma pełne pokrycie dla wielu języków:
Angielski, francuski, hiszpański, niemiecki, włoski, bretoński, kataloński, duński, estoński, fiński, islandzki, indonezyjski, irlandzki, Lojban, Mapudungun, norweski, portugalski, szkocki gaelicki, szwedzki, tagalog

Niektóre języki są tylko częściowo objęte:
Azerski, chorwacki, czeski, esperanto, węgierski, łotewski, litewski, polski, rumuński, serbski, słowacki, słoweński, turecki, joruba, walijski

Niektóre języki mają niewielki zasięg lub nie mają go wcale:
Arabski, bułgarski, czirokański, dzongkha, grecki, hindi, macedoński, malajalam, mongolski, rosyjski, sanskryt, tajski, tybetański, urdu, ujgurski

Wszystkie poniższe deklaracje zmiennych są prawidłowe:

Dim Yec’hed As String 'Breton
Dim «Dóna» As String 'Catalan
Dim fræk As String 'Danish
Dim tšellomängija As String 'Estonian
Dim Törkylempijävongahdus As String 'Finnish
Dim j’examine As String 'French
Dim Paß As String 'German
Dim þjófum As String 'Icelandic
Dim hÓighe As String 'Irish
Dim sofybakni As String 'Lojban (.o’i does not work)
Dim ñizol As String 'Mapudungun
Dim Vår As String 'Norwegian
Dim «brações» As String 'Portuguese
Dim d’fhàg As String 'Scottish Gaelic

Zauważ, że w VBA IDE pojedynczy apostrof w nazwie zmiennej nie zamienia wiersza w komentarz (podobnie jak w przypadku przepełnienia stosu).

Również języki, które używają dwóch kątów do oznaczenia cudzysłowu «», mogą używać tych w nazwach zmiennych, pomijając fakt, że cytaty typu "" nie są.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow