Requirement:
The project is to split a row into 4 rows using 4 trigger cells to define each row. The trigger cells in my samples are using columns A, P, X and AL.
I have attached a sample of data with some guiding notes that shows the source data and the required result. I have colour coded each split for better visibility.
The sheet also includes some columns (AG to AK) that are not required in one version but required in a different version as the forms meet different accounting requirements so 1 form excludes these while the other includes them.
There might be some code in there where I've found something to play with but hadn't cracked it for my purpose.
Solution:
Option Explicit Sub Treat() Const Col1 As String = "A" Const Col2 As String = "P" Const Col3 As String = "X" Const Col4 As String = "AL" Dim FR As Integer, LR As Integer, LC As Integer, I As Integer Dim IB As Integer, IE As Integer, II As Integer Dim DestWS As Worksheet Dim WkRg As Range, Rg As Range Dim Col1Nb As Integer, Col2Nb As Integer, Col3Nb As Integer, Col4Nb As Integer Dim NbCoL1 As Integer, NbCoL2 As Integer, NbCoL3 As Integer, NbCoL4 As Integer Set DestWS = Sheets("Result") Set WkRg = ActiveSheet.UsedRange LR = WkRg.Rows.Count LC = WkRg.Columns.Count Col1Nb = Cells(1, Col1).Column: Col2Nb = Cells(1, Col2).Column: Col3Nb = Cells(1, Col3).Column: Col4Nb = Cells(1, Col4).Column NbCoL1 = Col2Nb - Col1Nb NbCoL2 = Col3Nb - Col2Nb NbCoL3 = Cells(1, Col4).Column - Cells(1, Col3).Column NbCoL4 = LC - Col3Nb For FR = 1 To LR If (Len(Cells(FR, 1)) <> 0) Then Exit For Next II = 1 I = FR IB = FR Application.ScreenUpdating = False DestWS.Cells.ClearContents While (I <> LR) I = I + 1 If (Len(Cells(I, 1)) <> 0) Then IE = I - 1 Set WkRg = Range(Cells(IB, 1), Cells(IE, LC)) Call CopyData(II, WkRg.Columns(Col1Nb).Cells, NbCoL1, DestWS) Call CopyData(II, WkRg.Columns(Col2Nb).Cells, NbCoL2, DestWS) Call CopyData(II, WkRg.Columns(Col3Nb).Cells, NbCoL3, DestWS) Call CopyData(II, WkRg.Columns(Col4Nb).Cells, NbCoL4, DestWS) IB = IE + 1: End If Wend Application.ScreenUpdating = True MsgBox (" job Done") End Sub Sub CopyData(ByRef III, WkColRg As Range, NbCol As Integer, DestWS As Worksheet) Dim Rg As Range For Each Rg In WkColRg If (Len(Rg) <> 0) Then Rg.Resize(1, NbCol).Copy DestWS.Cells(III, 1).PasteSpecial Paste:=xlPasteValues III = III + 1 End If Next End Sub
Obtained from the OzGrid Help Forum.
Solution provided by PCI.
See also: Index to Excel VBA Code and Index to Excel Freebies and Lesson 1 - Excel Fundamentals and Index to how to… providing a range of solutions and Index to new resources and reference sheets
See also:
How to use a macro to copy rows from multiple worksheets based on a cell value greater than zero |
How to compare two columns in excel, inserting blank rows moving associated data |
How to add rows and specific text after changes in data |
How to use VBA to turn columns into rows |
How to use a macro for grouping rows based on cells with same names |
Click here to visit our Free 24/7 Excel/VBA Help Forum where there are thousands of posts you can get information from, or you can join the Forum and post your own questions.