2016-09-28 26 views
0

英語、中国語、または英語と中国語の両方を含むセルを含む複数のExcelファイルを含むプロジェクトに取り組んでいます。Excelで英語のテキストを中国語から分離/フィルタする方法

私は完全に中国語の行を維持し、最初に置く必要があります。それから、漢字と英語の両方のラインが必要です。そして、それは英語でしかないものだけです。

私はコンテンツをそれに応じてマークするのに役立つ3つの機能に遭遇しましたが、期待通りに機能していないように見えます。理由を理解できません。

Function ExtractChn(txt As String) 
Dim i As Integer 
Dim ChnTxt As String 
For i = 1 To Len(txt) 
    If Asc(Mid(txt, i, 1)) < 0 Then 
     ChnTxt = ChnTxt & Mid(txt, i, 1) 
    End If 
Next i 
ExtractChn = ChnTxt 
End Function 

Function ExtractEng(txt As String) 
Dim i As Integer 
Dim EngTxt As String 
For i = 1 To Len(txt) 
    If Asc(Mid(txt, i, 1)) >= 0 Then 
     EngTxt = EngTxt & Mid(txt, i, 1) 
    End If 
Next i 
ExtractEng = EngTxt 
End Function 

Function CheckTxt(txt) 
Dim i As Integer 
Dim Eng As Integer 
Dim Chn As Integer 
Chn = 0 
Eng = 0 
For i = 1 To Len(txt) 
    If Asc(Mid(txt, i, 1)) > 0 Then 
     Eng = 1 
    Else: 
     Chn = 1 
    End If 
Next i 
If Chn = 1 And Eng = 1 Then 'Contains Both Eng & Chn 
    CheckTxt = "BOTH" 
Else: 
    If Chn = 1 And Eng = 0 Then 'Chn 
     CheckTxt = "CHN" 
    Else: 
     If Chn = 0 And Eng = 1 Then 'Eng 
      CheckTxt = "ENG" 
     End If 
    End If 
End If 
End Function 

それらの作成者は、機能の仕組みを示すファイルを提供することさえできます。作者の意図によると

Text|English part of it|Chinese part of it|ExtractEng|ExtractChn|CheckTxt 

CheckTxt結果はCHENG、またはBOTHのいずれかが表示されます:私は、次のように構成されているファイルへのリンクを添付しています。しかし、常に表示されているのはENGなので、私はその理由を理解できません。

どのようにすれば効果がありますか? Excelでコンテンツを「事前フィルタリング」する簡単な方法がないかぎり?どんな助けでも大歓迎です。

Test Excel file from the developer

+0

元の開発者は、システムが[DBCSコードページ](https://msdn.microsoftを使用することを期待することによって書かれたコード。 com/ja-us/library/windows/desktop/dd317794(v = vs.85).aspx)。これらのシステムでは、[Asc](https://msdn.microsoft.com/en-us/library/office/gg264313.aspx)は漢字に対して負の整数を返します。 –

答えて

1

これは正規表現のための仕事のように聞こえます!

enter image description here

Function getCharSet(Target As Range) As String 
    Const ChinesePattern = "[\u4E00-\u9FFF\u6300-\u77FF\u7800-\u8CFF\u8D00-\u9FFF]+" 
    Const EnglishPattern = "[A-Za-z]" 
    Dim results As String 
    Dim Data, v 
    Dim Regex1 As Object 
    Set Regex1 = CreateObject("VBScript.RegExp") 
    Regex1.Global = True 

    If Target.Count = 1 Then 
     Data = Array(Target.Value2) 
    Else 
     Data = Target.Value2 
    End If 

    For Each v In Data 

     If Not InStr(results, "CHN") Then 
      Regex1.Pattern = ChinesePattern 
      If Regex1.Test(v) Then 
       If Len(results) Then 
        getCharSet = "CHN" & " - " & results 
        Exit Function 
       Else 
        results = "CHN" 
       End If 
      End If 
     End If 

     If Not InStr(results, "ENG") Then 
      Regex1.Pattern = EnglishPattern 
      If Regex1.Test(v) Then 
       If Len(results) Then 
        getCharSet = results & " - ENG" 
        Exit Function 
       Else 
        results = "ENG" 
       End If 
      End If 
     End If 
    Next 
    getCharSet = results 

End Function 
1

基本的なアプローチ:

Sub Main() 

Dim sh As Worksheet 
Set sh = ActiveSheet 

Dim rng As Range 
Set rng = sh.Range("A6:D10") 

Call Separate_English_Chinese(rng) 

End Sub 

Sub Separate_English_Chinese(rng) 

Dim sh As Worksheet 
Set sh = rng.Parent 

Dim EnglishCharacters As String 
Dim colEng As Long, colChn As Long, colContains As Long 
Dim a As String, i As Long, k As Long 
Dim colFullText As Long, txtEnglish As String, txtChinese As String 
Dim Result As Long, Contains As String 
Dim First As Long, Last As Long 

First = rng.Row 
Last = rng.Rows.Count + rng.Row - 1 

EnglishCharacters = "qwertyuiopasdfghjklzxcvbnm" 

EnglishCharacters = UCase(EnglishCharacters) & LCase(EnglishCharacters) 

colFullText = 1 
colEng = 2 
colChn = 3 
colContains = 4 

For i = First To Last 

    a = sh.Cells(i, colFullText).Value 

    txtEnglish = "" 
    txtChinese = "" 

    For k = 1 To Len(a) 

     If InStr(EnglishCharacters, Mid(a, k, 1)) Then 
      txtEnglish = txtEnglish & Mid(a, k, 1) 
     Else 
      txtChinese = txtChinese & Mid(a, k, 1) 
     End If 

    Next 

    sh.Cells(i, colEng).Value = txtEnglish 
    sh.Cells(i, colChn).Value = txtChinese 

    Result = 0 
    If txtEnglish <> "" Then Result = Result + 1 
    If txtChinese <> "" Then Result = Result + 10 

    Select Case Result 

     Case 1 
     Contains = "ENG" 
     Case 10 
     Contains = "CHN" 
     Case 11 
     Contains = "BOTH" 
     Case Else 
     Contains = "" 

    End Select 

    sh.Cells(i, colContains).Value = Contains 

Next 

End Sub