macro to re-arrange data - vba

I have been trying to write a macro to re-arrange the Cells in the rows and columns of Stock tables for the output I desire. Luckily the Stock Tables are generally the same each and every time (Different names and values), and the desired outcome is the same format..
Here is some example Data.
A
1 Name
2 description
3 description
4 description
5 description
6 ID#: 56284
7 Quantity in stock: 34
8 Zoom In and Configure
B
1 Name
2 description
3 description
4 description
5 description
6 ID#: 56284
7 Quantity in stock: 50
8 Zoom In and Configure
And I would like the Output to go into something like this(If possible to sheet2 starting on Cell B2):
B C E
B Being Row 1
C being Row 2 3 4 and 5 Combined
E being JUST Row 7 Stock Value I.E 50
On a single spreadsheet there would be 4 columns, and 8 rows I would have to re-arrange.. Making 32 total.
It would be great to automated this, so any help would be greatly appreciated.

Let me clarify my understanding. For each column you want the following data format:
A A
1 Name 1 Name
2 Desc1 2 Desc1; Desc2; Desc3; Desc4
3 Desc2 On sheet 2 3 50
4 Desc3 --------------->
5 Desc4
6 Id#: 56284
7 Quantity in Stock: 50
8 Zoom in and configure
If this is the case you can use the following code. It assumes your data is in A1 to D8 in Sheet 1.
Sub FormatData()
Dim col As Integer
For col = 1 To 4
With Worksheets(2)
.Cells(1, col) = Cells(1, col) //Get name
.Cells(2, col) = Cells(2, col) & "; " & Cells(3, col) & "; " & Cells(4, col) & "; " & Cells(5, col) //Concatenate descriptions into single string
.Cells(3, col) = Cells(7, col) //Get quantity in stock
End With
Next col
End Sub

Related

VBA running sum

Let's say I have 2 columns (the following table includes the result)
Product ID Price Average
1 4 5
1 4 5
1 7 5
2 3 3
2 3 3
3 9 9
I want to be able to write a VBA code to loop through the rows of Product IDs and create the 3rd column which has average out the Prices.
I guess a For statement would work, but how do I define temp variables to store each ID?
Thanks!
As Vasily and L.Dutch told, AVERAGEIF() function is all you need. If you want to loop it through all cells, you can use Do While loop like this:
Sub avg()
Dim i As Integer
i = 2
Do While Range("A" & i).Value <> ""
Range("C" & i).FormulaR1C1 = "=AVERAGEIF(C1,RC1,C2)"
i = i + 1
Loop
End Sub

Attempting to Write a Loop in VBA

I am currently trying to write a short loop to condense a list of received items into a concise itemized report. I scan the barcode of each item I receive and it goes into Column A, if there is a quantity of more than 1 it goes into Column B.
Here is my thought process in order to remove all duplicates of items in column A and combine their totals in B:
Count the numbers of lines in column A, set as 'N'
Check all cells in column B up to 'N' and set blank cells to 1
Compare A1 to A2 thru AN, if the same combine B values and delete the line (If A1 and A2 matched, and both B cell values are 1, then A1 remains the same, B1 now has a value of 2, and the second line gets deleted.)
Repeat the loop for all values of A up to AN-1 compared to AN.
I know N will need to be reduced after each row deletion and I am pretty new to VBA so I always have trouble writing loops.
Any suggestions at pages to look at or simple structures I could use in my code would be greatly appreciated.
EDIT: Trying to turn table 1 into table 2
Table 1 ----------------------------- Table 2
Column A Column B | Column A Column B
11233 | 11233 4
11233 2 | 9987 7
9987 | 7452 1
11233 |
9987 6 |
7452 |
Sub Summator()
ActiveSheet.Columns("A:B").Sort Key1:=ActiveSheet.Range("A2"), Order1:=xlAscending, Header:=xlGuess
lastRow = Range("A65000").End(xlUp).Row
For i = 1 To lastRow
If Cells(i, 2) = "" Then Cells(i, 2) = 1
Next i
For i = lastRow To 2 Step -1
If Cells(i, 1) = Cells(i - 1, 1) Then
Cells(i - 1, 2) = Cells(i - 1, 2) + Cells(i, 2)
Cells(i, 2).EntireRow.Delete
End If
Next i
End Sub

how do I conditionally subtract in Excel?

I am trying to do the following with knowing that column A and B are data and C is the result:
A B C
1 5 (B1-A1)=4
2 3 (B2-A1)=2
3 5 (B3-A1)=4
4 7 (B4-A2)=5
5 4 (B5-A2)=3
6 9 (B6-A2)=7
.
.
.
.
How do I do this automatically in Excel or in Excel Visual Basic?
Sub sequence()
Dim i As Integer
Dim j As Integer
i = 2
j = 2
For i = 2 To 25 Step 3
Cells(i, 3) = Cells(i, 2) - Cells(j, 1)
Cells(i + 1, 3) = Cells(i + 1, 2) - Cells(j, 1)
Cells(i + 2, 3) = Cells(i + 2, 2) - Cells(j, 1)
j = j + 1
Next i
End Sub
Here is the VBA code that solves.
You must define the range in for loop, currently it is set from 2nd Row to 25th Row.
A B C
1 4 =B2-A2
1 2 =B3-A3
1 3 =B4-A4
=A2+1 5 =B5-A5
=A3+1 6 =B6-A6
=A4+1 7 =B7-A7
=A5+1 6 =B8-A8
=A6+1 7 =B9-A9
=A7+1 9 =B10-A10
You can initiate your first 3 rows with 1 and then just add 1 in the 4th row column A; drag the formula down. Subsequently, you may then subtract Column B from Column A.
The only drawback is that your column A will not be a sequence incrementing by 1 every step instead a sequence stepping by 1 on every fourth occasion.
OFFSET with ROW() is your friend for any repeating n-th row/column problem.
=B1-OFFSET(A$1,ROUNDUP(ROW()/3,0)-1,0), copied down column C.
1 5 4
2 3 2
3 5 4
4 7 5
5 4 2
6 9 7
You can use the $ in the function ($B5-$A1) and drag the cursor with the cell over the C column to the last element written.

For each loop usage in VBA and retrieving the datas

I have the following data in sheet1.
TransId CustID Account Stake
1 1 NP1 10
2 1 NP1 11
3 1 NP1 12
4 1 NP1 13
5 1 NP1 14
6 2 NP2 15
7 2 NP2 16
8 2 NP2 17
9 2 NP2 18
10 2 NP2 19
11 3 NP3 20
12 3 NP3 21
13 3 NP3 22
14 3 NP3 23
15 3 NP3 24
and the following details in sheet2.
Account Agent master SuperMaster
NP1 1 5 4
NP2 9 5 6
NP3 4 3 7
NP4 8 3 2
NP5 2 7 8
NP6 8 10 2
I would need to to calculate in sheet3 that, for each customerId in table, I need to consider all the TransId and the relevant stake & Account. Then i should compare account in sheet2 and retrieve the values of agent, master and Supermaster. Therefore my final calculation in sheet3 would be,
for each CustId, transId1(stake*agent*master*supermaster) + transId2(same as 1) and goes on until TransId5, since there are 5 transactions in CutomerId1.
Kindly guide me how do I do this in VBA ? (I am new to programming & VBA)
In my opinion, the easiest way to go about this is using vlookup and pivot tables. I tried for a bit to set something up purely in vba, I know it's possible, but for me this was much easier. This will produce a table on sheet1 that you can run a pivot table off of to produce the result you want.
Sub Main()
Dim rowCount1, rowCount2 As Integer
rowCount1 = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
rowCount2 = Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row
Sheets("Sheet1").Range("E1").Value = "Agent"
Sheets("Sheet1").Range("F1").Value = "Master"
Sheets("Sheet1").Range("G1").Value = "SuperMaster"
Sheets("Sheet1").Range("H1").Value = "Sum"
Dim x As Integer
For x = 2 To rowCount1
Sheets("Sheet1").Range("E" & x).Formula = "=vlookup(C" & x & _
",Sheet2!A1:D" & rowCount2 & ",2,false)"
Sheets("Sheet1").Range("F" & x).Formula = "=vlookup(C" & x & _
",Sheet2!A1:D" & rowCount2 & ",3,false)"
Sheets("Sheet1").Range("G" & x).Formula = "=vlookup(C" & x & _
",Sheet2!A1:D" & rowCount2 & ",4,false)"
Sheets("Sheet1").Range("H" & x).Formula = "=product(D" & x & ":G" & x & ")"
Next x
End Sub
Then on sheet 3, using a pivot table on the data from sheet 1, you get
Row Labels Sum of Sum
1 1200
2 22950
3 9240
Grand Total 33390

Excel Combining/Concatenating one column based on the value of another

I apologise if this question already exists, I searched for a while but couldn't find anything.
I have 2 columns in Excel and I need to concatenate the values of 1 column where the values of another are the same. As an example I have this:
A | B
12 | Value 1
10 | Value 2
13 | Value 3
12 | Value 4
10 | Value 5
And I would like to get out:
A | B
12 | Value 1, Value 4
10 | Value 2, Value 5
13 | Value 3
I have thousands of rows and ideally I would like it to create a new worksheet with the results and not destroy the existing sheet. There are also some blank values in column B which I would like it to ignore and not concatenate.
Thanks in advance.
Try this:
Sub combineValues()
Dim dic As Dictionary
Dim key, val, i, p, k
Set dic = New Dictionary
For i = 1 To Worksheets(1).Range("A65536").End(xlUp).Row
key = Worksheets(1).Cells(i, 1).Value
val = Worksheets(1).Cells(i, 2).Value
If dic.Exists(key) Then
dic.Item(key) = dic.Item(key) & ", " & val
Else
dic.Add key, val
End If
Next
p = 1
For Each k In dic.Keys
Worksheets(2).Cells(p, 1) = k
Worksheets(2).Cells(p, 2) = dic.Item(k)
p = p + 1
Next
End Sub
Note that you'll have to include "Microsoft Scripting Runtime" in "Reference" in order to use Dictionary.
Tested with following [Sheet 1]:
1 value 1
2 value 2
3 value 3
1 value 4
1 value 5
3 value 6
3 value 7
2 value 8
1 value 9
2 value 10
2 value 11
2 value 12
Results in following [Sheet 2]:
1 value 1, value 4, value 5, value 9
2 value 2, value 8, value 10, value 11, value 12
3 value 3, value 6, value 7
I have found that Passerby's answer works beautifully, but in my case, I have several columns that I run this on and in some cases there are empty cells. To avoid getting , , , entries, I added this:
If val <> "" Then
before
dic.Item(key) = dic.Item(key) & ", " & val