VBA/PriceLists.bas

1195 lines
42 KiB
QBasic

Attribute VB_Name = "PriceLists"
Option Explicit
Public tbo As New TheBigOne
Sub test_full20()
'------------------------------------setup-------------------------------------------------
Dim wapi As New Windows_API
Dim x As New TheBigOne
Dim tbl() As Variant
Dim lists() As String
Dim pcol() As Long
Dim unp() As String
Dim unv() As Variant
Dim onelist() As String
Dim i As Long
Dim l As Long
Dim j As Long
Dim unps() As String
Dim sql As String
Dim error As String
Dim orig As Range
Dim ini As Range
Dim cms_pl() As String
Dim pw As String
Dim new_sh As Worksheet
Dim ws As Worksheet
Dim cp As CustomProperty
Set ini = Application.Selection
Selection.CurrentRegion.Select
Set orig = Application.Selection
unp = unpivot_current_sheet(lists, pcol)
login.Caption = "PostgreSQL Login"
login.tbU = "report"
login.tbP = "report"
login.Show
If Not login.proceed Then Exit Sub
If Not x.ADOp_OpenCon(0, PostgreSQLODBC, "10.56.60.254", False, login.tbU.text, login.tbP.text, "Port=5432;Database=ubm") Then
MsgBox ("not able to connect to CMS" & vbCrLf & x.ADOo_errstring)
Exit Sub
End If
Application.ScreenUpdating = False
With orig.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
For l = 1 To UBound(lists)
'----------filter the main data set for each price lists (due to json_from_table taking forever on big tables)--------
onelist = unp
Call x.TBLp_FilterSingle(onelist, 9, lists(l), True)
onelist = x.TBLp_Transpose(onelist)
unv = x.TBLp_StringToVar(onelist)
'-------------------------prepare sql to upload---------------------------------------------------------------
'sql = x.SQLp_build_sql_values(unp, False, True, Db2, False)
sql = x.json_from_table(unv, "", False)
sql = "SELECT * FROM rlarp.plcore_fullcode_inq($$" & sql & "$$::jsonb)"
Call wapi.ClipBoard_SetData(sql)
'If MsgBox(sql, vbOKCancel, "continue with build?") = vbCancel Then Exit Sub
'Exit Sub
cms_pl = x.ADOp_SelectS(0, sql, True, 50000, True)
'--------------------------setup an output sheet if necessary-------------------------------
For Each ws In Application.Worksheets
For Each cp In ws.CustomProperties
If cp.Name = "spec_name" And cp.value = "price_list" Then
Set new_sh = ws
Exit For
End If
Next cp
Next ws
If new_sh Is Nothing Then
Set new_sh = Application.Worksheets.Add
Call new_sh.CustomProperties.Add("spec_name", "price_list")
new_sh.Name = "Price Build"
End If
'-------------------------dump contents------------------------------------------------------
Call x.SHTp_Dump(cms_pl, new_sh.Name, 1, 1, True, True)
new_sh.Activate
ActiveSheet.Cells(1, 1).CurrentRegion.Select
Selection.Columns.autofit
Rows("1:1").Select
With ActiveWindow
.SplitColumn = 0
.SplitRow = 1
End With
ActiveWindow.FreezePanes = True
'--------------------------format source cells for any build issues--------------------------------
orig.Worksheet.Select
'if a cell has even one valid hit, don't show an error
'create a copy of tbl
'the default value for cell is error, if any good values are found, they stay
j = 0
For i = 1 To UBound(cms_pl, 1)
Select Case cms_pl(i, 15)
Case ""
orig.Worksheet.Cells(orig.row + cms_pl(i, 13), orig.column + cms_pl(i, 14)).Interior.ThemeColor = xlThemeColorAccent6
Case "No UOM Conversion"
If orig.Worksheet.Cells(orig.row + cms_pl(i, 13), orig.column + cms_pl(i, 14)).Interior.ThemeColor <> xlThemeColorAccent6 Then
orig.Worksheet.Cells(orig.row + cms_pl(i, 13), orig.column + cms_pl(i, 14)).Interior.Color = RGB(255, 255, 161)
End If
Case "Inactive"
If orig.Worksheet.Cells(orig.row + cms_pl(i, 13), orig.column + cms_pl(i, 14)).Interior.ThemeColor <> xlThemeColorAccent6 Then
orig.Worksheet.Cells(orig.row + cms_pl(i, 13), orig.column + cms_pl(i, 14)).Interior.Color = RGB(255, 20, 161)
End If
Case "No SKU"
If orig.Worksheet.Cells(orig.row + cms_pl(i, 13), orig.column + cms_pl(i, 14)).Interior.ThemeColor <> xlThemeColorAccent6 Then
orig.Worksheet.Cells(orig.row + cms_pl(i, 13), orig.column + cms_pl(i, 14)).Interior.Color = RGB(20, 255, 161)
End If
End Select
'if the current row/column is OK, advance to the next row/column
j = 0
Do Until cms_pl(i, 13) <> cms_pl(i + j, 13) Or cms_pl(i, 14) <> cms_pl(i + j, 14)
j = j + 1
If i + j >= UBound(cms_pl, 1) Then Exit Do
Loop
i = i + j - 1 '-1 becuase the "next i" will increment by 1 again
Next i
Dim cell As Range
Next l
Call x.ADOp_CloseCon(0)
For Each cell In Application.Selection.Cells
'if the cell fill is green, then a known good part was found, so cell to blank
If cell.Interior.ThemeColor = xlThemeColorAccent6 Then
'flag any cells that have prices that are not a formula
If IsNumeric(cell.value) And Mid(cell.Formula, 1, 1) <> "=" And cell.row > 3 And cell.column > 6 Then
'cell.Interior.Color = RGB(186, 85, 211)
' With cell.Borders(xlEdgeLeft)
' .LineStyle = xlContinuous
' .Color = -6279056
' .TintAndShade = 0
' .Weight = xlThick
' End With
' With cell.Borders(xlEdgeTop)
' .LineStyle = xlContinuous
' .Color = -6279056
' .TintAndShade = 0
' .Weight = xlThick
' End With
' With cell.Borders(xlEdgeRight)
' .LineStyle = xlContinuous
' .Color = -6279056
' .TintAndShade = 0
' .Weight = xlThick
' End With
' With cell.Borders(xlEdgeBottom)
' .LineStyle = xlContinuous
' .Color = -6279056
' .TintAndShade = 0
' .Weight = xlThick
' End With
End If
cell.Interior.Pattern = xlNone
Else
If cell.Interior.Pattern = xlNone And cell.value <> "" Then
'---yellow-------
cell.Interior.Color = RGB(255, 255, 161)
End If
End If
Next cell
Selection.Columns(1).Interior.Pattern = xlNone
Selection.Columns(2).Interior.Pattern = xlNone
Selection.Columns(3).Interior.Pattern = xlNone
Selection.Columns(4).Interior.Pattern = xlNone
Selection.Columns(5).Interior.Pattern = xlNone
Selection.Columns(6).Interior.Pattern = xlNone
Selection.Rows(1).Interior.Pattern = xlNone
For i = 1 To UBound(pcol)
Selection.Columns(pcol(i) + 1).Interior.Pattern = xlNone
Next i
Application.ScreenUpdating = True
'----------------------------cleanup-------------------------------------------------------------
Set x = Nothing
ini.Select
End Sub
Sub price_load_plcore()
Dim x As New TheBigOne 'function library
Dim load() As String 'individual price list to be loaded
Dim pcol() As Long 'hold the positions of each price list
Dim plist() As String
Dim i As Long 'walks through each price list
Dim j As Long 'walks through each original row
Dim k As Long 'creates new rows for each price break
Dim m As Long 'row position in the new table
Dim sql As String
'---current setup takes 2 minutes. need to break into smaller uploads, one price list per round--
'-------identify the active sheet and load the contents to an array-----------
load = unpivot_current_sheet(plist, pcol)
'-------filter out any -0- prices before loading
Call x.TBLp_FilterSingle(load, 8, "0.00", False)
'------if no columns are labeled plist then exit------------------------------
If UBound(pcol) = 0 Then Exit Sub
'------clear out overlapping price lists--------------------------------------
sql = ""
For i = 1 To UBound(plist)
If i > 1 Then
sql = sql & ",'" & plist(i) & "'"
Else
sql = sql & "'" & plist(i) & "'"
End If
Next i
sql = "DELETE FROM rlarp.plcore WHERE listcode in (" & sql & ");"
sql = sql & vbCrLf & "INSERT INTO rlarp.plcore"
sql = sql & vbCrLf & x.SQLp_build_sql_values(load, True, True, PostgreSQL, False, False, "S", "S", "S", "S", "S", "S", "S", "N", "N", "S", "N", "N") & ";"
login.Caption = "Postgres Login"
login.tbU = LCase(Mid(Application.UserLibraryPath, 10, InStr(10, Application.UserLibraryPath, "\") - 10))
login.Show
If Not login.proceed Then Exit Sub
If Not x.ADOp_Exec(0, sql, 1, True, PostgreSQLODBC, "10.56.60.254", False, login.tbU, login.tbP, "Port=5432;Database=ubm") Then
MsgBox (x.ADOo_errstring)
Exit Sub
End If
'If Not x.ADOp_Exec(1, sql, 1, True, ADOinterface.SqlServer, "mid-sql02", True) Then
' MsgBox (x.ADOo_errstring)
' Exit Sub
'End If
End Sub
Sub build_csv()
Dim x As New TheBigOne
Dim pl() As String
Dim plv() As Variant
Dim i As Long
Dim j As Long
Dim ul() As String
Dim pl_code As String
Dim pl_action As String
Dim dtl_action As String
Dim pl_d1 As String
Dim pl_d2 As String
Dim pl_d3 As String
Dim fd As FileDialog
Dim ulsql As String
Dim temp() As String
Dim wapi As New Windows_API
pl = x.SHTp_GetString(Selection)
ReDim ul(11, UBound(pl, 2))
PRICELIST_SHOW:
Call pricelist.load_lists
pricelist.Show
If Not pricelist.proceed Then Exit Sub
pl_code = pricelist.cbLIST.value
pl_d1 = pricelist.tbD1.text
pl_d2 = pricelist.tbD2.text
pl_d3 = pricelist.tbD3.text
pl_action = Mid(pricelist.cbHDR.value, 1, 1)
dtl_action = Mid(pricelist.cbDTL.value, 1, 1)
If Len(pricelist.cbLIST.value) > 5 Then
MsgBox ("price code must be 5 or less characters")
GoTo PRICELIST_SHOW
End If
'--------------remove any lines with errors-------------
If Not pricelist.cbInactive Then
Call x.TBLp_FilterSingle(pl, 16, "", True)
End If
'--------------remove empty price lines-----------------
Call x.TBLp_FilterSingle(pl, 13, "", False)
If Not pricelist.cbNonStocked Then
Call x.TBLp_FilterSingle(pl, 8, "A", True)
End If
'need to get the current list of products and if they already exist for the target price list
'target price list
'target part
'target volume level
ul(0, 0) = "HDR"
ul(1, 0) = pl_action
ul(2, 0) = pl_code
ul(3, 0) = Left(pl_d1, 30)
ul(4, 0) = Left(pl_d2, 30)
ul(5, 0) = Left(pl_d3, 30)
ul(6, 0) = "Y"
ul(7, 0) = "N"
j = 0
For i = LBound(pl, 2) + 1 To UBound(pl, 2)
'if there is no [uom, part#, price], don't create a row
If pl(11, i) <> "" And pl(7, i) <> "" And pl(6, i) <> "" And pl(13, i) <> "" Then
j = j + 1
ul(0, j) = "DTL" 'DTL
ul(1, j) = pl_code 'Price list code
ul(2, j) = pl(6, i) 'part number
ul(3, j) = pl(12, i) 'price unit
ul(4, j) = Format(pl(11, i), "0.00000") 'volume break in price uom
ul(5, j) = Format(pl(13, i), "0.00000") 'price
ul(11, j) = dtl_action 'add, update, delete
End If
Next i
ReDim Preserve ul(11, j)
'--------Open file-------------
If Not x.FILEp_CreateCSV(pricelist.tbPATH.text & "\" & Replace(pl_code, ".", "_") & ".csv", ul) Then
MsgBox ("error")
End If
'Excel.Workbooks.Open (pricelist.tbPATH.Text & "\" & Replace(pl_code, ".", "_") & ".csv")
'---------------------header row---------------------------------
End Sub
Function unpivot_current_sheet(ByRef lists() As String, ByRef pcol() As Long) As String()
Dim x As New TheBigOne 'function library
Dim sh As Worksheet 'target worksheet
Dim big() As String 'all price lists in one array
Dim unpivot() As String 'unwrap the columns into volume level rows
Dim load() As String 'individual price list to be loaded
Dim pcount As Long 'count of price list
'Dim pcol() As Long 'hold the positions of each price list
ReDim pcol(30) 'size the array starting with 30 and trim later
ReDim lists(30)
Dim dcol() As Integer 'columns to be deleted
Dim typeflag() As String 'array of column types
Dim i As Long 'walks through each price list
Dim j As Long 'walks through each original row
Dim k As Long 'creates new rows for each price break
Dim m As Long 'row position in the new table
Dim sql As String
'-------identify the active sheet and load the contents to an array-----------
Set sh = ActiveSheet
big = x.SHTp_Get(sh.Name, 3, 1, True)
'------iterate through the column headers to identify the price lists---------
pcount = 0
For i = 0 To UBound(big, 1)
If big(i, 0) = "plist" Then
pcount = pcount + 1
pcol(pcount) = i
lists(pcount) = big(i, 1)
End If
Next i
'------if no columns are labeled plist then exit------------------------------
If pcount = 0 Then Exit Function
ReDim Preserve pcol(pcount)
ReDim Preserve lists(pcount)
ReDim typeflag(9)
'----since there are 3 price columns, those will need transformed to 3 price rows per each original-----
ReDim load(11, UBound(big, 2) * 3 * pcount)
m = 1
'----set headers-----
load(0, 0) = "stlc"
load(1, 0) = "coltier"
load(2, 0) = "branding"
load(3, 0) = "accs"
load(4, 0) = "suffix"
load(5, 0) = "uomp"
load(6, 0) = "vol_uom"
load(7, 0) = "vol_qty"
load(8, 0) = "vol_price"
load(9, 0) = "listcode"
load(10, 0) = "orig_row"
load(11, 0) = "orig_col"
For pcount = 1 To UBound(pcol)
'-----populate------------
For i = 1 To UBound(big, 2)
'-----hard coded to number of price breaks (3)-------
For k = 0 To 2
load(0, m) = big(0, i)
load(1, m) = big(1, i)
load(2, m) = big(2, i)
load(3, m) = big(3, i)
load(4, m) = big(4, i)
'----position 3 is a bulk pallet so the default UOM needs hard coded to PLT-----
If k = 2 Then
load(5, m) = "PLT"
Else
load(5, m) = big(5, i)
End If
'----(3-k) should work out to 1st 2nd 3rd price colum----------------------------
'----the first column UOM is the default package, everything else is a pallet----
If k = 0 Then
load(6, m) = big(5, i)
Else
load(6, m) = "PLT"
End If
'----for now the volumes are always 1 of the unit of measure in colunm 6 above
load(7, m) = "1"
load(8, m) = Format(big(pcol(pcount) - (3 - k), i), "####0.00")
load(9, m) = big(pcol(pcount) - 0, i)
load(10, m) = i
load(11, m) = pcol(pcount) - (3 - k)
m = m + 1
Next k
Next i
Next pcount
If Not x.TBLp_TestNumeric(load, 8) Then
MsgBox ("price is text")
Exit Function
End If
unpivot_current_sheet = load
End Function
Sub build_customer_files()
Dim x As New TheBigOne
Dim i As Long
Dim pl() As String
Dim pln() As String
Dim plf() As String
Dim fc() As String
Dim nwb As Workbook
Dim fcwb As Workbook
Dim nws As Worksheet
Dim nnws As Worksheet
Dim nfws As Worksheet
Dim fcws As Worksheet
Dim filepath As String
Dim clist() As String
Dim plev As String
Dim effdate As Date
Dim segment_regex As String
Dim curr As String
Dim fname As String
'----------------------pick price level---------------------------------------------------------------------
login.Caption = "PostgreSQL Login"
login.tbU = "report"
login.tbP = "report"
login.proceed = True
'login.Show
If Not login.proceed Then Exit Sub
Call pricelevel.repopulate
pricelevel.Show
If pricelevel.cancel Then Exit Sub
If Not IsDate(pricelevel.tbEddDate.text) Then
MsgBox ("cannot interperet date - " & pricelevel.tbEddDate.text)
Exit Sub
End If
For i = 0 To pricelevel.lbPriceLev.ListCount - 1
If pricelevel.lbPriceLev.Selected(i) Then
plev = pricelevel.lbPriceLev.list(i)
Call build_price_level(plev)
End If
Next i
End Sub
Sub build_price_level(plev As String)
Dim x As New TheBigOne
Dim i As Long
Dim pl() As String
Dim pln() As String
Dim plf() As String
Dim fc() As String
Dim nwb As Workbook
Dim fcwb As Workbook
Dim nws As Worksheet
Dim nnws As Worksheet
Dim nfws As Worksheet
Dim fcws As Worksheet
Dim filepath As String
Dim effdate As Date
Dim clist() As String
Dim segment_regex As String
Dim curr As String
Dim fname As String
effdate = CDate(pricelevel.tbEddDate.text)
filepath = pricelevel.tbPATH & "\" & plev
'---------------------create new workbook-------------------------------------------------------------------
Set nwb = Application.Workbooks.Add
nwb.Activate
Set nws = nwb.Sheets(1)
segment_regex = "^G|^N|^F|^P"
'---------------------get price list------------------------------------------------------------------------
If pricelevel.chbNURSERY Then
pln = x.ADOp_SelectS(0, "SELECT * FROM rlarp.plcore_build_pretty('" & plev & "', '^N')", False, 2000, True, PostgreSQLODBC, "usmidsap01", False, login.tbU.text, login.tbP.text, "Port=5432;Database=ubm")
If pln(0, 0) <> "Product" Then
MsgBox (pln(0, 0))
Exit Sub
End If
If UBound(pln, 2) > 21 Then
segment_regex = "^F|^G|^P"
Set nnws = nwb.Sheets.Add(, nws)
nnws.Name = "Price List - Nursery"
Call paste_pretty(pln, nnws, effdate, curr)
End If
End If
If pricelevel.chbFIBER Then
plf = x.ADOp_SelectS(0, "SELECT * FROM rlarp.plcore_build_pretty('" & plev & "','^F')", False, 2000, True, PostgreSQLODBC, "usmidsap01", False, login.tbU.text, login.tbP.text, "Port=5432;Database=ubm")
If plf(0, 0) <> "Product" Then
MsgBox (plf(0, 0))
Exit Sub
End If
If UBound(plf, 2) > 21 Then
If segment_regex = "^F|^G|^P" Then
segment_regex = "^G|^P"
Else
segment_regex = "^G|^N|^P"
End If
Set nfws = nwb.Sheets.Add(, nws)
nfws.Name = "Price List - Fiber"
Call paste_pretty(plf, nfws, effdate, curr)
End If
End If
pl = x.ADOp_SelectS(0, "SELECT * FROM rlarp.plcore_build_pretty('" & plev & "','" & segment_regex & "')", False, 2000, True, PostgreSQLODBC, "usmidsap01", False, login.tbU.text, login.tbP.text, "Port=5432;Database=ubm")
If pl(0, 0) <> "Product" Then
MsgBox (pl(0, 0))
Exit Sub
End If
If UBound(pl, 2) > 21 Then
nws.Name = "Price list"
Call paste_pretty(pl, nws, effdate, curr)
Else
'---if the price list has no length, then close the worksheet.
'---if it's the last worksheet, then close the whole workbook
If nwb.Sheets.Count = 1 Then
Call nwb.Close(False)
Exit Sub
Else
nws.Delete
End If
End If
Application.ScreenUpdating = True
'--------------------save file--------------------------------------------------------------------------------
'Dim fd As Object
'Set fd = Application.FileDialog(msoFileDialogFolderPicker)
'fd.Show
'If fd.SelectedItems.Count = 0 Then Exit Sub
With CreateObject("Scripting.FileSystemObject")
If Not .FolderExists(filepath) Then .CreateFolder filepath
End With
Application.DisplayAlerts = True
nwb.Activate
fname = "HC Companies Distributor Price List " & curr & ".xlsx"
Dim wb As Workbook
For Each wb In Workbooks
If wb.Name = fname Then
If MsgBox("already have a price list open, close it?", vbOKCancel) Then
Workbooks(fname).Close
Exit For
Else
Exit Sub
End If
End If
Next wb
If pricelevel.tbPATH.text <> "" Then nwb.SaveAs Filename:=filepath & "\" & fname
If pricelevel.chPDF Then
fname = Replace(fname, "xlsx", "pdf")
nwb.ExportAsFixedFormat Type:=xlTypePDF, Filename:=filepath & "\" & fname, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
End If
If Not pricelevel.chbLEAVEOPEN Then
nwb.Close
End If
'--------------------get full code list-----------------------------
If pricelevel.chbFULLCODE Then
'---------------------get full code list--------------------------------------------------------------------
fc = x.ADOp_SelectS(0, "SELECT * FROM rlarp.plcore_build_fullcode_cust('" & plev & "', '" & effdate & "'::date)", False, 20000, True, PostgreSQLODBC, "10.56.60.254", False, login.tbU.text, login.tbP.text, "Port=5432;Database=ubm")
If fc(0, 0) <> "Currency" Then
MsgBox (fc(0, 0))
Exit Sub
End If
'---------------------create new workbook-------------------------------------------------------------------
If UBound(fc, 2) = 0 Then
'MsgBox ("no full code list data for " & plev)
Exit Sub
End If
Application.ScreenUpdating = False
Set fcwb = Application.Workbooks.Add
fcwb.Activate
Set fcws = fcwb.Sheets(1)
fcws.Activate
'fcws.Cells.NumberFormat = "@" 'format all cells to text so pasted text values are not cast to numeric
Call x.SHTp_Dump(fc, fcws.Name, 1, 1, False, True, 6, 7, 8, 9, 10, 11, 12, 13, 14)
Rows("1:2").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
'--------------------format full code------------------------------------------------------------------------
Application.CutCopyMode = False
fcws.ListObjects.Add(xlSrcRange, fcws.Cells(3, 1).CurrentRegion, , xlYes).Name = "Full Code Listing"
fcws.ListObjects("Full Code Listing").TableStyle = "TableStyleMedium21"
fcws.Cells.Font.Name = "Courier New"
fcws.Cells.Font.Size = 10
With fcws.Rows(3)
.WrapText = True
.RowHeight = 40.5
End With
fcws.Columns("A").ColumnWidth = 9.43
fcws.Columns("B").ColumnWidth = 20
fcws.Columns("C:D").ColumnWidth = 35
fcws.Columns("E").ColumnWidth = 21.5
fcws.Columns("F").ColumnWidth = 3.71
fcws.Columns("G").ColumnWidth = 9.43
fcws.Columns("G").NumberFormat = "_(* #,##0.000_);_(* (#,##0.000);_(* ""-""???_);_(@_)"
fcws.Columns("H").ColumnWidth = 7.14
fcws.Columns("I:P").ColumnWidth = 14
fcws.Columns("I:P").NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""??_);_(@_)"
fcws.Columns("O").ColumnWidth = 10.57
fcws.Columns("O").NumberFormat = "_(* #,##0.000_);_(* (#,##0.000);_(* ""-""???_);_(@_)"
Rows("3:3").NumberFormat = "General"
fcws.Activate
ActiveWindow.DisplayGridlines = False
Rows("4:4").Select
ActiveWindow.FreezePanes = True
fcws.ListObjects("Full Code Listing").ShowAutoFilter = False
'---------------------logo----------------------------------------------------------------------------------
fcws.Rows("1:2").RowHeight = 28.5
fcws.Cells(1, 1).Select
ActiveSheet.Pictures.Insert("https://hccompanies.sharepoint.com/_layouts/15/download.aspx?UniqueId=2ee21088%2Ddad1%2D41aa%2Daf65%2D14b44c46941e").Select
'Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.ScaleWidth 0.375, msoFalse, msoScaleFromTopLeft
'Selection.ShapeRange.ScaleHeight 0.52, msoFalse, msoScaleFromTopLeft
'Selection.ShapeRange.IncrementLeft 2
'Selection.ShapeRange.IncrementTop 2
ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Shapes.Item(1), address:="https://hc-companies.com/"
ActiveSheet.Cells(5, 1).Select
fcws.Cells(1, 4).value = "Distributor Price List - Effective " & Format(effdate, "MM/DD/YYYY")
fcws.Name = "Full Code Listing"
fcws.Cells(3, 1).Select
'------------formatting for print-----------------------------------
Application.PrintCommunication = False
fcws.PageSetup.PrintTitleRows = "$1:$3"
fcws.PageSetup.Orientation = xlLandscape
With ActiveSheet.PageSetup
.LeftMargin = Application.InchesToPoints(0.25)
.RightMargin = Application.InchesToPoints(0.25)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.FitToPagesWide = 1
.FitToPagesTall = False
End With
Application.PrintCommunication = True
End If
'---------------------save full code list---------------------------
For Each wb In Workbooks
If wb.Name = "HC FullCode List.xlsx" Then
If MsgBox("already have a full code list open, close it?", vbOKCancel) Then
Workbooks("HC FullCode List.xlsx").Close
Exit For
Else
Exit Sub
End If
End If
Next wb
If Not (fcwb Is Nothing) Then
If pricelevel.tbPATH.text <> "" Then fcwb.SaveAs Filename:=filepath & "\HC FullCode List " & curr & ".xlsx"
If pricelevel.chPDF Then
fname = Replace(fcwb.Name, "xlsx", "pdf")
fcwb.ExportAsFixedFormat Type:=xlTypePDF, Filename:=filepath & "\" & fname, Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
End If
If Not pricelevel.chbLEAVEOPEN Then
fcwb.Close
End If
End If
End Sub
Sub paste_pretty(ByRef pl() As String, ByRef nws As Worksheet, ByVal effdate As Date, ByRef curr As String)
Dim c As Range
Dim i As Long
Dim last As Long
Dim lastcol As Long
Dim j As Long
nws.Activate
nws.Cells.NumberFormat = "@"
'---------------------format to numeric if selected---------------------------------------------------------
If pricelevel.cbNUMERIC Then
Call tbo.SHTp_Dump(pl, nws.Name, 1, 1, False, True, 9, 12, 15, 10, 13, 16)
nws.Rows("1:4").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
nws.Columns(10).NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""???_);_(@_)"
nws.Columns(13).NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""???_);_(@_)"
nws.Columns(16).NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""???_);_(@_)"
nws.Columns(11).NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""???_);_(@_)"
nws.Columns(14).NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""???_);_(@_)"
nws.Columns(17).NumberFormat = "_(* #,##0.00_);_(* (#,##0.00);_(* ""-""???_);_(@_)"
nws.Columns(10).ColumnWidth = 13
nws.Columns(13).ColumnWidth = 13
nws.Columns(16).ColumnWidth = 13
nws.Rows(5).NumberFormat = "@"
Else
Call tbo.SHTp_Dump(pl, nws.Name, 5, 1, False, True)
nws.Columns(10).ColumnWidth = 10.57
nws.Columns(13).ColumnWidth = 10.57
nws.Columns(16).ColumnWidth = 10.57
End If
Application.ScreenUpdating = False
'---------------------whole sheet formatting----------------------------------------------------------------
nws.Columns(9).HorizontalAlignment = xlRight
nws.Columns(10).HorizontalAlignment = xlRight
nws.Columns(11).HorizontalAlignment = xlRight
nws.Columns(12).HorizontalAlignment = xlRight
nws.Columns(13).HorizontalAlignment = xlRight
nws.Columns(14).HorizontalAlignment = xlRight
nws.Columns(15).HorizontalAlignment = xlRight
nws.Columns(16).HorizontalAlignment = xlRight
nws.Columns(17).HorizontalAlignment = xlRight
nws.Columns(1).ColumnWidth = 12
nws.Columns(2).ColumnWidth = 70
nws.Columns(3).ColumnWidth = 8.29
nws.Columns(4).ColumnWidth = 4.86
nws.Columns(5).ColumnWidth = 4.86
nws.Columns(6).ColumnWidth = 4.86
nws.Columns(7).ColumnWidth = 4.86
If pricelevel.chbColors Then
nws.Columns(8).ColumnWidth = 17
nws.Columns(8).WrapText = True
Else
nws.Columns(8).ColumnWidth = 11
End If
nws.Columns(9).ColumnWidth = 8.29
nws.Columns(9).WrapText = True
nws.Columns(12).ColumnWidth = 8.29
nws.Columns(12).WrapText = True
nws.Columns(15).ColumnWidth = 8.29
nws.Columns(15).WrapText = True
nws.Columns(11).ColumnWidth = 11.71
nws.Columns(14).ColumnWidth = 11.71
nws.Columns(17).ColumnWidth = 13
ActiveWindow.DisplayGridlines = False
'nws.Cells.Font.Name = "Cascadia Code Light"
nws.Cells.Font.Name = "Courier New"
nws.Cells.Font.Size = 10
Rows("6:6").Select
ActiveWindow.FreezePanes = True
'---------------------logo----------------------------------------------------------------------------------
ActiveSheet.Cells(1, 1).Select
ActiveSheet.Pictures.Insert("https://hccompanies.sharepoint.com/_layouts/15/download.aspx?UniqueId=2ee21088%2Ddad1%2D41aa%2Daf65%2D14b44c46941e").Select
'Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.ScaleWidth 0.375, msoFalse, msoScaleFromTopLeft
'Selection.ShapeRange.ScaleHeight 0.52, msoFalse, msoScaleFromTopLeft
'Selection.ShapeRange.IncrementLeft 2
'Selection.ShapeRange.IncrementTop 2
ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Shapes.Item(1), address:="https://hc-companies.com/"
ActiveSheet.Cells(5, 1).Select
'---------------------header formatting---------------------------------------------------------------------
For Each c In Range("I5:Q5").Cells
c.value = Left(c.value, Len(c.value) - 1)
Next c
Application.DisplayAlerts = False
With nws.Range("I4")
.value = "------Single Package------"
.HorizontalAlignment = xlLeft
.InsertIndent 1
.WrapText = False
End With
With nws.Range("L4")
.value = "--------Full Pallet-------"
.HorizontalAlignment = xlLeft
.InsertIndent 1
.WrapText = False
End With
With nws.Range("O4")
.value = "--------Bulk Pallet-------"
.HorizontalAlignment = xlLeft
.InsertIndent 1
.WrapText = False
End With
Application.DisplayAlerts = True
'---------------------find size of table---------------------------------------------------------------------
i = 6
Do Until nws.Cells(i, 18) = ""
i = i + 1
Loop
last = i - 1
lastcol = 17
'--------------------line formatting--------------------------------------------------------------------------
For i = 6 To last
'--------------------format header---------------
If nws.Cells(i, 18) = "header" Then Call header(nws, i, 1, lastcol)
'--------------------create bands---------------
If nws.Cells(i, 20) = "1" And Not nws.Cells(i, 18) = "header" Then Call banding(nws, i, 1, lastcol)
'--------------------indent compatible---------------
If nws.Cells(i, 18) = "compatible" Then Call compatible(nws, i, 1, 2)
'--------------------highlight price---------------
If nws.Cells(i, 18) = "base" Or nws.Cells(i, 18) = "compatible" Then Call price_col(nws, i, 20)
'--------------------comment empy qty to prevent colors from spilling
If nws.Cells(i, 9) = "" And (nws.Cells(i, 18) = "base" Or nws.Cells(i, 18) = "compatible") Then nws.Cells(i, 9) = "'"
If nws.Cells(i, 11) = "" And (nws.Cells(i, 18) = "base" Or nws.Cells(i, 18) = "compatible") Then nws.Cells(i, 11) = "'"
If nws.Cells(i, 12) = "" And (nws.Cells(i, 18) = "base" Or nws.Cells(i, 18) = "compatible") Then nws.Cells(i, 12) = "'"
If nws.Cells(i, 14) = "" And (nws.Cells(i, 18) = "base" Or nws.Cells(i, 18) = "compatible") Then nws.Cells(i, 14) = "'"
If nws.Cells(i, 15) = "" And (nws.Cells(i, 18) = "base" Or nws.Cells(i, 18) = "compatible") Then nws.Cells(i, 15) = "'"
'-------------------apply border------------------
If pricelevel.chbBorders And (nws.Cells(i, 18) = "base" Or nws.Cells(i, 18) = "compatible") Then Call border(nws, i, lastcol)
'--------------------merge products---------------
If nws.Cells(i, 1) = nws.Cells(i - 1, 1) And nws.Cells(i, 1) <> nws.Cells(i + 1, 1) Then
'if the next row is different and the previous row is the same the loop back and merge the range
j = -1
Do Until nws.Cells(i + j, 1) <> nws.Cells(i, 1)
j = j - 1
Loop
j = j + 1
If j < 0 Then Call merge(nws, i + j, i)
End If
'-------------------auto fit row for wrapped colors-------
nws.Rows(i).EntireRow.autofit
'-------------------reformat line breaks----------
'nws.Cells(i, 9) = split_and_rebuild(nws.Cells(i, 9))
'nws.Cells(i, 12) = split_and_rebuild(nws.Cells(i, 12))
'nws.Cells(i, 15) = split_and_rebuild(nws.Cells(i, 15))
Next i
'--------------------print header data--------------------------------------------------------------------------
pl = tbo.TBLp_Transpose(pl)
Call tbo.TBLp_FilterSingle(pl, 20, "", False)
Call tbo.TBLp_Group(pl, True, tbo.ARRAYp_MakeInteger(20))
If UBound(pl, 2) > 1 Then
'---somehow multiple currencies involved----
MsgBox ("multiple currencies")
Exit Sub
Else
Select Case pl(20, 1)
Case "C"
curr = "CAD"
Case "U"
curr = "USD"
Case Else
MsgBox ("unknown currency - " & pl(20, 1))
End Select
End If
nws.Cells(2, 3).value = "Distributor Price List (" & curr & ") - Effective " & Format(effdate, "MM/DD/YYYY")
nws.Cells(5, 1).Select
Call print_setup(nws, last)
nws.Columns("R:V").Delete
End Sub
Function rrange(ByRef sheet As Worksheet, start_row As Long, end_row As Long, start_col As Long, end_col As Long) As Range
Set rrange = Range(sheet.Cells(start_row, start_col).address & ":" & sheet.Cells(end_row, end_col).address)
End Function
Sub price_col(ByRef sheet As Worksheet, row As Long, flag_col As Long)
Dim Sel As Range
Dim i As Long
i = 0
Do Until i = 9
Set Sel = rrange(sheet, row, row, 10 + i, 10 + i)
If sheet.Cells(row, flag_col) = "0" Then
With Sel.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Else
With Sel.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.599993896298105
.PatternTintAndShade = 0
End With
End If
i = i + 3
Loop
End Sub
Sub merge(ByRef ws As Worksheet, start_row As Long, end_row As Long)
Dim Sel As Range
Dim i As Long
Application.DisplayAlerts = False
For i = 1 To 2
Set Sel = rrange(ws, start_row, end_row, i, i)
With Sel
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Next i
Application.DisplayAlerts = True
End Sub
Sub compatible(ByRef ws As Worksheet, row As Long, start_col As Long, end_col As Long)
Dim Sel As Range
Set Sel = rrange(ws, row, row, start_col, end_col)
Sel.InsertIndent 2
End Sub
Sub banding(ByRef ws As Worksheet, row As Long, start_col As Long, end_col As Long)
Dim Sel As Range
Set Sel = rrange(ws, row, row, start_col, end_col)
With Sel.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent3
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
End Sub
Sub header(ByRef ws As Worksheet, row As Long, start_col As Long, end_col As Long)
Dim Sel As Range
Set Sel = rrange(ws, row, row, start_col, end_col)
Sel.InsertIndent 2
Sel.Font.Size = 11
With Sel.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorAccent6
.TintAndShade = 0.799981688894314
.PatternTintAndShade = 0
End With
Sel.Borders(xlDiagonalDown).LineStyle = xlNone
Sel.Borders(xlDiagonalUp).LineStyle = xlNone
With Sel.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = 0
.Weight = xlThick
End With
With Sel.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = 0
.Weight = xlThick
End With
With Sel.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = 0
.Weight = xlThick
End With
With Sel.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = 0
.Weight = xlThick
End With
Sel.Borders(xlInsideVertical).LineStyle = xlNone
Sel.Borders(xlInsideHorizontal).LineStyle = xlNone
End Sub
Sub border(ByRef ws As Worksheet, row As Long, lastcol As Long)
Dim target As Range
Set target = ws.Range(ws.Cells(row, 1), ws.Cells(row, lastcol))
If ws.Cells(row - 1, 18) <> "header" Then
With target.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
End If
With target.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
With target.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ThemeColor = 1
.TintAndShade = -0.249946592608417
.Weight = xlThin
End With
End Sub
Function split_and_rebuild(text As String) As String
Dim i As Long
Dim last As Long
Dim newt As String
newt = ""
i = 1
last = 1
Do Until InStr(i, text, Chr(10)) = 0
i = InStr(i, text, Chr(10))
newt = newt & Mid(text, last, i - 1) & Chr(10)
last = i
i = i + 1
Loop
newt = newt & Mid(text, i, 100)
split_and_rebuild = newt
End Function
Sub print_setup(sheet As Worksheet, last_row As Long)
Dim Sel As Range
Dim i As Long
Dim j As Long
Set Sel = rrange(sheet, 6, last_row, 1, 17)
Application.PrintCommunication = False
With sheet.PageSetup
.PrintArea = Sel.address
.PrintTitleRows = "$1:$5"
'.FitToPagesTall = 0
.LeftMargin = Application.InchesToPoints(0.25)
.RightMargin = Application.InchesToPoints(0.25)
.TopMargin = Application.InchesToPoints(0.25)
.BottomMargin = Application.InchesToPoints(0.25)
.HeaderMargin = Application.InchesToPoints(0.25)
.FooterMargin = Application.InchesToPoints(0.25)
.Orientation = xlLandscape
.FitToPagesWide = 1
End With
sheet.PageSetup.FitToPagesWide = 1
sheet.PageSetup.FitToPagesTall = 0
'-------------------force a page break on color codes----------
j = 1
For i = 5 To last_row
If j >= 810 Then
sheet.HPageBreaks.Add before:=sheet.Rows(i + 1)
j = 1
End If
'every 73 rows is a page break for current font, but if a row is taller this needs accounted for
If sheet.Cells(i, 18) = "colors" And sheet.Cells(i - 1, 18) <> "colors" Then
sheet.HPageBreaks.Add before:=sheet.Rows(i)
j = 1
End If
If sheet.Cells(i, 18) = "notes" And sheet.Cells(i - 1, 18) <> "notes" Then
sheet.HPageBreaks.Add before:=sheet.Rows(i)
j = 1
End If
j = j + sheet.Rows(i).RowHeight
Next i
sheet.DisplayPageBreaks = False
Application.PrintCommunication = True
sheet.DisplayPageBreaks = False
End Sub
Public Function plevel_segment(plevel As String, segment_num As Integer) As String
Dim ret() As String
ret = tbo.TXTp_ParseCSV(plevel, ".")
If segment_num - 1 > UBound(ret) Then
plevel_segment = ""
Else
plevel_segment = ret(segment_num - 1)
End If
End Function