Need transpose? help....

J

Jethro Bodeene

I have a spreadsheet with 151 columns by 49 rows of data. I need to
transpose this data from its current state, to only 1 vertical column. How
can I do this? Thks
 
B

Bob Phillips

Off the top, untested

With ActiveSheet

LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
For i = LastRow To 1 Step -1

For j = LastCol To 2 Step -1

.Rows(i + 1).Insert
.Cells(i, j).Cut .Cells(i + 1, "A")
Next j
Next i
End With
 
L

L. Howard Kittle

Hi Bob,

I tested your 'lil sonnet and it works fine with Option Explicit edited out.
Then I dimmed LastRow and LastCol as Range and that was fine, but errored
out at i and j, I tried Integer and Range and neither worked. What would
these be declared as??

Is there any good reason to dim these variables? Seems I hear you always
should.

Thanks
Howard
 
G

Gord Dibben

Sub rowstocol()
'many columns and rows to one column on a new worksheet
Dim wks As Worksheet
Dim colnos As Long
Dim CopytoSheet As Worksheet

If ActiveSheet.Name = "Copyto" Then
MsgBox "Active Sheet Not Valid" & Chr(13) _
& "Try Another Worksheet."
Exit Sub
Else
Set wks = ActiveSheet
Application.ScreenUpdating = False
For Each Wksht In Worksheets
With Wksht
If .Name = "Copyto" Then
Application.DisplayAlerts = False
Sheets("Copyto").Delete
End If
End With
Next
Application.DisplayAlerts = True
Set CopytoSheet = Worksheets.Add
CopytoSheet.Name = "Copyto"
wks.Activate
Range("A1").Select
colnos = InputBox("Enter Number of Columns to Transpose to Rows")

Do Until ActiveCell.Value = ""
ActiveCell.Offset(1, 0).Select
With ActiveCell
.Resize(1, colnos).Copy
End With
Sheets("Copyto").Select
Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, _
SkipBlanks:=False _
, Transpose:=True
Application.CutCopyMode = False
ActiveSheet.Cells(Rows.Count, ActiveCell.Column).End(xlUp).Select
ActiveCell.Offset(1, 0).Select

wks.Activate
ActiveCell.Select
Loop
Sheets("Copyto").Activate
End If
End Sub


Gord Dibben MS Excel MVP

On Mon, 15 Mar 2010 13:55:01 -0700, Jethro Bodeene <Jethro
 
M

Max

Assume your data is in Sheet1, with top left corner cell B2
In another sheet,
Put in any startcell, say in C3:
=OFFSET(Sheet1!$B$2,INT((ROWS($1:1)-1)/151),MOD(ROWS($1:1)-1,151))
Copy C3 down as far as required to exhaust the source data into that col
(copy down by at least: 151 x 49 = 7399 cells). Inspiring? hit the YES below
 
B

Bob Phillips

Howard,

They should be Longs.

Yes, you should always dimension your variables, you can always get caught
out with mis-spellings if you don't. I always do in my own code, I just miss
them sometimes in posts, especially if responding to someone who doesn't do
so.
 
L

L. Howard Kittle

Thanks Bob.

Your advice rings familiar and I appreciate the reminder from an MVP to a
hobby lurker.

So it has to be a Long because the possible 'scope' of the value of i or j,
given the code, may exceed the value of an Integer?

Regards,
Howard
 
B

Bob Phillips

Partly Howard, but windows under the covers converts integers to Long,
processes the request, then converts the long back to the integer as passed.
So by declaring as integer you are causing two unnecessary conversions, so
it is just more efficient. Many API calls require an integer as the
parameter type, but in your/my code, there is no real reason to use integer
unless you want to use it as some sort of number validation (which I would
argue is the wrong way to do it).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top