• 締切済み

数値比較と並べ替え

エクセルシート(またはカンマ区切りのCSVテキスト)のA~Dに名前1列と数値3列が入っています。 これとは別にE~Gに比較対象データが3列あります。 3列で1セットで、BとE、CとF、DとGがそれぞれ対応しています。 E~Gの値をB~Dの値とそれぞれ比較して、最も近いセットを探し出し、(A~DとE~Gを)同行に並べ替える必要があります。DとEの間は空いていてもかまいません。 またこれとは別に、E~G列列の比較対象値セットがB~D列のどのセットにも適合しない(しきい値を超えた)場合は一番下の行以下に順に配列する必要があります。 すべての数値は -5000.000~5000.000 (最大)で、しきい値は1にしたいと思っています。 データ数は最大で150行程度です。ただしAからDまでのデータセットと、EからGまでのデータセットが同じ行数とは限りません。 簡単にいえば、B±1かつ、C±1、D±1の範囲にあるデータセットを探して並び替えたいと言うことです。 私が今考えているのは、BとE、CとF、DとGの各値はほとんど一緒なのでまず差分を求めて一番差が少ないセットの組み合わせを求めればこれら機能を実現できそうな気がします。 ただ、これを実現するためのスクリプトが、良くわかりません。 最も簡単に書けそうなのはVBAでしょうか、JAVAでしょうか。そういったマクロを作れそうな参考サイトなど何でもいいので、ご教授いただけると幸いです。

みんなの回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

細かな条件がいまいち良く判らなかったので、適当に処理をしていますが、こういう事でしょうか? Excel VBAで作ってあります(2010で動作確認)。 Sub Sample()   Dim nDataTotal, nTargetTotal, i, j, k   Dim nTraget   Dim nTargetRow()   Dim nWorkRow, nTargetABS, nNGRow   Dim nWorkAbs As Double      nDataTotal = Range("A1").End(xlDown).Row - 1  '名前のあるデータ数   nTargetTotal = Range("E1").End(xlDown).Row - 1 '比較対象データ数   ReDim nTargetRow(nTargetTotal)         '比較対象データ並び替え位置      '比較処理   For i = 1 To nDataTotal     nWorkRow = 0     nTargetABS = 999     nWorkAbs = 0     For j = 1 To nTargetTotal       nWorkAbs = 0       For k = 1 To 3         'しきち値オーバをチェック         If Abs(Cells(i + 1, 1 + k) - Cells(j + 1, 4 + k)) > 1 Then           nWorkAbs = 999           Exit For         End If         '3データ分の差分絶対値合計         nWorkAbs = nWorkAbs + Abs(Cells(i + 1, 1 + k) - Cells(j + 1, 4 + k))       Next k       '3データ分の差分絶対値合計が一番小さい行を探す       If nTargetABS > nWorkAbs Then         nWorkRow = j         nTargetABS = nWorkAbs       End If     Next j     '行が特定されている場合、配列に記録     If nWorkRow > 0 Then       nTargetRow(nWorkRow) = i     End If   Next i      '表示処理   nTarget = Range(Cells(2, 5), Cells(nTargetTotal + 1, 7)).Value   Range(Cells(2, 5), Cells(nTargetTotal + 1, 7)).ClearContents   nNGRow = nDataTotal + 1 'しきい値をこえたデータはこの位置から   For j = 1 To nTargetTotal     nRow = nTargetRow(j)     If IsEmpty(nRow) Then       nRow = nNGRow       nNGRow = nNGRow + 1     End If     For k = 1 To 3       Cells(nRow + 1, 4 + k) = nTarget(j, k)     Next k   Next j End Sub

関連するQ&A