偶数と奇数の分離(Microsoft Excel)
Dimitrisは、列Aに一連の整数値を持っています。彼は、列Bに奇数値、列Cに偶数値を表示する方法を望んでいます。彼は、値がスペースのない連続したセルにあり、昇順で。ディミトリスは、この方法でデータを処理するためにマクロが必要かどうか疑問に思います。
簡単に言うと、実際、マクロに頼らずにこれを行うことができます。ただし、このタイプの処理を頻繁に実行する必要がある場合は、実際にマクロを使用する方が有益な場合があります。
まず、非マクロアプローチを見てみましょう。必要に応じて、列Aの値が奇数か偶数かを確認する簡単な数式を列BとCに記述し、列に適切な場合は値をコピーすることができます。たとえば、列Bに次のように含めることができます。
=IF(ISODD(A1),A1,"")
列Cで行う必要があるのは、ISODDをISEVENに置き換えることだけです。これらの数式をコピーすると、列Bには奇数の値のみが含まれ、列Cには偶数の値のみが含まれます。もちろん、問題は、結果がDimitrisが探しているものと一致しないことです。彼は、連続するセル(空白なし)の値を必要とし、昇順でそれらを必要とします。
確かに、目的の結果を取得するために追加の手順を実行できます。たとえば、結果を列BとCにコピーし、値を貼り付けて(数式が削除されるように)、結果を並べ替えることができます。これにより、作業に追加の手順が追加されます。
配列数式を使用するだけで、はるかに「クリーンな」結果を得る方法があります。値がセルA1:A100にあると仮定しましょう。セルB1:B100を選択した状態で、数式バーに次のように入力します。
=IFERROR(SMALL(IFERROR(INDEX($A$1:$A$100,SMALL( IF(MOD($A$1:$A$100,2)=1,ROW($A$1:$A$100)),ROW( $A1:$A$100))),""),ROW()),"")
これはすべて単一の式であることを忘れないでください。配列数式として設計されているため、Ctrl + Shift + Enterを入力して終了します。その結果、列Bの連続セルに、昇順で奇数の値が表示されます。偶数の値を列Cに入れるには、最初にB1:B100をC1:C100にコピーします。次に、範囲C1:C100を選択します。 F2を押して編集モードに入り、数式の途中の「= 1」を「= 0」に変更します。
ここでも、Ctrl + Shift + Enterを押して数式を終了します。
A1:A100の範囲に空白がある場合、または範囲にテキスト値がある場合、この式は正しく機能しないことに注意してください。空白が機能しない理由は、それらが公式に0として扱われ、0が偶数と見なされるため、列Cに表示されます。奇数値(列B)を決定する別の公式は、次の配列公式を使用することです。セルB1内:
=IFERROR(SMALL(IF(MOD($A$1:$A$100,2)>0,$A$1: $A$100,"x"),ROW()),"")
潜在的な「空白セル」の問題に対処するには、セルC1で次の配列数式を使用できます。
=IFERROR(SMALL(IF((MOD($A$1:$A$100,2)=0)*NOT( ISBLANK($A$1:$A$100)),$A$1:$A$100,"x"),ROW()),"")
結果を得るには、B1:C1を必要な数のセルにコピーします。
先ほど、マクロを使用して値を処理する方が有益な場合があることを説明しました。理由は単純です。重複する値を簡単に取り除くことができ(必要な場合)、空白とテキスト値を無視できます。このようなマクロを開発する方法はいくつもあります。処理するセルを選択し、それらのセルの右側にある2つの列をクリアしてから、それらの列にオッズと偶数を配置する必要があるアプローチを選択しました。
Sub OddsEvens() Dim rSource As Range Dim c As Range Dim sTemp As String Dim iVal As Integer Dim bGo As Boolean Dim sCols As String Dim vMsg As Variant Dim lOddCol As Long Dim iOddPtr As Integer Dim lEvenCol As Long Dim iEvenPtr As Integer Dim iOdds(999) As Integer Dim iEvens(999) As Integer Dim J As Integer Set rSource = Selection If rSource.Columns.Count = 1 Then lOddCol = rSource.Column + 1 lEvenCol = rSource.Column + 2 sCols = Chr(lOddCol + 64) & ":" sCols = sCols & Chr(lEvenCol + 64) sTemp = "The contents of columns " & sCols sTemp = sTemp & " will be deleted. Ok to proceed?" vMsg = MsgBox(sTemp, vbYesNo, "Odds and Evens") If vMsg = vbYes Then Application.ScreenUpdating = False Range(sCols).Clear iOddPtr = 0 iEvenPtr = 0 For Each c In rSource bGo = True ' Is the cell empty? If IsEmpty(c.Value) Then bGo = False ' Does the cell contain non-numeric value? If Not IsNumeric(c.Value) Then bGo = False If bGo Then iVal = c.Value If Int(iVal / 2) * 2 = iVal Then ' Even number ' Check to see if duplicate For J = 1 To iEvenPtr If iEvens(J) = iVal Then bGo = False Next J If bGo Then iEvenPtr = iEvenPtr + 1 iEvens(iEvenPtr) = iVal End If Else 'Odd number ' Check to see if duplicate For J = 1 To iOddPtr If iOdds(J) = iVal Then bGo = False Next J If bGo Then iOddPtr = iOddPtr + 1 iOdds(iOddPtr) = iVal End If End If End If Next c ' Stuff values into proper columns For J = 1 To iOddPtr Cells(rSource.Row + J - 1, lOddCol) = iOdds(J) Next J For J = 1 To iEvenPtr Cells(rSource.Row + J - 1, lEvenCol) = iEvens(J) Next J ' Sort values in Odd column sTemp = Chr(lOddCol + 64) & rSource.Row & ":" sTemp = sTemp & Chr(lOddCol + 64) & rSource.Row _ + iOddPtr - 1 Range(sTemp).Select Selection.Sort key1:=Range(Chr(lOddCol + 64) _ & rSource.Row), Order1:=xlAscending ' Sort values in Even column sTemp = Chr(lEvenCol + 64) & rSource.Row & ":" sTemp = sTemp & Chr(lEvenCol + 64) & rSource.Row _ + iEvenPtr - 1 Range(sTemp).Select Selection.Sort key1:=Range(Chr(lEvenCol + 64) _ & rSource.Row), Order1:=xlAscending rSource.Select Application.ScreenUpdating = True End If End If End Sub
マクロは、選択したセルの値を2つの配列(iEvensとiOdds)のいずれかに詰め込むことによって機能します。これは、マクロが値の重複を簡単にチェックできるようにするために行われます。セルが空でなく、数値が含まれていて、その数値が重複していない場合にのみ、値が適切な配列に追加されます。次に、値が2つの列に戻され、それらの値が並べ替えられます。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(6767)は、Microsoft Excel 2007、2010、2013、および2016に適用されます。