2011-12-15 22 views
0

複数のレコードをマージし、各列の最高値のみを表示する方法はありますか?例:A2:A25 =名前、B2 =等級1、C2 =等級2 ...等。 最初に正確な重複がある場合に重複を削除しました。それから私は名前を並べ替えます。 列Aの名前に基づいてこのコードに何かを追加して、各列の最高値で各名前を一度表示できますか? IF(B2 = "Low"、 "Low"、 "Low"、 "Low"、 "Low"、 "Low"、 "Low" 「))))複数のレコードに対して単一の値を返します

データ例

A1:name B1:Grade1 C1:Grade2...etc 
A2:Joe B2:High C3:Low 
A3:Joe B3:Med C3:High 
A4:Dan B4:Low C4:Med 
A5:Dan B5:Low C5:Low 

_ _results:ジョーグレード1 =高Grade2 =高、ダン:グレード1 =低Grade2 =メッド

+0

あなたはexcel-vbaでタグ付けしますが、セルに入れる数式を例に挙げます。マクロや数式が必要ですか? – jswolf19

+0

この結果はどこに表示したいですか?いくつの列がそこにありますか? 3つの成績のみ(高、低、中)ですか?あなたはVBAソリューションで大丈夫ですか? – Ian

答えて

0

記録エクセルマクロ。最初の列を選択します。詳細なフィルタをクリックします。場所へのコピーを選択し、Xと言う新しい列を選択します。一意のフィルタを有効にします。 OKをクリックします。次に、vbaソースを見て、コード内で一意の要素を取得するようにします。今度はLowを0、Medを1、Highを2とします。行をループし、列Xの各要素に対応する最大グレード1、最大グレード2などを見つけ、列Y、Zなどに値を設定します。これで、必要なデータがX、Y、Z列に表示されます。それらを繰り返しループし、必要なフォーマットで表示します。

0

このVBAコードを試してみることにしました。それは少し優雅だが、仕事を終わらせる。

ショートカットをとり、文字列ではなくbとcの列を作成しました。スプレッドシートでルックアップ機能を使用してその変換を行うか、コードに余分なチェックを追加することができます。

Sub find_high_values() 
' subroutine to find max values of columns b and c against names 
' assumes for simplicity that there are no more than 10 rows 
' assumes values being checked to be numbers, if they are strings, additional loops would need to be done 
Dim sName(10) As String, lBval(10) As Long, lCval(10) As Long 'arrays for original list 
Dim iCountN As Integer, iUnique As Integer, iUniqueCount As Integer 'counters 
Dim bUnique As Boolean 
Dim rStart As Range, rOutput As Range 'ranges on worksheet 
Dim lBmax(10) As Long, lCmax(10) As Long, sUniqueName(10) As String 'output arrays 

Set rStart = ActiveSheet.Range("d6") 'Cell immediately above the first name in list 
Set rOutput = ActiveSheet.Range("j6") 'cell reference for max value list 
iUniqueCount = 1 
For iCountN = 1 To 10 'set max counters to a min value 
    lBmax(iCountN) = 0 
    lCmax(iCountN) = 0 
Next 

For iCountN = 1 To 10 'step through each original row 
    sName(iCountN) = rStart.Offset(iCountN, 0).Value 
    lBval(iCountN) = rStart.Offset(iCountN, 1).Value 
    lCval(iCountN) = rStart.Offset(iCountN, 2).Value 
    bUnique = True 'Starter value, assume the name to be unique, changes to false if already in list 
    For iUnique = 1 To iCountN 'loop to check if it is a new name 
     If sUniqueName(iUnique) = sName(iCountN) Then bUnique = False 
    Next 
    If bUnique Then 'if new name, add to list of names 
     sUniqueName(iUniqueCount) = sName(iCountN) 
     iUniqueCount = iUniqueCount + 1 
    End If 
Next 
iUniqueCount = iUniqueCount - 1 'make the count back to total number of names found 
For iUnique = 1 To iUniqueCount 'loop through names 
    For iCountN = 1 To 10 'loop through all values 
     If sName(iCountN) = sUniqueName(iUnique) Then 
      If lBval(iCountN) > lBmax(iUnique) Then lBmax(iUnique) = lBval(iCountN) 
      If lCval(iCountN) > lCmax(iUnique) Then lCmax(iUnique) = lCval(iCountN) 
     End If 
    Next 
Next 

'output section 
rStart.Resize(1, 3).Select 
Selection.Copy 
rOutput.PasteSpecial xlPasteValues 

For iUnique = 1 To iUniqueCount 
    rOutput.Offset(iUnique, 0).Value = sUniqueName(iUnique) 
    rOutput.Offset(iUnique, 1).Value = lBmax(iUnique) 
    rOutput.Offset(iUnique, 2).Value = lCmax(iUnique) 
Next 

End Sub 
関連する問題