Tuesday, July 10, 2018

Excel VBA, “Unpivoting” Data leads to crashing of excel

Leave a Comment

I have a code that crashes my excel, it takes the data from one sheet and transforms it from a tabular view to vertical. I believe it is slow because it is taking it from a database view to over 45k rows.

does anyone have any tips for optimizing this code? Crashes my excel at the next c loop

Also I tried running this in excel 2010, get an overflow error, but usually 2010 runs better and 2013 is slow or not responding. But I want to get it working for 2013.

Sub Unpivot()     Call ReversePivotTable("Sheet1", "A", "C", "Sheet2", "Name") End Sub    Sub ReversePivotTable(source_sheet, from_col, to_col, target_sheet, Optional type_header = "type", Optional value_header = "value")      Application.ScreenUpdating = False     LAST_ROW = Sheets(source_sheet).Cells(Rows.count, 1).End(xlUp).Row     If LAST_ROW > 1 Then         Sheets(target_sheet).Cells.ClearContents     Else         Exit Sub     End If      pvt_type_col = Sheets(target_sheet).Range(to_col & 1).Offset(0, 1).column 'D     pvt_value_col = Sheets(target_sheet).Range(to_col & 1).Offset(0, 2).column 'E      'get headers     Sheets(source_sheet).Range(from_col & ":" & to_col).copy     Sheets(target_sheet).Range("A1").PasteSpecial xlPasteValues     Sheets(target_sheet).Cells(1, pvt_type_col).Value = type_header     Sheets(target_sheet).Cells(1, pvt_value_col).Value = value_header        'tranform data     curr_row = 2     With Sheets(source_sheet)         last_col = .Cells(1, Columns.count).End(xlToLeft).column             For Each c In .Range("A2", .Range("A" & Rows.count).End(xlUp))                 Set rng = .Range(.Cells(c.Row, pvt_type_col), .Cells(c.Row, last_col))                 numbers = Application.WorksheetFunction.CountIf(rng, "<>""")                 If numbers > 0 Then                     Sheets(source_sheet).Range(from_col & c.Row & ":" & to_col & c.Row).copy                     Sheets(target_sheet).Range(from_col & curr_row & ":" & from_col & curr_row + numbers - 1).PasteSpecial Paste:=xlPasteValues                     Application.CutCopyMode = False                     b = curr_row                     For a = pvt_type_col To last_col Step 1                         If IsNumeric(.Cells(c.Row, a).Value) Then                         'If .Cells(c.Row, a).Value <> "" Then                             Sheets(target_sheet).Cells(b, pvt_type_col) = .Cells(1, a)                             Sheets(target_sheet).Cells(b, pvt_value_col) = .Cells(c.Row, a)                             b = b + 1                         End If                     Next a                     curr_row = curr_row + numbers                     If curr_row Mod 10 = 0 Then DoEvents                 End If             Next c     End With     Sheets(target_sheet).Select     Application.CutCopyMode = False     Application.ScreenUpdating = True  End Sub 

Adding sample data, before:

+---------+------------------+-----------------+--------------+-------------+--------------+-------------+--------------+--------------+-------------+-------------+-------------+--------------+--------------+-------------+-------------+--------+--------+--------+--------------+--------------+-------------+--------------+-------------+-------------+-------------+-------------+--------------+-------------+--------------+-------------+--------------+-------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+ |  col 1  |      col 2       |      col 3      |    col 4     |    col 5    |    col 6     |    col 7    |    col 8     |    col 9     |   col 10    |   col 11    |   col 12    |    col 13    |    col 14    |   col 15    |   col 16    | col 17 | col 18 | col 19 |    col 20    |    col 21    |   col 22    |    col 23    |   col 24    |   col 25    |   col 26    |   col 27    |    col 28    |   col 29    |    col 30    |   col 31    |    col 32    |   col 33    | col 34 | col 35 | col 36 | col 37 | col 38 | col 39 | col 40 | col 41 | col 42 | col 43 | col 44 | col 45 | col 46 | col 47 | col 48 | col 49 | +---------+------------------+-----------------+--------------+-------------+--------------+-------------+--------------+--------------+-------------+-------------+-------------+--------------+--------------+-------------+-------------+--------+--------+--------+--------------+--------------+-------------+--------------+-------------+-------------+-------------+-------------+--------------+-------------+--------------+-------------+--------------+-------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+ | stack   | questions forums | excel questions | -540.0689323 | 1543.570725 | -144.7954348 | 2298.261951 | -9019.970702 | -14669.27805 |  2400.31011 | 642.2459256 | 5573.176935 | -19167.60096 | -17070.78503 | 2884.343252 |   2262.2904 |      0 |      0 |      0 | -4866.524221 | -5470.616311 | 6722.889306 | -6749.153327 | 8483.707603 | 7513.052842 | 3768.659869 | 8600.703543 | -8642.799155 | 1322.251923 | -1323.911031 | 3651.739593 | -259.3401823 | 9369.890794 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 | | stack   | questions forums | excel questions | -325.5117945 | 641.8568521 | -58.21010305 | 977.4626836 | -3505.695779 | -7455.410001 | 777.9341271 | 385.2714806 | 1932.531773 | -8861.136183 | -6679.463121 | 1177.775583 | 881.2548725 |      0 |      0 |      0 | -1813.822794 | -2266.860562 | 2278.669772 | -2361.758467 | 3356.446385 | 2741.992369 | 1461.950204 | 3289.154294 |  -3469.10217 | 804.7989704 | -816.9003551 | 1907.515323 |  432.8435868 | 3074.256129 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 | | stack   | questions forums | excel questions | -36.42618332 | 65.26139258 | -6.513963305 | 99.38442773 | -435.0485137 | -1047.099199 | 79.09717611 | 39.17283622 | 186.7060257 | -1272.372107 |  -922.750792 | 118.3261869 | 89.60240903 |      0 |      0 |      0 | -210.3183182 | -267.1376584 | 214.6223869 | -280.0000537 | 293.4738136 | 248.5196226 | 144.0720039 | 288.5506437 | -430.0886416 | 81.82868405 | -91.41469707 | 184.4395708 |  44.00977438 | 272.8284368 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 | | stack   | questions forums | excel questions | -582.3647427 | 1316.573479 | -165.4555206 | 1925.519573 | -7138.977944 | -17532.94829 | 1404.004642 | 930.6126154 | 3648.013625 | -19585.55834 |  -13758.8035 | 2376.319408 |   1898.9449 |      0 |      0 |      0 | -3625.886962 | -4833.808881 | 4232.764078 | -4449.956081 | 6883.584715 |  5398.12044 | 4048.773452 | 6632.405148 | -7240.871663 | 1959.676076 | -2008.657583 | 4413.431721 |  1360.661107 | 5484.849776 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 |      0 | +---------+------------------+-----------------+--------------+-------------+--------------+-------------+--------------+--------------+-------------+-------------+-------------+--------------+--------------+-------------+-------------+--------+--------+--------+--------------+--------------+-------------+--------------+-------------+-------------+-------------+-------------+--------------+-------------+--------------+-------------+--------------+-------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+ 

desired after:

+---------+------------------+-----------------+-----------+--------------+ |  col 1  |      col 2       |      col 3      | Attribute |    Value     | +---------+------------------+-----------------+-----------+--------------+ | stack | questions forums | excel questions | col 4     | -540.0689323 | | stack | questions forums | excel questions | col 5     |  1543.570725 | | stack | questions forums | excel questions | col 6     | -144.7954348 | | stack | questions forums | excel questions | col 7     |  2298.261951 | | stack | questions forums | excel questions | col 8     | -9019.970702 | | stack | questions forums | excel questions | col 9     | -14669.27805 | | stack | questions forums | excel questions | col 10    |   2400.31011 | | stack | questions forums | excel questions | col 11    |  642.2459256 | | stack | questions forums | excel questions | col 12    |  5573.176935 | | stack | questions forums | excel questions | col 13    | -19167.60096 | | stack | questions forums | excel questions | col 14    | -17070.78503 | | stack | questions forums | excel questions | col 15    |  2884.343252 | | stack | questions forums | excel questions | col 16    |    2262.2904 | | stack | questions forums | excel questions | col 17    |            0 | | stack | questions forums | excel questions | col 18    |            0 | | stack | questions forums | excel questions | col 19    |            0 | | stack | questions forums | excel questions | col 20    | -4866.524221 | | stack | questions forums | excel questions | col 21    | -5470.616311 | | stack | questions forums | excel questions | col 22    |  6722.889306 | | stack | questions forums | excel questions | col 23    | -6749.153327 | | stack | questions forums | excel questions | col 24    |  8483.707603 | | stack | questions forums | excel questions | col 25    |  7513.052842 | | stack | questions forums | excel questions | col 26    |  3768.659869 | | stack | questions forums | excel questions | col 27    |  8600.703543 | | stack | questions forums | excel questions | col 28    | -8642.799155 | | stack | questions forums | excel questions | col 29    |  1322.251923 | | stack | questions forums | excel questions | col 30    | -1323.911031 | | stack | questions forums | excel questions | col 31    |  3651.739593 | | stack | questions forums | excel questions | col 32    | -259.3401823 | | stack | questions forums | excel questions | col 33    |  9369.890794 | | stack | questions forums | excel questions | col 34    |            0 | | stack | questions forums | excel questions | col 35    |            0 | | stack | questions forums | excel questions | col 36    |            0 | | stack | questions forums | excel questions | col 37    |            0 | | stack | questions forums | excel questions | col 38    |            0 | | stack | questions forums | excel questions | col 39    |            0 | | stack | questions forums | excel questions | col 40    |            0 | | stack | questions forums | excel questions | col 41    |            0 | | stack | questions forums | excel questions | col 42    |            0 | | stack | questions forums | excel questions | col 43    |            0 | | stack | questions forums | excel questions | col 44    |            0 | | stack | questions forums | excel questions | col 45    |            0 | | stack | questions forums | excel questions | col 46    |            0 | | stack | questions forums | excel questions | col 47    |            0 | | stack | questions forums | excel questions | col 48    |            0 | | stack | questions forums | excel questions | col 49    |            0 | | stack | questions forums | excel questions | col 4     | -325.5117945 | | stack | questions forums | excel questions | col 5     |  641.8568521 | | stack | questions forums | excel questions | col 6     | -58.21010305 | | stack | questions forums | excel questions | col 7     |  977.4626836 | | stack | questions forums | excel questions | col 8     | -3505.695779 | | stack | questions forums | excel questions | col 9     | -7455.410001 | | stack | questions forums | excel questions | col 10    |  777.9341271 | | stack | questions forums | excel questions | col 11    |  385.2714806 | | stack | questions forums | excel questions | col 12    |  1932.531773 | | stack | questions forums | excel questions | col 13    | -8861.136183 | | stack | questions forums | excel questions | col 14    | -6679.463121 | | stack | questions forums | excel questions | col 15    |  1177.775583 | | stack | questions forums | excel questions | col 16    |  881.2548725 | | stack | questions forums | excel questions | col 17    |            0 | | stack | questions forums | excel questions | col 18    |            0 | | stack | questions forums | excel questions | col 19    |            0 | | stack | questions forums | excel questions | col 20    | -1813.822794 | | stack | questions forums | excel questions | col 21    | -2266.860562 | | stack | questions forums | excel questions | col 22    |  2278.669772 | | stack | questions forums | excel questions | col 23    | -2361.758467 | | stack | questions forums | excel questions | col 24    |  3356.446385 | | stack | questions forums | excel questions | col 25    |  2741.992369 | | stack | questions forums | excel questions | col 26    |  1461.950204 | | stack | questions forums | excel questions | col 27    |  3289.154294 | | stack | questions forums | excel questions | col 28    |  -3469.10217 | | stack | questions forums | excel questions | col 29    |  804.7989704 | | stack | questions forums | excel questions | col 30    | -816.9003551 | | stack | questions forums | excel questions | col 31    |  1907.515323 | | stack | questions forums | excel questions | col 32    |  432.8435868 | | stack | questions forums | excel questions | col 33    |  3074.256129 | | stack | questions forums | excel questions | col 34    |            0 | | stack | questions forums | excel questions | col 35    |            0 | | stack | questions forums | excel questions | col 36    |            0 | | stack | questions forums | excel questions | col 37    |            0 | | stack | questions forums | excel questions | col 38    |            0 | | stack | questions forums | excel questions | col 39    |            0 | | stack | questions forums | excel questions | col 40    |            0 | | stack | questions forums | excel questions | col 41    |            0 | | stack | questions forums | excel questions | col 42    |            0 | | stack | questions forums | excel questions | col 43    |            0 | | stack | questions forums | excel questions | col 44    |            0 | | stack | questions forums | excel questions | col 45    |            0 | | stack | questions forums | excel questions | col 46    |            0 | | stack | questions forums | excel questions | col 47    |            0 | | stack | questions forums | excel questions | col 48    |            0 | | stack | questions forums | excel questions | col 49    |            0 | | stack | questions forums | excel questions | col 4     | -36.42618332 | | stack | questions forums | excel questions | col 5     |  65.26139258 | | stack | questions forums | excel questions | col 6     | -6.513963305 | | stack | questions forums | excel questions | col 7     |  99.38442773 | | stack | questions forums | excel questions | col 8     | -435.0485137 | | stack | questions forums | excel questions | col 9     | -1047.099199 | | stack | questions forums | excel questions | col 10    |  79.09717611 | | stack | questions forums | excel questions | col 11    |  39.17283622 | | stack | questions forums | excel questions | col 12    |  186.7060257 | | stack | questions forums | excel questions | col 13    | -1272.372107 | | stack | questions forums | excel questions | col 14    |  -922.750792 | | stack | questions forums | excel questions | col 15    |  118.3261869 | | stack | questions forums | excel questions | col 16    |  89.60240903 | | stack | questions forums | excel questions | col 17    |            0 | | stack | questions forums | excel questions | col 18    |            0 | | stack | questions forums | excel questions | col 19    |            0 | | stack | questions forums | excel questions | col 20    | -210.3183182 | | stack | questions forums | excel questions | col 21    | -267.1376584 | | stack | questions forums | excel questions | col 22    |  214.6223869 | | stack | questions forums | excel questions | col 23    | -280.0000537 | | stack | questions forums | excel questions | col 24    |  293.4738136 | | stack | questions forums | excel questions | col 25    |  248.5196226 | | stack | questions forums | excel questions | col 26    |  144.0720039 | | stack | questions forums | excel questions | col 27    |  288.5506437 | | stack | questions forums | excel questions | col 28    | -430.0886416 | | stack | questions forums | excel questions | col 29    |  81.82868405 | | stack | questions forums | excel questions | col 30    | -91.41469707 | | stack | questions forums | excel questions | col 31    |  184.4395708 | | stack | questions forums | excel questions | col 32    |  44.00977438 | | stack | questions forums | excel questions | col 33    |  272.8284368 | | stack | questions forums | excel questions | col 34    |            0 | | stack | questions forums | excel questions | col 35    |            0 | | stack | questions forums | excel questions | col 36    |            0 | | stack | questions forums | excel questions | col 37    |            0 | | stack | questions forums | excel questions | col 38    |            0 | | stack | questions forums | excel questions | col 39    |            0 | | stack | questions forums | excel questions | col 40    |            0 | | stack | questions forums | excel questions | col 41    |            0 | | stack | questions forums | excel questions | col 42    |            0 | | stack | questions forums | excel questions | col 43    |            0 | | stack | questions forums | excel questions | col 44    |            0 | | stack | questions forums | excel questions | col 45    |            0 | | stack | questions forums | excel questions | col 46    |            0 | | stack | questions forums | excel questions | col 47    |            0 | | stack | questions forums | excel questions | col 48    |            0 | | stack | questions forums | excel questions | col 49    |            0 | | stack | questions forums | excel questions | col 4     | -582.3647427 | | stack | questions forums | excel questions | col 5     |  1316.573479 | | stack | questions forums | excel questions | col 6     | -165.4555206 | | stack | questions forums | excel questions | col 7     |  1925.519573 | | stack | questions forums | excel questions | col 8     | -7138.977944 | | stack | questions forums | excel questions | col 9     | -17532.94829 | | stack | questions forums | excel questions | col 10    |  1404.004642 | | stack | questions forums | excel questions | col 11    |  930.6126154 | | stack | questions forums | excel questions | col 12    |  3648.013625 | | stack | questions forums | excel questions | col 13    | -19585.55834 | | stack | questions forums | excel questions | col 14    |  -13758.8035 | | stack | questions forums | excel questions | col 15    |  2376.319408 | | stack | questions forums | excel questions | col 16    |    1898.9449 | | stack | questions forums | excel questions | col 17    |            0 | | stack | questions forums | excel questions | col 18    |            0 | | stack | questions forums | excel questions | col 19    |            0 | | stack | questions forums | excel questions | col 20    | -3625.886962 | | stack | questions forums | excel questions | col 21    | -4833.808881 | | stack | questions forums | excel questions | col 22    |  4232.764078 | | stack | questions forums | excel questions | col 23    | -4449.956081 | | stack | questions forums | excel questions | col 24    |  6883.584715 | | stack | questions forums | excel questions | col 25    |   5398.12044 | | stack | questions forums | excel questions | col 26    |  4048.773452 | | stack | questions forums | excel questions | col 27    |  6632.405148 | | stack | questions forums | excel questions | col 28    | -7240.871663 | | stack | questions forums | excel questions | col 29    |  1959.676076 | | stack | questions forums | excel questions | col 30    | -2008.657583 | | stack | questions forums | excel questions | col 31    |  4413.431721 | | stack | questions forums | excel questions | col 32    |  1360.661107 | | stack | questions forums | excel questions | col 33    |  5484.849776 | | stack | questions forums | excel questions | col 34    |            0 | | stack | questions forums | excel questions | col 35    |            0 | | stack | questions forums | excel questions | col 36    |            0 | | stack | questions forums | excel questions | col 37    |            0 | | stack | questions forums | excel questions | col 38    |            0 | | stack | questions forums | excel questions | col 39    |            0 | | stack | questions forums | excel questions | col 40    |            0 | | stack | questions forums | excel questions | col 41    |            0 | | stack | questions forums | excel questions | col 42    |            0 | | stack | questions forums | excel questions | col 43    |            0 | | stack | questions forums | excel questions | col 44    |            0 | | stack | questions forums | excel questions | col 45    |            0 | | stack | questions forums | excel questions | col 46    |            0 | | stack | questions forums | excel questions | col 47    |            0 | | stack | questions forums | excel questions | col 48    |            0 | | stack | questions forums | excel questions | col 49    |            0 | +---------+------------------+-----------------+-----------+--------------+ 

2 Answers

Answers 1

Sorry, but i don't want to analyse your code and even use it for set of reasons...

First of all, a common error within VBA programming is to used unspecified (undeclared) variables. This causes several issues, especially when a programmer have made a spelling mistake (typing error), for example instead of myvariable he used myvairable. So...
It's strongly recommended to use Option Explicit statement, because... as MSDN documentation states:

If you do not specify a data type, the Variant data type is assigned by default.

(...)

Variables of type Variant require more memory resources than most other variables

(...)

If a module includes the Option Explicit statement, a compile-time error will occur when Visual Basic encounters a variable name that has not been previously declared, or that has been spelled incorrectly.

For further details, please see:
Wikipedia: Visual Basic for Applications
VBA: Declaring Variables
Runtime vs Compile time
Office Talk: Working with VBA in the 32-bit and 64-bit Versions of Office 2010

Second of all, an Overflow error occurs when you try to make an assignment that exceeds the limitations of the target of the assignment. That error might be the reason of Excel crush.

Third of all, you should use code in context. Un-contextual usage of code might be the reason of several issues, such as loss of data.
Imagine: there are 2 opened workbooks. Both of them have the same set of sheets: Sheet1, Sheet2 and Sheet3. When you use Sheets("Sheet1").Range("A1") = "whatever" changes are made in active workbook, let's say Workbook1, but you wanted to make changes in Workbook2. Got it?
BTW: note, that Sheet is not the same as Worksheet
Sheets vs. Worksheets
So, a proper way to use code-in-context is:

Dim srcWsh As Worksheet Dim trgWsh As Worksheet  Set srcWsh = ThisWorkbook.Worksheets("Sheet1") 'you can use index too, see: Set trgWsh = Workbooks("Workbook2").Worksheets(2)  trgWsh.Range("A1") = srcWsh.Range("A1")  'finally, you have to clean up Set srcWsh = Nothing Set trgWsh = Nothing 

The same rules have to be used when you create or call procedure or function

Finally...
As to the method to reverse (unpivot) data...
I did use an example from MSDN: Using PIVOT and UNPIVOT, where these data:

VendorID    Emp1    Emp2    Emp3    Emp4    Emp5 1           4       3       5       4       4 2           4       1       5       5       5 3           4       3       5       4       4 4           4       2       5       5       4 5           5       1       5       5       5 

have to be "converted" into this form:

VendorID    Employee    Orders ----------- ----------- ------ 1            Emp1       4 1            Emp2       3  1            Emp3       5 1            Emp4       4 1            Emp5       4 2            Emp1       4 2            Emp2       1 2            Emp3       5 2            Emp4       5 2            Emp5       5 ... 

My code:

Option Explicit  Sub Test()     UnpivotData ThisWorkbook.Worksheets("Arkusz1"), _         ThisWorkbook.Worksheets("Arkusz2"), _         "A1", "B1:F1" End Sub   Sub UnpivotData(ByVal srcWsh As Worksheet, ByVal trgWsh As Worksheet, ByVal unpvtFor As String, ByVal pivotedColumns As String, _     Optional ByVal commonHeader As String = "Employee", Optional ByVal pvtValuesToCol As String = "Orders")      'declare variables     Dim lastrow As Long, r As Long, trgr As Long     Dim c As Long, cName As String      'on error go to error handler     On Error GoTo Err_UnpivotData      'find last row     lastrow = srcWsh.UsedRange.Rows.Count      'context!     With trgWsh         'clear         .Cells.Clear         'add headers         .Range("A1") = srcWsh.Range(unpvtFor)         .Range("B1") = commonHeader         .Range("C1") = pvtValuesToCol         '"convert" values         r = 1         trgr = 0         'loop through the collection of rows in srcWsh         Do While r < lastrow             'loop through the collection of pivoted columns in srcWsh             For c = 0 To srcWsh.Range(pivotedColumns).Columns.Count - 1                 'unpivot value of 1. column                 .Range("A2").Offset(RowOffset:=trgr, ColumnOffset:=0) = srcWsh.Range(unpvtFor).Offset(RowOffset:=r, ColumnOffset:=0)                 'unpivot header                 cName = srcWsh.Range(pivotedColumns).Columns(c + 1).Address                 .Range("A2").Offset(RowOffset:=trgr, ColumnOffset:=1) = srcWsh.Range(cName).Rows(1)                 'unpivot value                 .Range("A2").Offset(RowOffset:=trgr, ColumnOffset:=2) = srcWsh.Range(unpvtFor).Offset(RowOffset:=r, ColumnOffset:=c + 1)                 'increase target counter                 trgr = trgr + 1             Next             'increase source counter             r = r + 1         Loop     End With  Exit_UnpivotData:     On Error Resume Next     'clean up      Exit Sub  Err_UnpivotData:     MsgBox Err.Description, vbExclamation, Err.Number     Resume Exit_UnpivotData End Sub 

Feel free to change it to your needs...

Working example: Unpivot.xlsm - available to download between 7:01AM and 11:59PM Central Europe (Warsaw) Time

I hope i've explained in details what's wrong with your code.

[EDIT]
Assuming that data are in Sheet1 and target sheet is Sheet2...

Option Explicit  Sub Test()      UnpivotData ThisWorkbook.Worksheets("Sheet1"), _         ThisWorkbook.Worksheets("Sheet2"), _         "A1:C1", "D1:AW1" End Sub   Sub UnpivotData(ByVal srcWsh As Worksheet, ByVal trgWsh As Worksheet, ByVal unpvtFor As String, ByVal pivotedColumns As String, _     Optional ByVal commonHeader As String = "Attribute", Optional ByVal pvtValuesToCol As String = "Value")      'declare variables     Dim lastrow As Long, r As Long, trgr As Long     Dim c As Long, cName As String     Dim cc As Range      'on error go to error handler     On Error GoTo Err_UnpivotData      'find last row     lastrow = srcWsh.UsedRange.Rows.Count      'context!     With trgWsh         'clear         .Cells.Clear         'add headers         For Each cc In srcWsh.Range(unpvtFor).Cells             .Range("A1").Offset(ColumnOffset:=c) = Trim(cc)             c = c + 1         Next         Set cc = .Range("A2").Offset(ColumnOffset:=c)         .Range("A1").Offset(ColumnOffset:=c) = commonHeader         c = c + 1         .Range("A1").Offset(ColumnOffset:=c) = pvtValuesToCol         '"convert" values         r = 1         trgr = 0         'loop through the collection of rows in srcWsh         Do While r < lastrow             'loop through the collection of pivoted columns in srcWsh             For c = 0 To srcWsh.Range(pivotedColumns).Columns.Count - 1                 'copy original data                 srcWsh.Range(unpvtFor).Offset(RowOffset:=r).Copy .Range("A2").Offset(RowOffset:=trgr)                 'unpivot data - attribute                 cName = srcWsh.Range(pivotedColumns).Columns(c + 1).Address                 cc.Offset(RowOffset:=trgr, ColumnOffset:=0) = Trim(srcWsh.Range(cName).Rows(1))                 'unpivot data - value                 cc.Offset(RowOffset:=trgr, ColumnOffset:=1) = Trim(srcWsh.Range(cName).Offset(RowOffset:=r))                 'increase target counter                 trgr = trgr + 1             Next             'increase source counter             r = r + 1         Loop     End With  Exit_UnpivotData:     On Error Resume Next     'clean up     Set cc = Nothing     Exit Sub  Err_UnpivotData:     MsgBox Err.Description, vbExclamation, Err.Number     Resume Exit_UnpivotData End Sub 

Good luck!

Answers 2

Try this:

Sub Unpivot()     Call ReversePivotTable("Sheet1", "A", "C", "Sheet2", "Name") End Sub    Sub ReversePivotTable(source_sheet, from_col, to_col, target_sheet, Optional type_header = "type", Optional value_header = "value")      Application.ScreenUpdating = False     LAST_ROW = Sheets(source_sheet).Cells(Rows.Count, 1).End(xlUp).Row     If LAST_ROW > 1 Then         Sheets(target_sheet).Cells.ClearContents     Else         Exit Sub     End If      pvt_type_col = Sheets(target_sheet).Range(to_col & 1).Offset(0, 1).Column 'D     pvt_value_col = Sheets(target_sheet).Range(to_col & 1).Offset(0, 2).Column 'E      'get headers     Sheets(source_sheet).Range(from_col & ":" & to_col).Copy     Sheets(target_sheet).Range("A1").PasteSpecial xlPasteValues     Sheets(target_sheet).Cells(1, pvt_type_col).Value = type_header     Sheets(target_sheet).Cells(1, pvt_value_col).Value = value_header      'tranform data     curr_row = 2     With Sheets(source_sheet)         last_col = .Cells(1, Columns.Count).End(xlToLeft).Column             For Each c In .Range("A2", .Range("A" & Rows.Count).End(xlUp))                 Set Rng = .Range(.Cells(c.Row, pvt_type_col), .Cells(c.Row, last_col))                 numbers = Application.WorksheetFunction.CountIf(Rng, "<>""")                 If numbers > 0 Then                     Sheets(target_sheet).Range(from_col & curr_row & ":" & from_col & curr_row + numbers - 1).Value = Sheets(source_sheet).Range(from_col & c.Row & ":" & to_col & c.Row).Value                     Application.CutCopyMode = False                     b = curr_row                     For a = pvt_type_col To last_col Step 1                         If IsNumeric(.Cells(c.Row, a).Value) Then                         'If .Cells(c.Row, a).Value <> "" Then                             Sheets(target_sheet).Cells(b, pvt_type_col) = .Cells(1, a)                             Sheets(target_sheet).Cells(b, pvt_value_col) = .Cells(c.Row, a)                             b = b + 1                         End If                     Next a                     curr_row = curr_row + numbers                     If curr_row Mod 10 = 0 Then DoEvents                 End If             Next c     End With     Sheets(target_sheet).Select     Application.CutCopyMode = False     Application.ScreenUpdating = True  End Sub 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment