Connecting Tech Pros Worldwide Forums | Help | Site Map

How to learn VBA Code by breaking it down

Familiar Sight
 
Join Date: Apr 2007
Location: Sydney, Australia
Posts: 168
#1: Mar 6 '09
Hi I have got the following code from someone else

Expand|Select|Wrap|Line Numbers
  1. Sub MultiColsToA() 
  2.     Dim rCell As  Range 
  3.     Dim lRows As Long 
  4.     Dim lCols As Long 
  5.     Dim lCol As Long 
  6.     Dim ws As Worksheet 
  7.     Dim wsNew As Worksheet 
  8.  
  9.     lCols = Columns.Count 
  10.     lRows = Rows.Count 
  11.     Set wsNew = Sheets.Add() 
  12.  
  13.     For Each ws In Worksheets 
  14.         With ws 
  15.             For Each rCell In .Range("B1", .Cells(1, lCols).End(xlToLeft)) 
  16.                 .Range(rCell, .Cells(lRows, rCell.Column).End(xlUp)).Cut _ 
  17.                 wsNew.Cells(lRows, 1).End(xlUp)(2, 1) 
  18.             Next rCell 
  19.         End With 
  20.     Next ws 
  21.  
  22. End Sub 
  23.  
This basically takes all columns from all worksheets in excel and pastes it into 1 column.

the problem is I don't understand the code, I want to know how I search google to learn what this code is doing

so I understand until line 11 but then I get lost

I am assuming Lines 13 and 20 say do the following code in each worksheet

then line 14 says in the current worksheet do the code begining in line 15

Line 15 Queries:
Query 1: "For Each rCell": Where is rCell given a value?
Query 2: For the rest of the code I assume its saying make the range from B1 to whatever the last column number is.
Line 16 Queries:
Query 1: I have no idea whats going on here
Line 17 Queries:
Query 1: I have no idea whats going on here


My objective is similar to this code but I want excel to take each consecutive set of 3 columns and paste it into the first 3 columns e.g.: take Column D,E and F and paste them underneath A,B and C. Then take Columns G, H and I also page them underneath A,B and C, and on it goes until all columns are pasted under Columns A, B and C.

Thank You

kadghar's Avatar
Expert
 
Join Date: Apr 2007
Location: Mexico City
Posts: 1,155
#2: Mar 7 '09

re: How to learn VBA Code by breaking it down


if you debug it line by line (by pressing F8 instead of F5), each time you press F8 you'll find out what each line does.

about your questions:
lines 1 to 7 defines the variables
9 and 10 count the columns and rows
and then it make FORs for every worksheet, and every range in each worksheet.

The copy- paste code is in lines 16 and 17.

Well, what you have to do is quite simple, instead of making a FOR EACH, try using a FOR with STEP 3, and use it 3 times.

Oh, and check this out. It's my experience of how using variables is quite more efficient than using Copy-Paste in Excel's VBA. So why dont you give it a try this other way?
Familiar Sight
 
Join Date: Apr 2007
Location: Sydney, Australia
Posts: 168
#3: Mar 7 '09

re: How to learn VBA Code by breaking it down


Ok, thanks I understand it a bit better but still not completely. Could you post the code that you think would work for what I want to acheive. Sorry I am feeling a bit thick in the brain at the moment.


Thank You
kadghar's Avatar
Expert
 
Join Date: Apr 2007
Location: Mexico City
Posts: 1,155
#4: Mar 7 '09

re: How to learn VBA Code by breaking it down


well, writing it for you wont solve your doubt, because you wont understand it... but please, at least check the FOR, DO, REDIM, RANGE and CELLS syntax, and check the article i recomended you before, so you can see why im writing it all into variants.

i came with something like this...
Expand|Select|Wrap|Line Numbers
  1. Sub ColsMerge()
  2. Dim i As Integer, j As Integer, n As Integer
  3. Dim x As Double, y As Double, z As Double
  4. Dim a, b()
  5.  
  6. y = Rows.Count: x = 1
  7.  
  8. n = Int(InputBox("In how many columns will the sheet be merged?", "Merge Columns", "3"))
  9. For i = 1 To Columns.Count
  10.     If Cells(1, i) = "" Then Exit For
  11.     z = Cells(1, i).End(-4121).Row
  12.     If z > x And z < y Then x = z
  13. Next
  14. a = Range(Cells(1, 1), Cells(x, i - 1))
  15. ReDim b(1 To x * i  / n, 1 To n)
  16. For j = 1 To n
  17.     z = 1
  18.     For i = j To UBound(a, 2) Step n
  19.         y = 1
  20.         Do
  21.             If a(y, i) <> "" Then
  22.                 b(z, j) = a(y, i)
  23.                 z = z + 1
  24.             End If
  25.             y = y + 1
  26.             If z > Rows.Count Then Exit For
  27.         Loop Until y > x
  28.     Next
  29. Next
  30. Range(Cells(1, 1), Cells(UBound(b), n)) = b
  31. End Sub
that is not quite error prove... and it has some limitations, like, it wont copy formulas, only values, and any empty colum will stop the columns searching. and it will skip empty cells... but that can be changed in the if in the middle of the DO/LOOP

HTH
Familiar Sight
 
Join Date: Apr 2007
Location: Sydney, Australia
Posts: 168
#5: Mar 11 '09

re: How to learn VBA Code by breaking it down


Thanks kadghar Post # 4 helped me understand much better as I could actually see the code doing what I wanted
Reply