xyz
xyz

Reputation: 2300

How do I insert columns dynamically in Excel?

I would like to insert separating columns into an Excel report to make the existing columns easier to view.

The report is created dynamically and I never know how many columns there will be; there could be 5, 10, 17, etc.

The section starts at F and goes to ival=Application.WorksheetFunction.CountIf(range("D2:D" & LastRow), "Other")

So if ival=10 then the columns are F G H I J K L M N O, and I need to insert columns between F&G, G&H, H&I, I&J, ... and N&O.

This may be a possibility for inserting columns: Workbooks("yourworkbook").Worksheets("theworksheet").Columns(i).Insert

But I'm not sure how to loop through ival.

Sub InsertColumns()
    Dim iVal As Integer
    Dim Rng As range
    Dim LastRow As Long
    Dim i  As Integer

    With Sheets("sheet1")
        LastRow = .range("D" & .Rows.Count).End(xlUp).Row
    End With

    iVal = Application.WorksheetFunction.CountIf(range("D2:D" & LastRow), "Other")

    For i = 7 To iVal - 1
    Workbooks("yourworkbook").Worksheets("theworksheet").Columns(i+1).Insert
    Next i

End Sub

Upvotes: 10

Views: 38499

Answers (3)

n a
n a

Reputation: 143

For the case to insert a column at the left of only specified cells,

- original cells (insert the columns at once)

enter image description here

- after insertion

enter image description here

- code

Sub fixColumn()
    Dim idx As Integer, cellStr As String
    With ActiveSheet
        For idx = Columns("G").Column To Columns("O").Column
            cellStr = cellStr & .Cells(1, idx).Address(False, False) & ","
        Next
        cellStr = Left(cellStr, Len(cellStr) - 1)
        .Range(cellStr).Select
        Selection.EntireColumn.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
    End With
End Sub

Upvotes: 0

Santosh
Santosh

Reputation: 12353

The below code should work without needing to worry about ival:

Sub InsertSeparatorColumns()

    Dim lastCol As Long

    With Sheets("sheet1")
        lastCol = Cells(2, .Columns.Count).End(xlToLeft).Column

        For i = lastCol To 7 Step -1
            .Columns(i).Insert
            .Columns(i).ColumnWidth = 0.5
        Next

    End With

End Sub

Upvotes: 9

Jon Crowell
Jon Crowell

Reputation: 22338

Try this:

Sub InsertSeparatorColumns()
    Dim ws as Worksheet
    Dim firstCol As String
    Dim lastRow As Long
    Dim i As Long
    Dim howManySeparators As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")
    firstCol = "F"
    lastRow = ws.Range("D" & ws.Rows.Count).End(xlUp).Row
    howManySeparators = Application.WorksheetFunction.CountIf _
                            (ws.range("D2:D" & LastRow), "Other")

    For i = 1 To howManySeparators * 2 Step 2
        ws.Range(firstCol & 1).Offset(, i).EntireColumn.Insert
    Next i
End Sub

Upvotes: 3

Related Questions