Results 1 to 4 of 4

Thread: Develop a macro to solve below problem

  1. #1

    Thread Starter
    New Member
    Join Date
    Feb 2016
    Posts
    1

    Develop a macro to solve below problem

    Here is the problem


    Sheet 1 - file 1 is base datafile thats maps our master product file with master product file received from our suppliers / merchants listing supplier product code to our product code, and supplier name to our name. This is prepared basis a one time exercise.
    Sheet 1 - file 2 is daily price list that we receive from the supplier in that format - it lists down supplier product code, supplier product name, MRP i.e. list price, selling price - at times this is at a discount to list price, and quantity available for sale.
    Sheet 1 - file 3 is the format in which we need output basis mapping of sheet 1 with sheet 2. Instructions are given against each field. We use file 3 to upload the file in our system that calculates final selling price to retail consumers. Our agents often refer this final file while discussing sales with potential customers.


    Here is the code . Please let me know what is the problem in the code . Not able to get it .

    Code:
    Public FPMfolder AsString'* the foldername
    Public FinalPM AsString'* the filename
    
    '* value below will hold the values based upon the value in B4
    Public DPMfolder AsString'* the foldername
    Public DailyPM AsString'* the filename
    
    Public OFolder AsString'* this will hold the foldername based upon the value in B5
    Public FinalOutput AsString'* this will hold the actual outputfile name
    
    Public wbTool As Workbook '* will be used to refer to the 'PriceMappingTool' file
    Public wsTool As Worksheet '* refer to sheet named 'Main'
    
    Public wbFPM As Workbook '* this will refer to the actual file named in B3
    Public wsFPM As Worksheet '* the sheet of the above file where the data is to be found
    
    Public wbDPM As Workbook '* this will refer to the actual file named in B4
    Public wsDPM As Worksheet '* the sheet of the above file where the data is to be found
    
    Public wbFPO As Workbook '* this will be used to refer to the file named on FinalOutput
    Public wsFPO1 As Worksheet '* the sheet where the output data will be written to Sheet(1)
    Public wsFPO2 As Worksheet '* the sheet where the output data will be written to Sheet(2)
    Public wsFPO3 As Worksheet '* the sheet where the output data will be written to Sheet(3)
    
    Public Merchant AsString'* if and when used to store the value of the selected Merchant's name
    Public Acronym AsString'* if and when used to store the corresponding Acronym of the selected Merchant
    
    Public ProcOK AsBoolean
    
    Public FSPLIT AsVariant'* used to extract filename and foldername from variable
    Public PressedState AsBoolean'* to trap Esc or Cancel button pressed
    
    PublicSub MapAndConsolidate()
    ProcOK =False: PressedState =False
    Set wbTool = Workbooks("PriceMappingTool.xlsm")
    Set wsTool = wbTool.Sheets("Main")
    wbTool.Activate
    If Len(Trim(wsTool.Range("B2")))=0Or Len(Trim(wsTool.Range("B3")))=0Or Len(Trim(wsTool.Range("B4")))=0Or Len(Trim(wsTool.Range("B5")))=0Then
    MsgBox "Please verify THAT all the input values have been entered!", vbCritical,"OPERATION ABORTED !!!"
    ExitSub
    EndIf
    
    Application.ScreenUpdating =False
    '* below sets all the variables based upon the input values
    FSPLIT = Split(wsTool.Range("B3").Value, Application.PathSeparator)
    FinalPM = FSPLIT(CInt(UBound(FSPLIT)))
    FPMfolder = Replace(wsTool.Range("B3").Value, FinalPM,"")
    If Right(FPMfolder,1)<> Application.PathSeparator Then FPMfolder = FPMfolder & Application.PathSeparator
    
    FSPLIT = Split(wsTool.Range("B4").Value, Application.PathSeparator)
    DailyPM = FSPLIT(CInt(UBound(FSPLIT)))
    DPMfolder = Replace(wsTool.Range("B4").Value, DailyPM,"")
    If Right(DPMfolder,1)<> Application.PathSeparator Then DPMfolder = DPMfolder & Application.PathSeparator
    
    OFolder = wsTool.Range("B5").Value
    If Right(OFolder,1)<> Application.PathSeparator Then OFolder = OFolder & Application.PathSeparator
    
    Merchant = wsTool.Range("B2").Value
    Acronym = findAcronym(wsTool.Range("B2").Value)
    If Len(Trim(Acronym))=0Then Acronym ="XXX"
    
    OnErrorResumeNext
    Set wbFPM = Workbooks(FinalPM)
    If wbFPM IsNothingThenSet wbFPM = Workbooks.Open(Filename:=FPMfolder & FinalPM,ReadOnly:=True)
    If wbFPM IsNothingThenGoTo exitNoGo
    
    Set wbDPM = Workbooks(DailyPM)
    If wbDPM IsNothingThenSet wbDPM = Workbooks.Open(Filename:=DPMfolder & DailyPM,ReadOnly:=True)
    If wbDPM IsNothingThenGoTo exitNoGo
    
    'Set wbFOP = Workbooks(FinalOutP)
    'If wbFOP Is Nothing Then Set wbFOP = Workbooks.Open(Filename:=filePath & Application.PathSeparator & FinalOutP)
    'If wbFOP Is Nothing Then GoTo exitNoGo
    
    FinalOutput ="Final_Output-"& Format(Now(),"dd-mm-yyyy-HHmm")&"_"& Trim(Acronym)&".xlsx"
    
    Err.Clear
    OnErrorGoTo0
    
    wbTool.Activate
    Application.ScreenUpdating =True
    If MsgBox("Base mapping file:"& vbCrLf & Chr(9)& wbFPM.Name & vbCrLf & _
    "Daily Price Master file:"& vbCrLf & Chr(9)& wbDPM.Name & vbCrLf & _
    "Output file:"& vbCrLf & Chr(9)& FinalOutput & vbCrLf & vbCrLf &"'OK' to continue?"& vbCrLf & vbCrLf & Chr(9)& _
    "press 'Ctlr + Break' to stop processing at any time", vbOKCancel,"Price Mapping Tool"& Space(5)&"HC&TS, 2015")<> vbOK ThenGoTo exitSub
    
    With Application
    .ScreenUpdating =False
    .EnableEvents =False
    .Calculation = xlCalculationManual
    .EnableCancelKey = xlDisabled
    EndWith
    Set wbFPO = Workbooks.Add
    wbFPO.SaveAs Filename:=OFolder & FinalOutput, FileFormat:=51
    
    '* the thre following rows adds the column headers to the three worksheets
    fillColumnHeaders ws:=Sheets(1)
    If wbFPO.Worksheets.Count =1Then wbFPO.Worksheets.Add
    fillColumnHeaders ws:=Sheets(2)
    If wbFPO.Worksheets.Count =2Then wbFPO.Worksheets.Add
    fillColumnHeaders ws:=Sheets(3)
    
    Set wsFPO1 = wbFPO.Sheets(1)
    wsFPO1.Name ="Price records found"
    Set wsFPO2 = wbFPO.Sheets(2)
    wsFPO2.Name ="no Price records found"
    Set wsFPO3 = wbFPO.Sheets(3)
    wsFPO3.Name ="multiple Price records found"
    
    wbFPO.Save
    wbDPM.Activate
    
    Dim tStart AsDate'* start timer
    Dim tStop AsDate'* stop timer
    Dim tEnd AsDate'* estimated end time
    Dim tmidnite AsDate'* extra timer value if the process is started before and ends after midnight (next day)
    
    tStart = Format(Now(),"hh:mm:ss")
    tmidnite = Format(TimeValue("23:59:59"),"hh:mm:ss")
    
    
    Dim FPMrng As Range '* range will refer to the data in the Final Product Mapping file
    Dim DPMrng As Range '* range will refer to the data in the Daily Price Master file receiveed from Supplier
    Dim lstFPMRow AsLong
    Dim lstDPMRow AsLong
    Dim FPMRow AsLong
    Dim DPMRow AsLong
    Dim FPO1Row AsLong
    Dim FPO2Row AsLong
    Dim FPO3Row AsLong
    
    Set wsFPM = wbFPM.Sheets("Final Matched")
    Set wsDPM = wbDPM.Sheets(1)
    
    lstFPMRow = WorksheetFunction.Max(2, wbFPM.Sheets(1).Range("A"& Rows.Count).End(xlUp).Row)'* determine the last filled row of FPM file
    lstDPMRow = WorksheetFunction.Max(2, wbDPM.Sheets(1).Range("A"& Rows.Count).End(xlUp).Row)'* determine the last filled row of DPM file
    FPO1Row =1: FPO2Row =1: FPO3Row =1
    
    OnErrorGoTo err_handler
    Application.EnableCancelKey = xlErrorHandler
    showProgressForm
    For DPMRow =2To lstDPMRow
    If DPMRow Mod50=0And lstDPMRow - DPMRow >50Then
    tEnd = Format(time2End(lstDPMRow - DPMRow, DPMRow, tStart),"HH:mm:ss")
    EndIf
    Application.StatusBar ="PriceMapping Consolidation ... "& Format(DPMRow / lstDPMRow,"#0.0%")& IIf(DPMRow >=50, Space(5)&"estimated completion time remaining: "& tEnd,"")
    If DPMRow >=50Then updateProgressMessage barMessage:="estimated completion time remaining: "& tEnd
    updateProgessBarForm iCount:=DPMRow, iTotal:=lstDPMRow
    With wsFPM.Range("A:A")
    Set FPMrng =.Find(What:=(wsDPM.Cells(DPMRow,1).Value), LookIn:=xlValues, LookAt:=xlWhole)
    IfNot FPMrng IsNothingThen
    GoSub PMPartI
    Else
    GoSub PMPart2
    EndIf
    EndWith
    If PressedState =TrueThen
    SelectCase MsgBox("You have pressed 'Esc' or 'Cancel'!"& vbCrLf & vbCrLf & _
    "Do you wish to stop the Price Mapping process?", vbExclamation + vbYesNo + vbDefaultButton2,"STOP PRICEMAPPING PROCESS?")
    CaseIs= vbYes:ExitFor
    CaseElse
    PressedState =False
    EndSelect
    EndIf
    Next DPMRow
    Err.Clear
    OnErrorGoTo0
    uldpbf
    wsFPO1.Cells.Columns.AutoFit
    wsFPO2.Cells.Columns.AutoFit
    wsFPO3.Cells.Columns.AutoFit
    GoTo endRoutine
    
    PMPartI:
    '* Part I: Price Information for System Upload where Price information is available
    FPMRow = FPMrng.Row
    FPO1Row = FPO1Row +1
    wsFPO1.Cells(FPO1Row,"A").Value = wsFPM.Cells(FPMRow,"C").Value '* sku
    wsFPO1.Cells(FPO1Row,"B").Value =""'* ean
    wsFPO1.Cells(FPO1Row,"C").Value = wsFPM.Cells(FPMRow,"D").Value '* name
    wsFPO1.Cells(FPO1Row,"D").Value =""'* status
    wsFPO1.Cells(FPO1Row,"E").Value = wsDPM.Cells(DPMRow,"C").Value '* price
    wsFPO1.Cells(FPO1Row,"F").Value = wsDPM.Cells(DPMRow,"E").Value '* qty
    wsFPO1.Cells(FPO1Row,"G").Value =""'* specialrice
    If wsDPM.Cells(DPMRow,"D").Value < wsDPM.Cells(DPMRow,"C").Value Then _
    wsFPO1.Cells(FPO1Row,"G").Value = wsDPM.Cells(DPMRow,"D").Value '* specialrice
    wsFPO1.Cells(FPO1Row,"H").Value =""'* specialate start
    wsFPO1.Cells(FPO1Row,"I").Value =""'* specialate end
    Return
    
    PMPart2:
    '* Part II: New worksheet to populate all items from Sheet 1 where price information was not found in Sheet 2
    FPO2Row = FPO2Row +1
    wsFPO2.Cells(FPO2Row,"A").Value = wsDPM.Cells(DPMRow,"A").Value '* sku
    wsFPO2.Cells(FPO2Row,"B").Value =""'* ean
    wsFPO2.Cells(FPO2Row,"C").Value = wsDPM.Cells(DPMRow,"B").Value '* name
    wsFPO2.Cells(FPO2Row,"D").Value =""'* status
    wsFPO2.Cells(FPO2Row,"E").Value = wsDPM.Cells(DPMRow,"C").Value '* price
    wsFPO2.Cells(FPO2Row,"F").Value = wsDPM.Cells(DPMRow,"E").Value '* qty
    wsFPO2.Cells(FPO2Row,"G").Value =""'* specialrice
    wsFPO2.Cells(FPO2Row,"H").Value =""'* specialate start
    wsFPO2.Cells(FPO2Row,"I").Value =""'* specialate end
    Return
    
    PMPart3:
    '* Part III: New worksheet to populate all duplicate items from Sheet 1 where price information was not found in Sheet 2
    FPO3Row =1
    '* no code written for this
    Return
    
    err_handler:
    If Err.Number =18Then PressedState =True
    Err.Clear
    Resume
    
    endRoutine:
    wbFPO.Save
    tStop = Format(Now(),"hh:mm:ss")
    ProcOK =True
    GoTo exitSub
    
    exitNoGo:
    With Application
    .ScreenUpdating =True
    .EnableEvents =True
    .Calculation = xlCalculationAutomatic
    .EnableCancelKey = xlInterrupt
    EndWith
    Application.ScreenUpdating =True
    MsgBox "One or more data files was not found or is not available!", vbExclamation,"OPERATION ABORTED"
    
    exitSub:
    Application.ScreenUpdating =True
    Application.StatusBar =False
    Err.Clear
    OnErrorResumeNext
    wbFPM.Close False
    wbDPM.Close False
    Set wbFPM =Nothing
    Set wbDPM =Nothing
    Set wbFPO =Nothing
    Err.Clear
    OnErrorGoTo0
    SelectCase ProcOK
    CaseIs=True
    With wsTool
    .Range("B2").ClearContents
    .Range("B3").ClearContents
    .Range("B4").ClearContents
    .Range("B5").ClearContents
    EndWith
    MsgBox "Process started : "& tStart & vbCrLf & _
    "Process ended at: "& tStop & vbCrLf & _
    "Time elapsed: "& IIf(Hour(tStop)>= Hour(tStart), Format(tStop - tStart,"hh:mm:ss"), _
    Format((tmidnite - tStart)+ tStop,"hh:mm:ss")), vbInformation,"Price Mapping completed sucessfully!"
    CaseElse
    MsgBox "Price Mapping not completed!", vbExclamation,"Price Mapping failed!"
    EndSelect
    wbTool.Save
    EndSub
    
    PublicFunction findAcronym(tVal AsVariant)AsString
    Dim rng As Range
    With Sheets("Merchants").Range("B:B")
    Set rng =.Find(What:=tVal, LookIn:=xlValues, LookAt:=xlWhole)
    IfNot rng IsNothingThen findAcronym = rng.Offset(0,-1).Value
    EndWith
    EndFunction
    
    PublicFunction fillColumnHeaders(ws As Worksheet)
    Dim colNames AsVariant
    Dim i AsInteger
    Dim x AsInteger
    colNames = Split("sku|ean|name|status|price|quantity|specialrice|specialate start|specialate end|","|")
    With ws
    x = WorksheetFunction.Max(1, LBound(colNames))
    For i = LBound(colNames)To UBound(colNames)
    .Cells(1, x).Value = colNames(i)
    x = x +1
    Next i
    EndWith
    EndFunction
    
    PublicFunction timeElapsed(tStart AsDate)AsDouble
    Dim tStop AsDate
    Dim elapsed AsDate
    tStop = Time
    If Hour(tStop)< Hour(tStart)Then
    elapsed =(TimeSerial(23,59,59)- tStart)+ tStop
    Else
    elapsed = tStop - tStart
    EndIf
    timeElapsed = elapsed '* 86400
    EndFunction
    
    PublicFunction time2End(totalRows AsLong, processedRows AsLong, tStart AsDate)AsDouble
    If Minute(tStart)=0Or processedRows =0Then time2End =0:ExitFunction
    time2End =(totalRows * timeElapsed(tStart))/ processedRows
    EndFunction
    Last edited by si_the_geek; Feb 4th, 2016 at 06:00 AM. Reason: added Code tags

  2. #2
    Super Moderator si_the_geek's Avatar
    Join Date
    Jul 2002
    Location
    Bristol, UK
    Posts
    41,930

    Re: Develop a macro to solve below problem

    Welcome to VBForums

    Thread moved to the 'Office Development/VBA' forum... note that while it certainly isn't made clear, the "VB Editor" in Office programs is actually VBA rather than VB, so the 'VB6' forum is not really apt

  3. #3
    Evil Genius alex_read's Avatar
    Join Date
    May 2000
    Location
    Espoo, Finland
    Posts
    5,538

    Re: Develop a macro to solve below problem

    Can you post a cutdown, sample version of your file with a couple of rows in there please (with the indented & space character-included code)? It'll be easier for us & you'll get a faster reply most likely.

    As for the error/problem... can you describe what the problem you're having is exactly please?

    Please rate this post if it was useful for you!
    Please try to search before creating a new post,
    Please format code using [ code ][ /code ], and
    Post sample code, error details & problem details

  4. #4
    PowerPoster
    Join Date
    Dec 2004
    Posts
    25,618

    Re: Develop a macro to solve below problem

    Please let me know what is the problem in the code
    try removing on error resume next, so that all errors break the code, then you can find where errors are occuring, also make sure that any error handling will tell you which line caused the error to happen
    i do my best to test code works before i post it, but sometimes am unable to do so for some reason, and usually say so if this is the case.
    Note code snippets posted are just that and do not include error handling that is required in real world applications, but avoid On Error Resume Next

    dim all variables as required as often i have done so elsewhere in my code but only posted the relevant part

    come back and mark your original post as resolved if your problem is fixed
    pete

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width