2017-02-07 4 views
1

Ich habe meine erste VBA-Sub geschrieben, und es ist Art der Arbeit, wie es soll, aber ich kann nicht herausfinden, der Teil, der falsch ist. Es soll selektiv Doppelbyte-Leerzeichen, Buchstaben, Zahlen und Interpunktion in Einzelbyte konvertieren, wenn eine Zeichenfolge aus japanischen und lateinischen Doppelbyte-Zeichen und -Zeichen besteht.VBA selektive Umwandlung von Double-Byte in Single-bye Zeichen

In this picture, the top row represents the input and the bottom row the desired output of spaces, letters, numbers, and punctuation converted to single-byte while the Japanese characters remain intact.

However, this is what is happening when I run the sub. Clearly it's working, but also something is off with my concatenation.

Der folgende Code ist und funktioniert basierend auf „Fang und Umwandeln“ den Bereich der UTF-16-Codes, die zu den problematischen Zeichen mit voller Breite entsprechen. Es funktioniert nur auf lokalisierten Maschinen (d. H. Wenn Sprache/Region auf Japan eingestellt ist), aber ich glaube nicht, dass das Problem mit meinem Code mit lokalisierten Funktionen zu tun hat. Jede Hilfe bei dem, was ich falsch mache, wäre sehr, sehr geschätzt!

Public Sub Converter() 
    Dim objRange As Range 
     For Each objRange In ActiveSheet.UsedRange 
     Call Alphanumeric(objRange) 
    Next 
End Sub 

Private Sub Alphanumeric(ByRef objRange As Range) 
    Dim strIn As String 
    Dim strOut As String 
    Dim strAlphanumeric As String 
    Dim i As Integer 

    If objRange.HasFormula Or _ 
     VarType(objRange.Value) <> vbString Then 
     Exit Sub 
    End If 

    strIn = objRange.Value 
    strOut = "" 
    strAlphanumeric = "" 

    For i = 1 To Len(strIn) 
     If AscW(Mid(strIn, i, 2)) + 65536 >= 65280 And _ 
      AscW(Mid(strIn, i, 2)) + 65536 <= 65370 Then 
      strAlphanumeric = strAlphanumeric & Mid(strIn, i, 1) 
     Else 
      If strAlphanumeric <> "" Then 
       strOut = strOut & StrConv(strIn, vbNarrow) 
       strAlphanumeric = "" 
      End If 
      strOut = strOut & Mid(strIn, i, 1) 
     End If 
    Next 

    objRange.Value = strOut 

End Sub 

Antwort

0

Ich vermute, dass die Linie

strOut = strOut & StrConv(strIn, vbNarrow)

in meinen Augen sein sollte

strOut = strOut & StrConv(strAlphanumeric, vbNarrow) 
+1

Ja !! Das hat es getan. Ich danke dir sehr. – mixadelic