2017-01-23 89 views
1

如果Excel中的兩個單元格使用基於Excel的公式包含相同的字符(可能以任意順序),則需要進行比較。如何比較兩個單元在Excel中的順序是否相同?

例如,如果:

A1= Japan;US 

A2= US;Japan 

- 編輯 -

又如,

C1= abcefg 

    C2= efgabc 

在這兩種情況下,當我檢查是否A1 = A2或C1 = C2,它應該給我TRUE,因爲這兩個單元格中的所有字符都是完全相同的,儘管順序不同。

Ps - 這些單元格可以具有任何字符長度。

+0

這是這種情況嗎?你有不同的國家,中間有一個';'? –

+0

嗨,, 不,這並非總是如此。這只是一個例子,單元格可以具有任何價值而沒有固定模式。 – Ckn

+0

如果你在單元格中有其他角色,你怎麼知道你想'日本;美國'或其他方式呢? – KyloRen

回答

1

我不認爲有一個函數可以解答你的問題。

我做了一個小腳本,將比較兩個單元格,測試它,把你的值在Range("A1")Range("A2")。因爲你只比較兩個值,所以這樣循環將具有非常小的性能影響。

Sub d() 
    Dim ValueOne As String 
    Dim ValueTwo As String 
    Dim charVal 
    Dim sString 
    Dim char 
    Dim boolVal As Boolean 


     ValueOne = Cells(1, 1).Value 
     ValueTwo = Cells(2, 1).Value 

     boolVal = True 

     If Len(ValueTwo) = Len(ValueOne) Then 
     charVal = StrConv(ValueOne, vbUnicode) 
     charVal = Left(charVal, Len(charVal) - 1) 
     sString = Split(charVal, Chr(0)) 
      For Each char In sString 
       If Len(ValueTwo) = Len(Replace(ValueTwo, char, "")) Or Len(Replace(ValueTwo, char, "")) <> Len(Replace(ValueOne, char, "")) Then 
        boolVal = False 
        GoTo nxt 
       End If 
      Next 
     charVal = StrConv(ValueTwo, vbUnicode) 
     charVal = Left(charVal, Len(charVal) - 1) 
     sString = Split(charVal, Chr(0)) 
      For Each char In sString 
       If Len(ValueOne) = Len(Replace(ValueOne, char, "")) Or Len(Replace(ValueTwo, char, "")) <> Len(Replace(ValueOne, char, "")) Then 
        boolVal = False 
        GoTo nxt 
       End If 
      Next 
     Else 
      boolVal = False 
     End If 
nxt: 
     If boolVal = False Then 
     MsgBox "Strings are different" 
     Else 
     MsgBox "Strings are the same" 
     End If 

End Sub 

另外,如果你想這是一個功能,你可以很容易地改變成一個剛剛做這個,

Function Compare(ValueOne As String, ValueTwo As String) 

    Dim charVal 
    Dim sString 
    Dim char 
    Dim boolVal As Boolean  

     ' Insert same code as above here 


      'End Insert same code as above here 
     If boolVal = False Then 
      Compare = True 
     Else 
      Compare = True 
     End If 
End Function 
+0

這工作太棒了!萬分感謝。 :-) – Ckn

+0

不好意思讓你失望,但你的回答是錯誤的。試試這兩個值'iivan'和'ivaan'。 – Vityata

+0

這是真的。但是你的代碼給他們是一樣的。 – Vityata

0

的想法是這樣的:我們採取了兩個字符串(在Sub Test ),我們將它們在CompareMe函數中進行比較。比較的想法是將它們轉換爲數組(StrToArray),然後對數組進行排序(BubbleSort)。最後,(Join(varStr1, "") = Join(varStr2, ""))的結果是問題的答案。

Option Explicit 

Public Sub Test() 

    Debug.Print CompareMe("Japan;US", "US;Japan") 
    Debug.Print CompareMe("abcefg", "efgabc") 
    Debug.Print CompareMe("abcefg", "e1fgabc") 
    Debug.Print CompareMe("vit", "vitt") 

End Sub 

Public Function CompareMe(str1 As String, str2 As String) As Boolean 

    Dim varStr1    As Variant 
    Dim varStr2    As Variant 

    ReDim varStr1(Len(str1)) 
    ReDim varStr2(Len(str2)) 

    varStr1 = StrToArray(str1) 
    varStr2 = StrToArray(str2) 

    Call BubbleSort(varStr1) 
    Call BubbleSort(varStr2) 

    CompareMe = (Join(varStr1, "") = Join(varStr2, "")) 

End Function 

Public Sub BubbleSort(ByRef list As Variant) 

    Dim First   As Long 
    Dim Last   As Long 
    Dim i    As Long 
    Dim j    As Long 
    Dim Temp   As String 

    First = LBound(list) 
    Last = UBound(list) 

    For i = First To Last - 1 
     For j = i + 1 To Last 
      If list(i) > list(j) Then 
       Temp = list(j) 
       list(j) = list(i) 
       list(i) = Temp 
      End If 
     Next j 
    Next i 

End Sub 

Public Function StrToArray(str As String) As Variant 

    Dim buff()  As String 
    Dim i   As Long 

    ReDim buff(Len(str) - 1) 

    For i = 1 To Len(str) 
     buff(i - 1) = Mid$(str, i, 1) 
    Next 

    StrToArray = buff 

End Function 
+0

非常感謝Vityata! – Ckn

相關問題