How to Tell Macro to Create New Rows Based on a Particular Column Rather Than Hard Coded Column G

Alex Campbell
Alex Campbell used Ask the Experts™
on
I had this question after viewing How to change this macro to find last column instead of A to J?.

Sub Commas2Rows()
  ' hiker95, 05/18/2017, ME1006027
  Dim lr As Long, lc As Long, r As Long, s, i As Long
  Application.ScreenUpdating = False
  With ActiveSheet
    lr = .Cells(Rows.Count, 1).End(xlUp).Row
    lc = .Cells(2, Columns.Count).End(xlToLeft).Column
    For r = lr To 2 Step -1
      If InStr(.Range("G" & r), ", ") Then
        s = Split(.Range("G" & r), ", ")
        .Rows(r + 1).Resize(UBound(s)).Insert
        .Range("G" & r).Resize(UBound(s) + 1) = Application.Transpose(s)
        .Range("A" & r + 1 & ":F" & r + 1).Resize(UBound(s)).Value = .Range("A" & r & ":F" & r).Value
'        .Range("H" & r + 1 & ":J" & r + 1).Resize(UBound(s)).Value = .Range("H" & r & ":J" & r).Value
        .Range("H" & r + 1 & ":" & Chr(64 + lc) & r + 1).Resize(UBound(s)).Value = .Range("H" & r & ":" & Chr(64 + lc) & r).Value
      End If
    Next r
  End With
  Application.ScreenUpdating = True
End Sub
Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Bill PrewIT / Software Engineering Consultant
Top Expert 2016

Commented:
I think this should handle that.

Sub Commas2Rows()
  ' hiker95, 05/18/2017, ME1006027
  Dim lr As Long, lc As Long, r As Long, s, i As Long, SplitCol As String, SplitBefore As String, SplitAfter As String

  SplitCol = "G"
  SplitBefore =  Chr(Asc(SplitCol)-1)
  SplitAfter = Chr(Asc(SplitCol)+1)

  Application.ScreenUpdating = False

  With ActiveSheet
    lr = .Cells(Rows.Count, 1).End(xlUp).Row
    lc = .Cells(2, Columns.Count).End(xlToLeft).Column

    For r = lr To 2 Step -1
      If InStr(.Range(SplitCol & r), ", ") Then
        s = Split(.Range(SplitCol & r), ", ")
        .Rows(r + 1).Resize(UBound(s)).Insert
        .Range(SplitCol & r).Resize(UBound(s) + 1) = Application.Transpose(s)
        .Range("A" & r + 1 & ":" & SplitBefore & r + 1).Resize(UBound(s)).Value = .Range("A" & r & ":" & SplitBefore & r).Value
        .Range(SplitAfter & r + 1 & ":" & Chr(64 + lc) & r + 1).Resize(UBound(s)).Value = .Range(SplitAfter & r & ":" & Chr(64 + lc) & r).Value
      End If
    Next r
  End With

  Application.ScreenUpdating = True
End Sub

Open in new window


»bp
Bill PrewIT / Software Engineering Consultant
Top Expert 2016

Commented:
And if it were me I would probably switch from .Range() referencing to .Cells() referencing for this, to avoid the concatenations and character conversions, etc.  Would be a bit simpler and easier to follow I suspect.


»bp

Author

Commented:
That works, but it would be great if you would stop and ask which column to work with it you would.
IT / Software Engineering Consultant
Top Expert 2016
Commented:
Sub Commas2Rows()
  ' hiker95, 05/18/2017, ME1006027
  Dim lr As Long, lc As Long, r As Long, s, i As Long, SplitCol As String, SplitBefore As String, SplitAfter As String

  SplitCol = Application.InputBox("Please specify column letter to split on:", "Split Column", "G")
  SplitBefore =  Chr(Asc(SplitCol)-1)
  SplitAfter = Chr(Asc(SplitCol)+1)

  Application.ScreenUpdating = False

  With ActiveSheet
    lr = .Cells(Rows.Count, 1).End(xlUp).Row
    lc = .Cells(2, Columns.Count).End(xlToLeft).Column

    For r = lr To 2 Step -1
      If InStr(.Range(SplitCol & r), ", ") Then
        s = Split(.Range(SplitCol & r), ", ")
        .Rows(r + 1).Resize(UBound(s)).Insert
        .Range(SplitCol & r).Resize(UBound(s) + 1) = Application.Transpose(s)
        .Range("A" & r + 1 & ":" & SplitBefore & r + 1).Resize(UBound(s)).Value = .Range("A" & r & ":" & SplitBefore & r).Value
        .Range(SplitAfter & r + 1 & ":" & Chr(64 + lc) & r + 1).Resize(UBound(s)).Value = .Range(SplitAfter & r & ":" & Chr(64 + lc) & r).Value
      End If
    Next r
  End With

  Application.ScreenUpdating = True
End Sub

Open in new window

Author

Commented:
Great!! Thanks!

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial