Advertisement
AlanElston

AddValuesInTheSameCell

Nov 25th, 2018
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Option Explicit ' http://www.eileenslounge.com/viewtopic.php?f=30&t=31294&p=242212#p242212
  2. '    We have two worksheets, a DATA  worksheet and a results worksheet.
  3. '    We have two similar data ranges in columns B:D:
  4. '    _ one data range in data worksheet
  5. '    and
  6. '    _ the other data range  in results worksheet.
  7. '    In column C in both worksheets are values.
  8. '    Columns B and D are some identifying Item number and supplier.
  9. '
  10. '     It appears that periodically the results worksheet will be updated  by adding the values in the data worksheet ( column C) to the values already  in the results worksheet ( column C). Possibly the supplier is also updated, this is unclear**
  11. '     Column B appears to be a  unique identifying  Item numbers. Possibly the supplier ( column D )  may change, that is not clear**.
  12. '    In the periodic updating, the results data will have the values ( column C)  from data worksheet added to its value ( column C ) , depending on the corresponding identifying  Item number being present in both the results worksheet and the DATA dictionary: This Existence is determined by checking for the Existence of the Key within the ###dictionary  with the Key name of the Item Number  from each row in column B in results worksheet
  13. '     The results worksheet will also have the supplier indicated in data worksheet for that item number updated. ( In the supplied test data the supplier never changes for a particular Item number, so this makes the situation unclear**  )
  14. '
  15. '    In the current codes a ###dictionary is used. This is built using the data from the data worksheet. No check is made for existing Keys, so this suggests that Item numbers won't be repeated in the data worksheet. If they are repeated  then that furthest down will be taken and the previous ignored/ overwritten.
  16. '    I personally would not have used a dictionary approach for this. The dictionary approach might make the final code a bit more efficient, but it does make things a lot more confusing
  17. '    I am also wondering if the code is doing the things the wrong way around: it might have been   better to make the dictionary using the results Item numbers as keys. That way if item numbers were repeated in the data, then all new data values would be added…
  18. '     **Once again, the supplied test data should have been better chosen, in my opinion, to better show all possible scenarios.
  19.  
  20. Sub AddValuesInTheSameCell()
  21. Rem 1 input and output existing data
  22. '1a) Input DATA range without header
  23. Dim vItems() As Variant: let vItems() = Sheet1.Range("B2", Sheet1.Cells(Rows.Count, "B").End(xlUp)).Resize(, 3).Value
  24. '1b) results sheet, column B items ( no header )
  25. Dim vData() As Variant: Let vData() = Sheet2.Range("B2", Sheet2.Cells(Rows.Count, "B").End(xlUp)).Value
  26. '1c) results sheet, column c-d ( no header )
  27. Dim vOut() As Variant: Let vOut() = Sheet2.Range("B2", Sheet2.Cells(Rows.Count, "B").End(xlUp)).Offset(, 1).Resize(, 2).Value
  28. Rem 2 A dictionary will be made from the new DATA, then the results will be added to using that DATA
  29.     With Sheet2.Range("B2", Sheet2.Cells(Rows.Count, "B").End(xlUp))
  30.         With CreateObject("Scripting.Dictionary")
  31.             .CompareMode = 1
  32.         Dim i As Long
  33.         '2a Build DATA Dictionary  Key:= as Item 1, Item 2 etc,  Item:= as C value & "|" & suppliers
  34.            For i = LBound(vItems()) To UBound(vItems())
  35.                 .Item(vItems(i, 1)) = vItems(i, 2) & "|" & vItems(i, 3) 'like for row 2 data  item(Item 1) = "|Resource Name 1"  for first with empty C2   for second   "1000|Resource Name 2"    - so it is a concatenation of the value in C and the suppliers in D
  36.            Next i
  37.         '2c Now go down results data, and if we have an Item number that is in the new DATA dictionary, then we may want to add the value if there is one, (and also we update the suppier**)
  38.            For i = LBound(vData()) To UBound(vData()) ' vData() is Item Number column B of results worksheet
  39.                If .Exists(vData(i, 1)) Then ' look for the Key of  Item 1, Item 2  etc in current results,
  40.                    If Split(.Item(vData(i, 1)), "|")(0) = "" Or Split(.Item(vData(i, 1)), "|")(0) = 0 Then
  41.                     'Do Nothing
  42.                    Else ' case of data value in data sheet c column
  43.                     vOut(i, 1) = Split(.Item(vData(i, 1)), "|")(0) + vOut(i, 1) ' The new data number  is added to the current number already in results column C
  44.                     vOut(i, 2) = Split(.Item(vData(i, 1)), "|")(1) ' update the supplier**
  45.                    End If
  46.                 Else ' The Item number in column B of results is not in the new DATA dictionary Key names list
  47.                End If
  48.             Next i ' effectively go to next row in results worksheet
  49.        End With
  50.         .Offset(, 1).Resize(, 2).Value = vOut()
  51.     End With
  52. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement