Macro to compare old prices with new prices for stock and show(-/+)

KalilMe

Active Member
Joined
Mar 5, 2021
Messages
382
Office Version
  1. 2016
Platform
  1. Windows
Hello,
in QW sheet will be multiple columns contain prices and every time I will add new column contain new prices .
in STOCK sheet contains data in columns A:E
what I want create report in columns G:L with formatting and borders by brings the prices from last column in QW sheet and put in column J , as to column K=column I* column J
column L =column K- column E
in lastrow for column G when amount is minus in column L then populate LOSE word ,amount is plus in column L then populate PROFIT word.
if there is empty cell in last column in QW when brings price from previous column(not the first column) for instance if there is price in columnL,M,N and if the id doesn't existed price in column N then will brings from column M .
when create report will match BATCH column for two sheets , also if there is ID in STOCK sheet and it's not existed in QW sheet then will show as in STOCK sheet.


subtra.xlsm
JKLM
1ITEMBATCH01/11/202402/11/2024
21APP PP FRUIT12.0011.00
32BAN FF FRUIT9.00
43CU CMC VEG11.0011.00
54FRU BANN MU22.0023.00
65PI PIA FRUIT21.0021.00
76PO PTT VEG12.0011.00
87TO TMA VEG5.004.00
98TE TEE FOOD23.0018.00
109TRB POT BNG22.0024.00
QW




subtra.xlsm
ABCDEFGHIJKLMNO
1ITEMBATCHQTYUNIT PRICETOTAL
21TO TMA VEG10.005.0050.00
32PO PTT VEG20.0010.00200.00
43BAN FF FRUIT100.0012.001,200.00
54APP PP FRUIT100.0010.001,000.00
65PI PIA FRUIT12.0022.00264.00
76TE TEE FOOD100.0023.002,300.00
87CU CMC VEG120.0021.002,520.00
98TRB POT BNG100.0022.002,200.00
109FRU BANN MU124.0022.002,728.00
11
12
13
14
STOCK



result
subtra.xlsm
ABCDEFGHIJKLMNO
1ITEMBATCHQTYUNIT PRICETOTALITEMBATCHQTYUNIT PRICETOTALD/P
21TO TMA VEG10.005.0050.001TO TMA VEG10.004.0040.00-10.00
32PO PTT VEG20.0010.00200.002PO PTT VEG20.0011.00220.0020.00
43BAN FF FRUIT100.0012.001,200.003BAN FF FRUIT100.009.00900.00-300.00
54APP PP FRUIT100.0010.001,000.004APP PP FRUIT100.0011.001,100.00100.00
65PI PIA FRUIT12.0022.00264.005PI PIA FRUIT12.0021.00252.00-12.00
76TE TEE FOOD100.0023.002,300.006TE TEE FOOD100.0018.001,800.00-500.00
87CU CMC VEG120.0021.002,520.007CU CMC VEG120.0011.001,320.00-1,200.00
98TRB POT BNG100.0022.002,200.008TRB POT BNG100.0024.002,400.00200.00
109FRU BANN MU124.0022.002,728.009FRU BANN MU124.0023.002,852.00124.00
11LOSE-1,578.00
12
13
STOCK
Cell Formulas
RangeFormula
L2:L10L2=K2-E2
L11L11=SUM(L2:L10)

I need macro , I don't PQ or PT , formulas
thanks
 

Excel Facts

How to total the visible cells?
From the first blank cell below a filtered data set, press Alt+=. Instead of SUM, you will get SUBTOTAL(9,)
I have modified code. Pl try.
thanks
may you see file in post#42 how show average price by brings from QW sheet and D for STOCK sheet ?
I put in column K how should be.
 
Upvote 0
Code:
Sub test()
    Dim s$(1), i&, x&, r As Range, c As Range, ws As Worksheet
    Application.ScreenUpdating = False
    Set ws = Sheets("stock")
    ws.Columns("g:m").Clear
    With Sheets("qw")
        With .Range("j1", .Cells.SpecialCells(11))
            Set r = .Columns(.Columns.Count + 1)
            r.Cells(1) = "UP"
            r.Cells(2).FormulaArray = Replace("=index(#,max(if(#<>"""",column(#)-9)))", "#", "rc10:rc[-1]")
            r.Cells(2).Resize(r.Rows.Count - 1).FillDown
        End With
    End With
    s(1) = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=Yes';"
    s(0) = "Select A.`ITEM`, A.`BATCH`, A.`QTY`, IIf(IsNull(B.`UP`), A.`UNIT PRICE`, B.`UP`) As `UNIT PRICE`, " & _
        "IIf(IsNull(B.`UP`),Null,(B.`UP` + A.`UNIT PRICE`) /2) As `AVG U/P`,IIf(IsNull(B.`UP`), A.`TOTAL`, " & _
        "A.`QTY` * B.`UP`) As `TOTAL`, A.`QTY` * B.`UP` - A.`TOTAL` As `D/P` " & _
        "From `STOCK$` As A Left Join `QW$` As B On A.`BATCH` = B.`BATCH`;"
    With CreateObject("ADODB.Recordset")
        .Open s(0), s(1), 3, 3, 1
        For i = 0 To .Fields.Count - 1
            ws.Cells(1, i + 7) = .Fields(i).Name
        Next
        ws.[g2].CopyFromRecordset .DataSource
    End With
    r.Clear
    With ws.[g1].CurrentRegion
        .HorizontalAlignment = xlCenter
        .Columns("d:l").NumberFormat = "#,0.00"
        Union(.Rows(1), .Rows(.Rows.Count + 1)).Font.Bold = True
        Set c = .Cells(.Rows.Count + 1, .Columns.Count)
        c.Formula = "=sum(r2c:r[-1]c)"
        .Cells(.Rows.Count + 1, 1) = IIf(c > 0, "GAIN", "LOOSE")
        .EntireColumn.AutoFit
        .Resize(.Rows.Count + 1).Borders.Weight = 2
    End With
    Application.ScreenUpdating = True
End Sub
sub (1).xlsm
GHIJKLM
1ITEMBATCHQTYUNIT PRICEAVG U/PTOTALD/P
21TO TMA VEG104.004.5040.00-10.00
32PO PTT VEG2011.0010.50220.0020.00
43BAN FF FRUIT1009.0010.50900.00-300.00
54APP PP FRUIT10011.0010.501,100.00100.00
65PI PIA FRUIT1221.0021.50252.00-12.00
76TE TEE FOOD10018.0020.501,800.00-500.00
87CU CMC VEG12011.0016.001,320.00-1,200.00
98TRB POT BNG10024.0023.002,400.00200.00
109FRU BANN MU12423.0022.502,852.00124.00
1110FRU TT MU12418.002,728.00
12LOOSE-1,578.00
STOCK
Cell Formulas
RangeFormula
M12M12=SUM(M$2:M11)
 
Upvote 0
You have marked post #13 as the correct solution. Is that still the case?
You did not answer that question but I note that the Mark as solution has been removed. So, if we are reverting to not averaging but using the value from 'QW' if it exists or else the value from 'STOCK' then

Excel Formula:
Sub PROFITorLOSE_v4()
  Dim d As Object
  Dim a As Variant
  Dim i As Long, j As Long, cols As Long
  Dim OT As Double, GT As Double
 
  Set d = CreateObject("Scripting.Dictionary")
  With Sheets("QW")
    a = .Range("K1").Resize(.Cells(Rows.Count, "K").End(xlUp).Row, .Cells(1, Columns.Count).End(xlToLeft).Column - 10)
  End With
  cols = UBound(a, 2)
  For i = 2 To UBound(a)
    For j = cols To 2 Step -1
      If Len(a(i, j)) > 0 Then
        d(a(i, 1)) = a(i, j)
        Exit For
      End If
    Next j
  Next i
  With Sheets("STOCK")
    a = .Range("A1:F1").Resize(.Range("A" & Rows.Count).End(xlUp).Row + 1).Value
    a(1, 6) = "D/P"
    For i = 2 To UBound(a) - 1
      a(i, 4) = IIf(d.exists(a(i, 2)), d(a(i, 2)), a(i, 4))
      OT = a(i, 5)
      a(i, 5) = a(i, 3) * a(i, 4)
      a(i, 6) = a(i, 5) - OT
      GT = GT + a(i, 6)
    Next i
    a(UBound(a), 6) = GT
    a(UBound(a), 1) = IIf(GT >= 0, "PROFIT", "LOSE")
    .Columns("G:L").Delete
    With .Range("G1").Resize(UBound(a), 6)
      .Value = a
      .Columns(3).Resize(, 4).NumberFormat = "#,##0.00"
      Union(.Rows(1), .Cells(UBound(a), 1)).Font.Bold = True
      .Columns.AutoFit
      .Borders.LineStyle = xlContinuous
    End With
  End With
End Sub

KalilMe_sub.xlsm
JKLM
1ITEMBATCH1/11/20242/11/2024
21APP PP FRUIT12.0011.00
32BAN FF FRUIT9.00
43CU CMC VEG11.0011.00
54FRU BANN MU22.0023.00
65PI PIA FRUIT21.0021.00
76PO PTT VEG12.0011.00
87TO TMA VEG5.004.00
98TE TEE FOOD23.0018.00
109TRB POT BNG22.0024.00
QW


In the sheet below, note that I have altered E11 so that it is the result of multiplying C11 by D11.

KalilMe_sub.xlsm
ABCDEFGHIJKL
1ITEMBATCHQTYUNIT PRICETOTALITEMBATCHQTYUNIT PRICETOTALD/P
21TO TMA VEG10.005.0050.001TO TMA VEG10.004.0040.00-10.00
32PO PTT VEG20.0010.00200.002PO PTT VEG20.0011.00220.0020.00
43BAN FF FRUIT100.0012.001,200.003BAN FF FRUIT100.009.00900.00-300.00
54APP PP FRUIT100.0010.001,000.004APP PP FRUIT100.0011.001,100.00100.00
65PI PIA FRUIT12.0022.00264.005PI PIA FRUIT12.0021.00252.00-12.00
76TE TEE FOOD100.0023.002,300.006TE TEE FOOD100.0018.001,800.00-500.00
87CU CMC VEG120.0021.002,520.007CU CMC VEG120.0011.001,320.00-1,200.00
98TRB POT BNG100.0022.002,200.008TRB POT BNG100.0024.002,400.00200.00
109FRU BANN MU124.0022.002,728.009FRU BANN MU124.0023.002,852.00124.00
1110FRU TT MU124.0018.002,232.0010FRU TT MU124.0018.002,232.000.00
12LOSE-1,578.00
13
STOCK
 
Upvote 0
You did not answer that question
actually I did it in post#49
so your suggestion still solve my requirements.
but I note that the Mark as solution has been removed
yes this is before inform me my bad about calculation . after that I remarked solved. ;)

So, if we are reverting to not averaging but using the value from 'QW' if it exists or else the value from 'STOCK' then
this is is really good , but currently I would averages prices.
so I got a big help with multiple solutions .:)
 
Upvote 0
actually I did it in post#49
It wasn't clear to me whether post #13 was the accepted solution or something else.

So, as I understand it, as far as my suggestions go ..
  • Post #13 is a solution if averaging (where available) is required
  • Post #55 is a solution if averaging is not required.
Are those two things correct?
 
Upvote 0

Forum statistics

Threads
1,223,604
Messages
6,173,316
Members
452,510
Latest member
RCan29

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top