2016-04-28 1 views
-1

私は毎日無制限の新しいデータ行を処理していますが、その順序にかかわらず同様の行の値を見つけるUDFが必要です。下の例でわかるように、A9:F9A4:F4は、同様の行の値がと同じ行の値であり、同様の行1とマークされています。行内のデータ全体を見て、同じ値であるが同じ順序でないことを確認する必要があります。誰かが私を助けてくれればとても感謝します。私は今、ウェブ全体でこれを探しています。ExcelでVBAを使用してUDFを作成すると、順序が重要でない行で同様の値が見つかる

式例:

=Similarity(Range Of Data from A:F, Row Of Data) 

私のシートは、画像の下のようになります。ここでは

+6

へようこそ下記のコードを入力して試してください。これは無料のコード作成サービスではありません。しかし、私たちは、同僚のプログラマー(および志望者)を**その**コードで支援することを熱望しています。 [良い質問をするにはどうすればいいですか?](http://stackoverflow.com/help/how-to-ask)のヘルプトピック、および[最小限の、完全で検証可能な例](http ://stackoverflow.com/help/mcve)。その後、達成したいタスクを完了するために、これまでに書いたVBAコードで質問を更新してください。 – Ralph

答えて

1

pls。 SO

Sub test() 
    Dim data() As String 
    Dim i As Long 
    Dim dd As Long 
    Dim lastrow As Variant 
    Dim lastcolumn As Variant 
    Dim status As Boolean 
    lastrow = Range("A" & Rows.Count).End(xlUp).Row 
    lastcolumn = Cells(2, Columns.Count).End(xlToLeft).Column 
    ReDim data(lastrow - 1, lastcolumn) 
    For i = 2 To lastrow 
     For j = 1 To lastcolumn 
      data(i - 1, j) = Cells(i, j) 
     Next j 
    Next i 
    For i = 1 To lastrow - 1 
     Call similarity(data(), i) 
    Next i 
End Sub 


Public Function similarity(rdata() As String, currrow As Long) 
    lastrow = UBound(rdata) 
    matchcount = 0 
    lastcolumn = UBound(rdata, 2) 
    For Z = currrow To lastrow - 1 
     ReDim test(lastcolumn) As String 
     ReDim test1(lastcolumn) As String 
     For i = 1 To lastcolumn 
      test(i) = rdata(currrow, i) 
      test1(i) = rdata(Z + 1, i) 
     Next i 
     Call sort(test()) 
     Call sort(test1()) 
     For i = 1 To lastcolumn 
      If test(i) = test1(i) Then 
       matchcount = matchcount + 1 
      End If 
     Next i 
     If matchcount = lastcolumn Then 
      If Cells(currrow + 1, lastcolumn + 1).Value <> "" Then 
       Cells(currrow + 1, lastcolumn + 1).Value = Cells(currrow + 1, lastcolumn + 1).Value & "|" & "Match with " & Z + 2 
      Else 
       Cells(currrow + 1, lastcolumn + 1).Value = "Match with " & Z + 2 
      End If 
      If Cells(Z + 2, lastcolumn + 1).Value <> "" Then 
       Cells(Z + 2, lastcolumn + 1).Value = Cells(Z + 2, lastcolumn + 1).Value & "|" & "Match with " & currrow + 1 
      Else 
       Cells(Z + 2, lastcolumn + 1).Value = "Match with " & currrow + 1 
      End If 
     End If 
     matchcount = 0 
    Next Z 
End Function 

Sub sort(list() As String) 
    Dim First As Integer, Last As Long 
    Dim i As Long, 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 

enter image description here

+0

あなたのコードは非常に有望ですが、私はそれが好きですが、私はそれが働くようには思わない。 –

+0

なぜですか?どうしたの? –

+0

モジュール内にコード全体を貼り付け、udfを適用しました。私はおそらくあなたが何かを見逃している必要がありますExcel 2007を使用しています。 –

1

がスタートです。どの行が他の行のpermutationsであるかを見つけるのに役立ちます。我々が開始すると言う:

enter image description here

このUDFは()は、セルのセットの内容がかかります。データをソートする。データを連結する。

Public Function SortRow(rng As Range) As String 
    ReDim ary(1 To rng.Count) As Variant 
    Dim CH As String, i As Long 
    CH = Chr(2) 
    For i = 1 To 6 
     ary(i) = rng(i) 
    Next i 
    Call aSort(ary) 
    SortRow = Join(ary, CH) 
End Function 

Public Sub aSort(ByRef InOut) 

    Dim i As Long, J As Long, Low As Long 
    Dim Hi As Long, Temp As Variant 

    Low = LBound(InOut) 
    Hi = UBound(InOut) 

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

ので G1 で、我々は次のように入力します:と1つの文字列として結果を返す

=SortRow(A1:F1) 

ダウンコピーし、H1に入力します。

=IF(COUNTIF($G$1:$G$7,G1)=1,"unique combination","duplicates") 

をしてコピーしますダウン:

enter image description here

これは、2行目と6行目が重複しているデータの順序が異なることを示しています。

これを開始すると、目標を達成するのに役立ちます。

関連する問題