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
Related
Hi I have an Excel table column a below
RowNo ID CancelledBy
1 12345 Provider
2 12345 Provider
3 12345 Patient
4 12345 Patient
5 12345 Patient
6 12345 Provider
7 12345 Patient
8 12345 Provider
9 54321 Patient
10 54321 Provider
11 54321 Provider
12 54321 Patient
13 54321 Provider
From the above table I would like to pick those rows if a row contain "provider" and the immediate next row contain "Patient" then I would like to extract the two rows for that patient.
Basically "provider" rows followed by "patient" rows like the below.
RowNo ID CancelledBy
2 12345 Provider
3 12345 Patient
6 12345 Provider
7 12345 Patient
11 54321 Provider
12 54321 Patient
Is there a excel formula/vbscript or macro that will do this. I tried all day but no joy.
thanks
Edited The following might help. Data is supposed to be in sheet "MyData" (with a command button), results are written in sheet "Extracted". Code can be shortened, but I leave it hard coded for readability.
Sub Button1_Click()
Dim lLastRow As Long
Dim i As Integer
Dim k As Integer
lLastRow = Worksheets("MyData").UsedRange.Rows.Count
k = 1
For i = 1 To lLastRow
If ((Worksheets("MyData").Cells(i, 3) = "Provider" And Worksheets("MyData").Cells(i + 1, 3) = "Patient") And (Worksheets("MyData").Cells(i, 2).Value = Worksheets("MyData").Cells(i + 1, 2).Value)) Then
Worksheets("Extracted").Cells(k, 1) = Worksheets("MyData").Cells(i, 1)
Worksheets("Extracted").Cells(k, 2) = Worksheets("MyData").Cells(i, 2)
Worksheets("Extracted").Cells(k, 3) = Worksheets("MyData").Cells(i, 3)
Worksheets("Extracted").Cells(k + 1, 1) = Worksheets("MyData").Cells(i + 1, 1)
Worksheets("Extracted").Cells(k + 1, 2) = Worksheets("MyData").Cells(i + 1, 2)
Worksheets("Extracted").Cells(k + 1, 3) = Worksheets("MyData").Cells(i + 1, 3)
k = k + 2
End If
Next
End Sub
Lets say your data is in col A and B starting from row 2. use these formulas
C2 =AND(B2="Provider",B3="Patient")
Fill formula all the way down
D2 =IF(MOD(ROW(D2)-ROW($D$2),2)=0,1/AGGREGATE(14,6,1/(--($C$2:$C$14)*(ROW($C$2:$C$14))*(ROW($C$2:$C$14)>1)),1),1)
D3 =IF(MOD(ROW(D3)-ROW($D$2),2)=0,1/AGGREGATE(14,6,1/(--($C$2:$C$14)*(ROW($C$2:$C$14))*(ROW($C$2:$C$14)>D2-1)),1),D2+1)
Fill D3 down until you start getting #NUM. This populates all the row numbers that you need to get the data from.
E2 =INDEX($A$1:$B$14,D2,1)
F2 =INDEX($A$1:$B$14,D2,2)
Fill E2:F2 all the way down. This should populate your desired result.
Edit:
Revised INDEX formulas
you can try this:
if "CancelledBy" is in column C you can use this formula in D2
=IF(OR(AND(C2="provider",D1=1),AND(C2="Provider",C3="Patient")),1,0)
then copy to all rows from D3 to D14
All rows you need will be equal to 1 then you can filter column D with 1 value.
I hope this can help.
Thanks
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.
I have my excel sheet like this:
A | B
-----
0 | 2
0 | 3
0 | 4
0 | 5
0 | 6
0 | 7
1 | 8
1 | 9
1 | 10
1 | 11
1 | 12
2 | 13
2 | 14
...
How do I get the value of B for the last occurrence of each value in A?
The output is -
C | D
0 | 7
1 | 12
2 | 14
Is there an easy way of doing this? Thanks!
Assuming you already have 0, 1, 2 etc. listed in C1 down then use this formula In D1 copied down
=LOOKUP(C1,A:B)
Highlight the entire table.
On Data tab, in the Outline pane click the Subtotals button.
In the At change in... box, select A.
At the Use function box, select Max.
In the Add Subtotal to box make sure B has a check mark
Click OK.
Use the dashes to collapse each section.
That will avoid any programming or formulas and leave the data intact.
To get the last value in column A use this formula:
=INDEX(A:A, COUNTA(A:A), 1)
The following will get the last value in column B:
=INDEX(B:B, COUNTA(B:B), 1)
A sample using a macro:
Sub LastValueInB()
VarA = Range("A1").Value
VarB = Range("B1").Value
Output = ""
For i = 1 To 10
If Range("A" & i).Value = VarA Then
VarB = Range("B" & i).Value
Else
Output = Output + VarA & VarB & vbCrLf
VarA = Range("A" & i).Value
End If
Next i
MsgBox Output
End Sub
I have to manipulate range of cells in excel using VB. Can I do it in the following manner ?
Range("a1:b5")=[1 2 3 4 5 6 7 8 9 0]
I don't think so, I've never seen that syntax. One thing you can do is something like:
For Row = 1 To 5
Range("a" + CStr(Row)).Value = Row
Range("b" + CStr(Row)).Value = (Row + 5) Mod 10
Next Row
assuming that you want it set up thus:
A B
+------
1 | 1 6
2 | 2 7
3 | 3 8
4 | 4 9
5 | 5 0
You may need to use Mid(CStr(Row),2) - I can't remember off the top of my head if Cstr gives you a leading space for non-negative numbers.
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