Jonny
Jonny

Reputation: 619

Excel: How to split a column into two columns based off a third, odd/even parameter column?

I will be referencing the below picture: enter image description here

I seek to split up the FirstValue Column into the two columns right of it; however, I want to split the columns based off the Parameter column. When the Parameter value is odd, I want to copy the values only to the OtherValue1 column. When the Parameter value is even, I want to copy the values only to the OtherValue2 column. After reading forums and trying excel's "Text to Columns" feature, I am unable to find a solution.

Is there a way implement this using VBA?

*Note: The worksheet is actually about 10,000 rows long, so speed would also be helpful.

EDIT: Here is the code I have so far. I am getting Object errors in this line of code: .Cells(2, MF1Col).Formula = "=IF(MOD(paraformula,2)=1,WTRfor,"")"

    Dim rw As Worksheet
Dim secondCell, MF1Cell, MF2Cell, paraCell, MF1formula, MF2formula, paraformula, WTRfor As Range
Dim secondCol As Long, MF1Col As Long, MF2Col As Long, paraCol As Long
 Set rw = ActiveSheet

With rw

    Set secondCell = .Rows(1).Find("FirstValue”)

    ' Check if the column with “FirstValue” is found

    'Insert Two Columns after FirstValue
    If Not secondCell Is Nothing Then
        secondCol = secondCell.Column
        .Columns(secondCol + 1).EntireColumn.Insert
        .Columns(secondCol + 2).EntireColumn.Insert
        .Cells(1, secondCol + 1).Value = "OtherValue1"
        .Cells(1, secondCol + 2).Value = "OtherValue2"
        .Activate

    Set MF1Cell = .Rows(1).Find("OtherValue1")
    MF1Col = MF1Cell.Column
    Set MF2Cell = .Rows(1).Find("OtherValue2")
    MF2Col = MF2Cell.Column
    Set paraCell = .Rows(1).Find("Parameter")
    paraCol = paraCell.Column

    Set paraformula = Range(.Cells(2, paraCol).Address(RowAbsolute:=False, ColumnAbsolute:=False))
    Set MF1formula = Range(.Cells(2, MF1Col).Address(RowAbsolute:=False, ColumnAbsolute:=False))
    Set WTRfor = Range(.Cells(2, secondCol).Address(RowAbsolute:=False, ColumnAbsolute:=False))
    .Cells(2, MF1Col).Formula = "=IF(MOD(" & paraformula & ",2)=1," & WTRfor & ","""")"
    Range(.Cells(2, MF1Col).Address).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    ActiveSheet.Paste

    Set MF2formula = Range(.Cells(2, MF2Col).Address(RowAbsolute:=False, ColumnAbsolute:=False))
    .Cells(2, MF2Col).Formula = "=IF(MOD(" & paraformula & ",2)=0," & WTRfor & ","""")"
    Range(.Cells(2, MF2Col).Address).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    ActiveSheet.Paste   

End If
End With

Upvotes: 0

Views: 2064

Answers (3)

martijn
martijn

Reputation: 1

VBA:

Sub odd_even()

a = 1                                                           ' start row
b = 10                                                          ' end row
c = 1                                                           ' column with values inputs

For d = a To b                                                  ' FOR loop from start row to end row

    If ActiveSheet.Cells(d, c) Mod 2 Then                       'mod becomes high when value is odd
        ActiveSheet.Cells(d, c + 2) = ActiveSheet.Cells(d, c)   'odd value gets copied to the odd-column   ( two to the right of the values)
        ActiveSheet.Cells(d, c + 3) = ""                        'same row on even-column gets cleared
    Else:
        ActiveSheet.Cells(d, c + 3) = ActiveSheet.Cells(d, c)   'even value gets copied to the even-column ( three to the right of the values)
        ActiveSheet.Cells(d, c + 2) = ""                        'same row on odd-column gets cleared
    End If

Next d                                                          ' go to next row

End Sub

Upvotes: 0

danielpiestrak
danielpiestrak

Reputation: 5439

For Cell D2:

    =IF(MOD(E2,2),B2,"")

Explanation: If Range E2 is not divisible by two, the display value from B2, otherwise display nothing.

you can reverse this by inserting a 'NOT' around the MOD for Cell C2:

    =IF(NOT(MOD(E2,2)),B2,"")

Upvotes: 1

SeanC
SeanC

Reputation: 15923

in C2, =IF(MOD(E2,2)=1,B2,"")
in D2, =IF(MOD(E2,2)=0,B2,"")

copy these down to the end of your data

assuming the same format (Data,Col1,Col2,Parameter), but using relative addressing
Column 1: =IF(MOD(OFFSET(C2,0,2),2)=1,OFFSET(C2,0,-1),"") replace C2 with the current cell Column 2: =IF(MOD(OFFSET(D2,0,1),2)=0,OFFSET(D2,0,-2),"") replace D2 with the current cell

again, copy and paste - once you have the first one correct, excel will adjust the formula for the current cell

Upvotes: 3

Related Questions