2017-01-30 2 views
0

2つの文字列を比較し、元の条件との一致に応じてそれらの文字列を比較するコードがあります。コードではシーケンスを無視する必要があります。たとえば、A1には単語「Jon Smith」(元の値)が含まれ、B1には「Smith Jon」という同じランクが含まれています。しかし、C1に「Jon Smith Junior」が含まれている場合は、「Jon Smith」または「Smith Jon」よりも低いランクにする必要があります。シーケンスに関係なくセル内の文字列を比較します。

いずれかお手伝いできますか?

+0

列Bは含まれています。 Microsoftには1つあります。 –

+0

非常に便利な知っている、あなたに感謝@ScottCraner –

答えて

0

StackOverflowはコーディングサービスではなく、コードを提供する必要がありますが、この場合は私はそのタスクに興味がありました。これは可能な解決策です。 checkmeを実行します。単純に2つの文字列を配列に分割します。次に、arrOneの値がarrTwoに何回あるかを数えます。この情報によって、何らかの結果が得られます。

Option Explicit 

Public Function CompareTwo(strOne As String, strTwo As String) As Double 

    Dim arrOne  As Variant 
    Dim arrTwo  As Variant 
    Dim varOne  As Variant 
    Dim varTwo  As Variant 

    Dim lngCounter As Long 

    arrOne = Split(strOne) 
    arrTwo = Split(strTwo) 

    For Each varOne In arrOne 
     For Each varTwo In arrTwo 
      If varOne = varTwo Then 
       lngCounter = lngCounter + 1 
      End If 
     Next varTwo 
    Next varOne 

    CompareTwo = lngCounter/(UBound(arrOne) + 1) 

End Function 

Public Sub CheckMe() 

    Debug.Print CompareTwo("Smith Jon", "Jon Smith") 
    Debug.Print CompareTwo("Jon Smith Junior", "Jon Smith") 
    Debug.Print CompareTwo("Jon Smith Junior Ale 6", "Jon Smith Ale 6") 

End Sub 
+0

これは素晴らしいVityata、多くの感謝です!私はちょうど始まり、どこから始めるべきか分からなかった。私の問題は実際これより少し深いです。たとえば、提案されたコードで.Dictionaryを使用する方法が必要です。したがって、例えば "Jon Smith II" = "Jon Smith Second" = 1です。追加のレイヤーを追加して "II" = "second"を比較する方法はありますか? –

+0

'II'と' Second'の場合、それを作る簡単な方法は、両方の配列に 'II'を' Second'で置き換えることです。この機能を見てください - https://msdn.microsoft.com/en-us/library/bt3szac5(v=vs.90).aspx – Vityata

+0

ありがとう@Vityata。私は単純な置き換えを使うことができますが、問題はこれが異なる名前のために異なるということです。だから私は名前のリストにこれをループすると、 "ジュニア"のように "Third"または "Jnr"という名前の "III"が見つからないでしょう。私はvarTwoを何らかの形で柔軟にする必要があるので、文字列を事前にマップされた名前のリストに "一致"させます。 –

0

私はこれを思いついた。これは、2つの配列を作成します.1つは、B列の指定されたセル内に2つのキー名があり、もう1つはarr1の各配列要素に含まれる単語の数です。次に、2つの配列をSort2 Subに送ります。これはメンバーGary's Studentによって書かれたもので、hereです。複数の選択肢名は列 "B"にあり、 "Jon"と "Smith"はハードコードされていると想定されていますが、コードを少し変更して別の列から引き出すことができます。多くのがありますが、あなたが「あいまい参照は、」アドインたい ジョン・スミス スミスジョン・ジュニア スミスジョン

Sub create2arr() 
Dim myArr() As Variant, name1 As String, name2 As String, firstMarker As Boolean, myArrayCounter As Long, myArray2Counter As Long 
Dim splitArr() As String, wordCountArr() As Variant 

name1 = "Jon" 
name2 = "Smith" 
ReDim myArr(1 To 1) 
ReDim myArr2(1 To 1) 
ReDim wordCountArr(1 To 1) 

myArrayCounter = 1 
myArray2Counter = 1 

For I = 1 To 3 
    splitArr = Split(Sheet6.Range("B" & I)) 
    For J = LBound(splitArr) To UBound(splitArr) 
     If UCase(splitArr(J)) = UCase(name1) Or UCase(splitArr(J)) = UCase(name2) Then 
       If firstMarker = True Then 
        myArr(myArrayCounter) = Sheet6.Range("B" & I) 
        wordCountArr(myArrayCounter) = UBound(splitArr) + 1 
        myArrayCounter = myArrayCounter + 1 
        ReDim Preserve myArr(1 To myArrayCounter) 
        ReDim Preserve wordCountArr(1 To myArrayCounter) 
        firstMarker = False 
       Else 
        firstMarker = True 
       End If 
     End If 
    Next J 
Next I 

For I = 1 To UBound(myArr) 
Debug.Print myArr(I) 
Next I 

Call sort2(wordCountArr, myArr) 

For I = 1 To UBound(myArr) 
Debug.Print myArr(I) 
Next I 


End Sub 

Sub sort2(key() As Variant, other() As Variant) 
Dim I As Long, J As Long, Low As Long 
Dim Hi As Long, Temp As Variant 
    Low = LBound(key) 
    Hi = UBound(key) 

    J = (Hi - Low + 1) \ 2 
    Do While J > 0 
     For I = Low To Hi - J 
      If key(I) > key(I + J) Then 
      Temp = key(I) 
      key(I) = key(I + J) 
      key(I + J) = Temp 
      Temp = other(I) 
      other(I) = other(I + J) 
      other(I + J) = Temp 
      End If 
     Next I 
     For I = Hi - J To Low Step -1 
      If key(I) > key(I + J) Then 
      Temp = key(I) 
      key(I) = key(I + J) 
      key(I + J) = Temp 
      Temp = other(I) 
      other(I) = other(I + J) 
      other(I + J) = Temp 
      End If 
     Next I 
     J = J \ 2 
    Loop 
End Sub