- 締切済み
数値比較と並べ替え
エクセルシート(またはカンマ区切りの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でしょうか。そういったマクロを作れそうな参考サイトなど何でもいいので、ご教授いただけると幸いです。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- mt2008
- ベストアンサー率52% (885/1701)
細かな条件がいまいち良く判らなかったので、適当に処理をしていますが、こういう事でしょうか? 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