Attribute VB_Name = "FL" Option Explicit Public price_sheet As Worksheet Public x As New TheBigOne Public Enum ColorTier B_ase = 0 T_raditional = 1 principa_L = 2 pre_M_ium = 3 P_rogram = 4 C_ustom = 5 E_cogrow = 6 O_rganic = 7 W_axtough = 8 End Enum Sub Determine_Active_Range() Dim r As Range Dim s As String Dim cell As Range Set r = Selection MsgBox (r.address) For Each cell In r.Cells s = s & cell.value Next cell MsgBox (s) End Sub Sub Cross_Join_Selection() Dim x As New TheBigOne Dim r As Range Dim ar As Range Dim r1() As String Dim r2() As String Dim d() As String Dim i As Integer Dim dest As String Dim idest As Range Set r = Selection i = 1 For Each ar In r.Areas If i = 1 Then r1 = x.SHTp_Get(Excel.ActiveSheet.Name, ar.row, ar.column, False) Else r2 = x.SHTp_Get(Excel.ActiveSheet.Name, ar.row, ar.column, False) r1 = x.TBLp_CrossJoin(r1, r2, True) End If i = i + 1 Next ar Set idest = Excel.Application.InputBox("select the output cell", , , , , , , 8) If idest Is Nothing Then Exit Sub End If Call x.SHTp_Dump(r1, Excel.ActiveSheet.Name, idest.row, idest.column, False, True) End Sub Sub BackupPersonal() Application.DisplayAlerts = False With Workbooks("Personal.xlsb") .SaveCopyAs Workbooks("Personal.xlsb").Sheets("CONST").Cells(1, 2) .Save End With Application.DisplayAlerts = True End Sub Sub ExtractPNC_CSV() Dim x As New TheBigOne Dim f() As String Dim col() As String Dim coli As Long Dim bal() As String Dim bali As Long Dim sched_loan As String Dim p As FileDialog Dim i As Long Dim j As Long Dim m As Long Dim k As Long Dim row() As String Dim commit As Integer Dim oblig As Integer Dim sched As Integer Dim loan As Integer Dim wb As Workbook Dim sh1 As Worksheet Dim sh2 As Worksheet '--------Open file------------- Set p = Application.FileDialog(msoFileDialogOpen) p.Show '--------Extract text---------- f = x.FILEp_GetTXT(p.SelectedItems(1), 2000) '--------resize arrays--------- ReDim col(11, UBound(f, 2)) ReDim bal(8, UBound(f, 2)) coli = 1 bali = 1 j = 1 m = 1 '--------main interation------- For i = 0 To UBound(f, 2) sched = InStr(f(0, i), "Schedule") loan = InStr(f(0, i), "Loan") If sched <> 0 Then row = x.TXTp_ParseCSVrow(f, i + 2, 0) col(0, 0) = "Schedule#" For k = 0 To 10 col(k + 1, 0) = row(k) Next k sched_loan = x.TXTp_ParseCSVrow(f, i + 1, 0)(0) i = i + 3 commit = 0 oblig = 0 Do Until commit <> 0 Or oblig <> 0 row = x.TXTp_ParseCSVrow(f, i, 0) col(0, j) = sched_loan For k = 0 To 10 col(k + 1, j) = row(k) Next k j = j + 1 i = i + 1 commit = InStr(f(0, i), "Commitment") oblig = InStr(f(0, i), "Oblig") '---or end of file----- Loop sched = 0 ElseIf loan <> 0 Then row = x.TXTp_ParseCSVrow(f, i + 2, 0) bal(0, 0) = "Loan#" For k = 0 To 7 bal(k + 1, 0) = row(k) Next k sched_loan = x.TXTp_ParseCSVrow(f, i + 1, 0)(0) i = i + 3 commit = 0 oblig = 0 Do Until commit <> 0 Or oblig <> 0 row = x.TXTp_ParseCSVrow(f, i, 0) bal(0, m) = sched_loan For k = 0 To 7 bal(k + 1, m) = row(k) Next k m = m + 1 i = i + 1 If i > UBound(f, 2) Then Exit Do If f(0, i) = "" Then Exit Do commit = InStr(f(0, i), "Commitment") oblig = InStr(f(0, i), "Oblig") '---or end of file----- Loop sched = 0 loan = 0 End If Next i ReDim Preserve col(11, j - 2) ReDim Preserve bal(8, m - 1) ' Set wb = Workbooks.Add ' wb.Sheets.Add ' Set sh1 = wb.Sheets("Sheet1") ' Set sh2 = wb.Sheets("Sheet2") ' sh1.Name = "Collateral" ' sh2.Name = "Balance" If Not x.FILEp_CreateCSV(Mid(p.SelectedItems(1), 1, Len(p.SelectedItems(1)) - 4) & "col.csv", col) Then MsgBox ("error") End If If Not x.FILEp_CreateCSV(Mid(p.SelectedItems(1), 1, Len(p.SelectedItems(1)) - 4) & "bal.csv", bal) Then MsgBox ("error") End If ' Call x.SHTp_Dump(col, sh1.Name, 1, 1, True, True, 1, 4, 5, 6, 7, 8, 9, 10, 11) ' Call x.SHTp_Dump(bal, sh2.Name, 1, 1, True, True, 1, 2, 5, 6, 7, 8) ' ' sh1.range("A1").CurrentRegion.Columns.AutoFit ' sh2.range("A2").CurrentRegion.Columns.AutoFit ' ' If Not x.FILEp_CreateCSV("C:\users\ptrowbridge\downloads\col.csv", col) Then ' MsgBox ("error") ' End If End Sub Sub GrabBorrowHist() Dim sh As Worksheet Dim x As New TheBigOne Dim i As Long Dim b() As String Set sh = Application.ActiveSheet b = x.SHTp_Get(sh.Name, 3, 1, True) Call x.TBLp_FilterSingle(b, 14, "", False) Call x.TBLp_DeleteCols(b, x.ARRAYp_MakeInteger(6, 7, 8, 9, 10, 11, 12, 13)) Call x.TBLp_AddEmptyCol(b) Call x.TBLp_AddEmptyCol(b) For i = 1 To UBound(b, 2) b(9, i) = ActiveSheet.Name b(10, i) = ActiveWorkbook.Name Next i b(9, 0) = "Tab" b(10, 0) = "File" Application.Workbooks("PERSONAL.XLSB").Activate Set sh = Application.Workbooks("PERSONAL.XLSB").Sheets("BORROW") i = 1 Do Until sh.Cells(i, 1) = "" i = i + 1 Loop Call x.SHTp_Dump(b, "BORROW", i, 1, False, True) End Sub Function fn_coln_colchar(colnum As Long) As String fn_coln_colchar = colnum / 26 End Function Sub add_quote_front() Dim r As Range Set r = Selection Dim c As Object For Each c In r.Cells If c.value <> "" Then c.value = "'" & c.value Next c End Sub Function json_from_list(keys As Range, values As Range) As String Dim json As String Dim i As Integer Dim first_comma As Boolean Dim needs_braces As Integer Dim needs_comma As Boolean needs_comma = False needs_braces = 0 For i = 1 To keys.Cells.Count If values.Cells(i).value <> "" Then needs_braces = needs_braces + 1 If needs_comma Then json = json & "," needs_comma = True If IsNumeric(values.Cells(i).value) Then json = json & Chr(34) & keys.Cells(i).value & Chr(34) & ":" & values.Cells(i).value Else json = json & Chr(34) & keys.Cells(i).value & Chr(34) & ":" & Chr(34) & values.Cells(i).value & Chr(34) End If End If Next i If needs_braces > 0 Then json = "{" & json & "}" json_from_list = json End Function Function json_nest(key As String, json As String) As String json_nest = "{""" & key & """:" & json & "}" End Function Function json_concat(list As Range) As String Dim json As String Dim i As Integer i = 0 For Each cell In list If cell.value <> "" Then i = i + 1 If i = 1 Then json = cell.value Else json = json & "," & cell.value End If End If Next cell If i > 1 Then json = "[" & json & "]" json_concat = json End Function Sub json_from_table_pretty() Dim wapi As New Windows_API Dim x As New TheBigOne Dim tbl() As Variant Selection.CurrentRegion.Select tbl = Selection Dim ajson As String Dim json As String Dim r As Integer Dim c As Integer Dim needs_comma As Boolean Dim needs_braces As Integer needs_comma = False needs_braces = 0 ajson = "" For r = 2 To UBound(tbl, 1) For c = 1 To UBound(tbl, 2) If tbl(r, c) <> "" Then needs_braces = needs_braces + 1 If needs_comma Then json = json & "," & vbCrLf needs_comma = True If IsNumeric(tbl(r, c)) Then json = json & Chr(34) & tbl(1, c) & Chr(34) & ":" & tbl(r, c) Else json = json & Chr(34) & tbl(1, c) & Chr(34) & ":" & Chr(34) & tbl(r, c) & Chr(34) End If End If Next c If needs_braces > 0 Then json = "{" & vbCrLf & json & vbCrLf & "}" needs_comma = False needs_braces = 0 If r > 2 Then ajson = ajson & vbCrLf & "," & vbCrLf & json Else ajson = json End If json = "" Next r If r > 2 Then ajson = "[" & ajson & "]" Call wapi.ClipBoard_SetData(ajson) End Sub Sub json_from_table() Dim wapi As New Windows_API Dim x As New TheBigOne Dim tbl() As Variant Selection.CurrentRegion.Select tbl = Selection Call wapi.ClipBoard_SetData(x.json_from_table(tbl, "y", False)) End Sub Sub strip_goofy_char() Dim tbl() As Variant Dim i As Long Dim j As Long Dim rx As Object Dim strip_text As String Dim strip_num As String Dim strip_date As String Set rx = CreateObject("vbscript.regexp") rx.Global = True strip_text = "[^a-zA-Z0-9 \(\)\<\>\:\;\|\\\[\]\{\}\.\-\_\,\#\""]" strip_num = "[^0-9\.]" strip_date = "[^0-9\/\-\:\.]" rx.Pattern = strip_text tbl = Selection For i = 1 To UBound(tbl, 1) For j = 1 To UBound(tbl, 2) tbl(i, j) = rx.Replace(tbl(i, j), "") Next j Next i Selection.FormulaR1C1 = tbl End Sub Sub PastValues() Attribute PastValues.VB_ProcData.VB_Invoke_Func = "V\n14" On Error GoTo errh Call Selection.PasteSpecial(xlPasteValues, xlNone, False, False) errh: End Sub Sub ColorMatrixExtract() Dim s() As String Dim t() As String Dim i As Long Dim j As Long Dim k As Long Dim m As Long Dim sh As Worksheet Dim found As Boolean ReDim s(1, 10000) For Each sh In Sheets If sh.Name = "Color Matrix" Then found = True Next sh If Not found Then Exit Sub Set sh = Sheets("Color Matrix") If sh.Cells(5, 1) <> "BASE WHITE" Then Exit Sub m = 1 i = 1 s(0, 0) = "COLOR ID" s(1, 0) = "DESCRIPTION" Do If sh.Cells(6, i) = "COLOR ID" Then j = 1 Do Until sh.Cells(6, i + j) = "DESCRIPTION" j = j + 1 Loop k = 7 Do Until sh.Cells(k, i) = "" s(0, m) = sh.Cells(k, i) s(1, m) = sh.Cells(k, i + j) k = k + 1 m = m + 1 Loop End If i = i + 1 If i = 500 Then Exit Do Loop ReDim Preserve s(1, m - 1) Call x.SHTp_Dump(s, "Extract", 1, 1, True, True) End Sub Sub LoadChan() 'if not x.ADOp_OpenCon(0, End Sub Sub markdown_from_table() Dim x As New TheBigOne Dim wapi As New Windows_API Dim tbl() As Variant Selection.CurrentRegion.Select tbl = Selection Call wapi.ClipBoard_SetData(x.markdown_from_table(tbl)) End Sub Sub json_multirange() Dim wapi As New Windows_API Dim x As New TheBigOne Call wapi.ClipBoard_SetData(x.json_multirange(Selection)) End Sub Sub markdown_whole_sheet() Dim x As New TheBigOne Dim wapi As New Windows_API Call wapi.ClipBoard_SetData(x.markdown_whole_sheet(ActiveSheet)) End Sub Sub sql_from_range_db2_qh() Dim x As New TheBigOne Dim wapi As New Windows_API Dim r() As String Selection.CurrentRegion.Select Call wapi.ClipBoard_SetData(x.SQLp_build_sql_values(x.ARRAYp_get_range_string(Selection), True, True, Db2, True)) End Sub Sub sql_from_range_db2_noqh() Dim x As New TheBigOne Dim wapi As New Windows_API Dim r() As String Selection.CurrentRegion.Select Call wapi.ClipBoard_SetData(x.SQLp_build_sql_values(x.ARRAYp_get_range_string(Selection), True, True, Db2, False)) End Sub Sub sql_from_range_pg_qh() Dim x As New TheBigOne Dim wapi As New Windows_API Dim r() As String Selection.CurrentRegion.Select Call wapi.ClipBoard_SetData(x.SQLp_build_sql_values(x.ARRAYp_get_range_string(Selection), True, True, PostgreSQL, True)) End Sub Sub sql_from_range_pg_noqh() Dim x As New TheBigOne Dim wapi As New Windows_API Dim r() As String Selection.CurrentRegion.Select Call wapi.ClipBoard_SetData(x.SQLp_build_sql_values(x.ARRAYp_get_range_string(Selection), True, True, PostgreSQL, False)) End Sub Sub auto_fit_range() Selection.CurrentRegion.Columns.AutoFit End Sub Sub pivot_field_format() Attribute pivot_field_format.VB_ProcData.VB_Invoke_Func = "F\n14" ActiveSheet.PivotTables(1).PivotFields(ActiveCell.value).NumberFormat = "_(* #,##0_);_(* (#,##0);_(* ""-""_);_(@_)" End Sub Sub pivot_field_format_3dec() Attribute pivot_field_format_3dec.VB_ProcData.VB_Invoke_Func = "N\n14" ActiveSheet.PivotTables(1).PivotFields(ActiveCell.value).NumberFormat = "_(* #,##0.000_);_(* (#,##0.000);_(* ""-""???_);_(@_)" End Sub Sub pivot_field_format_1dec() Attribute pivot_field_format_1dec.VB_ProcData.VB_Invoke_Func = "M\n14" ActiveSheet.PivotTables(1).PivotFields(ActiveCell.value).NumberFormat = "_(* #,##0.0_);_(* (#,##0.0);_(* ""-""???_);_(@_)" End Sub Sub Write_selection() Dim p As FileDialog '--------Open file------------- Set p = Application.FileDialog(msoFileDialogSaveAs) p.Show Call x.FILEp_CreateTXT(p.SelectedItems(1), x.SHTp_Get(ActiveSheet.Name, Selection.row, Selection.column, False)) End Sub Sub dump_markdown() Dim path As String Dim s As Worksheet Dim x As New TheBigOne Dim wapi As New Windows_API path = ActiveWorkbook.path & "\" & Mid(ActiveWorkbook.Name, 1, InStr(1, ActiveWorkbook.Name, ".xl")) & "md" For Each s In ActiveWorkbook.Worksheets Call wapi.ClipBoard_SetData(x.markdown_whole_sheet(s)) Next s End Sub Sub test() Dim c As New WindCrypt c.Password = "hi" c.InBuffer = "test" Call c.Validate End Sub Sub split_forecast_data() Application.EnableCancelKey = xlDisabled Dim wb As Workbook Dim ws As Worksheet Dim d() As String Dim u() As String Dim f() As String Dim i As Long d = x.SHTp_Get("Data", 1, 1, True) u = d Call x.TBLp_Aggregate(u, False, True, True, Array(1), Array("S"), Array(5, 6, 7, 8)) For i = 1 To UBound(u, 2) Call Sheets("TEMPLATE").Copy(Sheets(i)) Set ws = Sheets(i) ws.Name = Left(RTrim(u(0, i)), 20) f = d Call x.TBLp_FilterSingle(f, 1, u(0, i), True) Call x.SHTp_Dump(f, ws.Name, 3, 12, False, True, 16, 17, 18, 19) Next i End Sub Function range_empty(ByRef r As Range) As Boolean Dim c As Range range_empty = True For Each c In r.Cells If Not IsEmpty(c.value) Then range_empty = False Exit Function End If Next c End Function Function build_monthly(ByRef part As String, billto_group As String, month As String, vol As Double, amt As Double) As String Dim j As Object Set j("part") = part Set j("billto_group") = billto_group Set j("month") = month Set j("part") = vol Set j("part") = amt build_monthly = JsonConverter.ConvertToJson(j) End Function Sub extract_price_matrix() '------------------------------------setup------------------------------------------------- Dim wapi As New Windows_API Dim x As New TheBigOne Dim tbl() As Variant Dim unp() As String Dim unv() As Variant 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 '------------------------------------selection------------------------------------------------- Set ini = Application.Selection Selection.CurrentRegion.Select Set orig = Application.Selection '--------------------------------test if valid price matrix------------------------------ If Selection.Cells.Count = 1 Then MsgBox ("selection is not a table") orig.Select Exit Sub End If tbl = Selection If UBound(tbl, 1) < 2 Then error = "selection is not a valid price matrix" If UBound(tbl, 2) <> 8 Then error = "selection is not a valid price matrix" If Not error = "" Then MsgBox (error) Exit Sub End If '-----------------------------unpivot price matrix into new array----------------------------- Dim i As Long Dim j As Long Dim k As Long Dim m As Long k = 0 ReDim unp(8, (UBound(tbl, 1) - 1) * 3) 'iterate through rows For i = 2 To UBound(tbl, 1) '3 iterations per row For m = 0 To 2 k = k + 1 'part unp(0, k) = tbl(i, 1) 'stlye code unp(1, k) = tbl(i, 2) 'color tier unp(2, k) = tbl(i, 3) 'branding unp(3, k) = tbl(i, 4) 'kit 'unp(4, k) = tbl(i, 5) 'suffix unp(4, k) = tbl(i, 5) 'container unp(5, k) = m + 1 'volume break unp(6, k) = tbl(i, 6 + m) 'price unp(7, k) = i 'orig row unp(8, k) = 6 + m 'orig col Next m Next i unp(0, 0) = "stlc" unp(1, 0) = "coltier" unp(2, 0) = "branding" unp(3, 0) = "accs" 'unp(4, 0) = "suffix" unp(4, 0) = "container" unp(5, 0) = "volume" unp(6, 0) = "price" unp(7, 0) = "orig_row" unp(8, 0) = "orig_col" If Not x.TBLp_TestNumeric(unp, 7) Then MsgBox ("price is text") Exit Sub End If unp = x.TBLp_Transpose(unp) unv = x.TBLp_StringToVar(unp) '-------------------------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.build_f20($$" & sql & "$$::jsonb)" Call wapi.ClipBoard_SetData(sql) 'If MsgBox(sql, vbOKCancel, "continue with build?") = vbCancel Then Exit Sub 'Exit Sub login.Show If Not login.proceed Then Exit Sub If Not x.ADOp_OpenCon(0, PostgreSQLODBC, "usmidlnx01", False, login.tbU.text, login.tbP.text, "Port=5030;Database=ubm") Then MsgBox ("not able to connect to CMS" & vbCrLf & x.ADOo_errstring) Exit Sub End If cms_pl = x.ADOp_SelectS(0, sql, True, 50000, True) Call x.ADOp_CloseCon(0) '--------------------------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.Select 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 With orig.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With '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, 14) Case "" orig.Worksheet.Cells(orig.row + cms_pl(i, 12) - 1, orig.column + cms_pl(i, 13) - 1).Interior.ThemeColor = xlThemeColorAccent6 Case "No UOM Conversion" If orig.Worksheet.Cells(orig.row + cms_pl(i, 12) - 1, orig.column + cms_pl(i, 13) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then orig.Worksheet.Cells(orig.row + cms_pl(i, 12) - 1, orig.column + cms_pl(i, 13) - 1).Interior.Color = RGB(255, 255, 161) End If Case "Inactive" If orig.Worksheet.Cells(orig.row + cms_pl(i, 12) - 1, orig.column + cms_pl(i, 13) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then orig.Worksheet.Cells(orig.row + cms_pl(i, 12) - 1, orig.column + cms_pl(i, 13) - 1).Interior.Color = RGB(255, 20, 161) End If Case "No SKU" If orig.Worksheet.Cells(orig.row + cms_pl(i, 12) - 1, orig.column + cms_pl(i, 13) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then orig.Worksheet.Cells(orig.row + cms_pl(i, 12) - 1, orig.column + cms_pl(i, 13) - 1).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, 12) <> cms_pl(i + j, 12) Or cms_pl(i, 13) <> cms_pl(i + j, 13) 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 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 cell.Interior.Pattern = xlNone Else If cell.Interior.Pattern = xlNone And cell.value <> "" Then cell.Interior.Color = RGB(255, 255, 161) End If End If 'if at this point the cell has no background, then there is no part, so highlight it, but only if a price is listed 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 '----------------------------cleanup------------------------------------------------------------- Set x = Nothing ini.Select End Sub Sub extract_price_matrix_suff() '------------------------------------setup------------------------------------------------- Dim wapi As New Windows_API Dim x As New TheBigOne Dim tbl() As Variant Dim unp() As String Dim unv() As Variant 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 '------------------------------------selection------------------------------------------------- Set ini = Application.Selection Selection.CurrentRegion.Select Set orig = Application.Selection '--------------------------------test if valid price matrix------------------------------ If Selection.Cells.Count = 1 Then MsgBox ("selection is not a table") orig.Select Exit Sub End If tbl = Selection If UBound(tbl, 1) < 2 Then error = "selection is not a valid price matrix" If UBound(tbl, 2) <> 9 Then error = "selection is not a valid price matrix" If Not error = "" Then MsgBox (error) Exit Sub End If '-----------------------------unpivot price matrix into new array----------------------------- Dim i As Long Dim j As Long Dim k As Long Dim m As Long k = 0 ReDim unp(9, (UBound(tbl, 1) - 1) * 3) 'iterate through rows For i = 2 To UBound(tbl, 1) '3 iterations per row For m = 0 To 2 k = k + 1 'part unp(0, k) = tbl(i, 1) 'stlye code unp(1, k) = tbl(i, 2) 'color tier unp(2, k) = tbl(i, 3) 'branding unp(3, k) = tbl(i, 4) 'kit unp(4, k) = tbl(i, 5) 'suffix unp(5, k) = tbl(i, 6) 'container unp(6, k) = m + 1 'volume break unp(7, k) = tbl(i, 7 + m) 'price unp(8, k) = i 'orig row unp(9, k) = 7 + m 'orig col Next m Next i unp(0, 0) = "stlc" unp(1, 0) = "coltier" unp(2, 0) = "branding" unp(3, 0) = "accs" unp(4, 0) = "suffix" unp(5, 0) = "container" unp(6, 0) = "volume" unp(7, 0) = "price" unp(8, 0) = "orig_row" unp(9, 0) = "orig_col" If Not x.TBLp_TestNumeric(unp, 7) Then MsgBox ("price is text") Exit Sub End If unp = x.TBLp_Transpose(unp) unv = x.TBLp_StringToVar(unp) '-------------------------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.build_f20_suff($$" & sql & "$$::jsonb)" Call wapi.ClipBoard_SetData(sql) 'If MsgBox(sql, vbOKCancel, "continue with build?") = vbCancel Then Exit Sub 'Exit Sub login.Show If Not login.proceed Then Exit Sub If Not x.ADOp_OpenCon(0, PostgreSQLODBC, "usmidlnx01", False, login.tbU.text, login.tbP.text, "Port=5030;Database=ubm") Then MsgBox ("not able to connect to CMS" & vbCrLf & x.ADOo_errstring) Exit Sub End If cms_pl = x.ADOp_SelectS(0, sql, True, 50000, True) Call x.ADOp_CloseCon(0) 'Exit Sub '--------------------------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.Select 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 With orig.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With '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) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor = xlThemeColorAccent6 Case "No UOM Conversion" If orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.Color = RGB(255, 255, 161) End If Case "Inactive" If orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.Color = RGB(255, 20, 161) End If Case "No SKU" If orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).Interior.ThemeColor <> xlThemeColorAccent6 Then orig.Worksheet.Cells(orig.row + cms_pl(i, 13) - 1, orig.column + cms_pl(i, 14) - 1).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 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 cell.Interior.Pattern = xlNone Else If cell.Interior.Pattern = xlNone And cell.value <> "" Then cell.Interior.Color = RGB(255, 255, 161) End If End If 'if at this point the cell has no background, then there is no part, so highlight it, but only if a price is listed 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 '----------------------------cleanup------------------------------------------------------------- Set x = Nothing ini.Select End Sub Sub go_to_price_issue() Dim ws As Worksheet Dim cp As CustomProperty Dim orig As Range Dim trow As Long Dim tcol As Long Dim i As Long Dim has_Pricesheet As Boolean has_Pricesheet = False For Each ws In Application.Worksheets For Each cp In ws.CustomProperties If cp.Name = "spec_name" And cp.value = "price_list" Then Set price_sheet = ws has_Pricesheet = True End If Next cp Next ws If Not has_Pricesheet Then MsgBox ("no price sheet found") Exit Sub End If Set orig = Application.Selection Selection.CurrentRegion.Select trow = orig.row - Selection.row + 1 tcol = orig.column - Selection.column + 1 orig.Select i = 1 Do Until price_sheet.Cells(i, 1) = "" If price_sheet.Cells(i, 15) = trow And price_sheet.Cells(i, 16) = tcol And price_sheet.Cells(i, 14) <> "" Then price_sheet.Select ActiveSheet.Cells(i, 14).Select Exit Sub End If i = i + 1 Loop End Sub Sub build_price_upload_suff() 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 'ulsql = FL.x.SQLp_build_sql_values(pl, True, True, PostgreSQL, False) 'pl = x.TBLp_Transpose(pl) 'plv = x.TBLp_StringToVar(pl) 'ulsql = x.json_from_table(plv, "") 'ulsql = "DECLARE GLOBAL TEMPORARY TABLE session.plb AS (" & ulsql & ") WITH DATA" ' If login.tbP.Text = "" Then ' login.Show ' If Not login.proceed Then ' Exit Sub ' End If ' End If 'Call wapi.ClipBoard_SetData(ulsql) 'Exit Sub 'If Not FL.x.ADOp_Exec(0, ulsql, 1, True, ISeries, "S7830956", False, "PTROWBRIDG", "QQQX53@041") Then ' MsgBox (FL.x.ADOo_errstring) ' Exit Sub 'End If 'pl = FL.x.ADOp_SelectS(0, "SELECT p.*, CASE WHEN COALESCE(c.jcpart,'') = '' THEN '1' ELSE '2' END flag FROM Session.plb P LEFT OUTER JOIN lgdat.iprcc c ON c.jcpart = P.Item AND c.JCPLCD = '" & pl_code & "' AND c.JCVOLL = p.vbqty * cast(p.num as float) / cast(p.den as float)", True, 10000, True) 'If Not FL.x.ADOp_Exec(0, "DROP TABLE SESSION.PLB", 1, True, ISeries, "S7830956", False, login.tbU.Text, login.tbP.Text) Then ' MsgBox (FL.x.ADOo_errstring) ' Exit Sub 'End If 'Call FL.x.ADOp_CloseCon(0) 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 Sub price_load_pcore() Dim x As New TheBigOne 'function library Dim sh As Worksheet 'target worksheet Dim big() As String 'all price lists in one array 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 Dim dcol() As Integer 'columns to be deleted Dim typeflag() As String 'array of column types Dim i As Long Dim j As Long 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 End If Next i '------if no columns are labeled plist then exit------------------------------ If pcount = 0 Then Exit Sub ReDim Preserve pcol(pcount) ReDim typeflag(9) If Not x.ADOp_OpenCon(0, PostgreSQLODBC, "usmidlnx01", False, "ptrowbridge", "qqqx53!030", "Port=5030;Database=ubm") Then MsgBox (Err.Description) Exit Sub End If '------prepare upload for each price list------------------------------------- typeflag(0) = "S" typeflag(1) = "S" typeflag(2) = "S" typeflag(3) = "S" typeflag(4) = "S" typeflag(5) = "S" typeflag(6) = "N" typeflag(7) = "N" typeflag(8) = "N" typeflag(9) = "S" For pcount = 1 To UBound(pcol) ReDim load(9, UBound(big, 2)) '----set headers----- load(0, 0) = "stlc" load(1, 0) = "coltier" load(2, 0) = "branding" load(3, 0) = "accs" load(4, 0) = "suff" load(5, 0) = "pckg" load(6, 0) = "pack" load(7, 0) = "mp" load(8, 0) = "bulk" load(9, 0) = "plist" '-----populate------------ For i = 1 To UBound(big, 2) load(0, i) = big(0, i) load(1, i) = big(1, i) load(2, i) = big(2, i) load(3, i) = big(3, i) load(4, i) = big(4, i) load(5, i) = big(5, i) load(6, i) = Format(big(pcol(pcount) - 3, i), "####0.00") load(7, i) = Format(big(pcol(pcount) - 2, i), "####0.00") load(8, i) = Format(big(pcol(pcount) - 1, i), "####0.00") load(9, i) = big(pcol(pcount) - 0, i) Next i '------build insert statement for target price list----- sql = "BEGIN;" sql = sql & vbCrLf & "DELETE FROM rlarp.pcore WHERE plist = '" & load(9, 1) & "';" sql = sql & vbCrLf & "INSERT INTO rlarp.pcore" sql = sql & vbCrLf & x.SQLp_build_sql_values(load, True, True, PostgreSQL, False, "S", "S", "S", "S", "S", "S", "N", "N", "N", "S") & ";" sql = sql & vbCrLf & "COMMIT;" '------do the insert------------------------------------ If Not x.ADOp_Exec(0, sql) Then MsgBox (x.ADOo_errstring) Exit Sub End If Next pcount Call x.ADOp_CloseCon(0) End Sub Sub price_issues() Dim x As New TheBigOne Dim ilist() As String Dim sql As String If ActiveSheet.Name <> "Issues" Then Exit Sub ilist = x.SHTp_Get(ActiveSheet.Name, 1, 1, True) sql = "BEGIN;" & vbCrLf & "DELETE FROM rlarp.issues;" & vbCrLf & "INSERT INTO rlarp.issues" & vbCrLf sql = sql & x.SQLp_build_sql_values(ilist, True, True, PostgreSQL, False, "S", "S", "S", "S") & ";" sql = sql & vbCrLf & "END;" If Not x.ADOp_Exec(0, sql, 1, True, PostgreSQLODBC, "usmidlnx01", False, "ptrowbridge", "qqqx53!030", "Port=5030;Database=ubm") Then MsgBox (x.ADOo_errstring) End If Call x.ADOp_CloseCon(0) Set x = Nothing End Sub Sub nursery_parse() Dim tbo As New TheBigOne Dim sh As Worksheet Dim a As Long 'header row Dim i As Long 'last row Dim j As Long 'starting column Dim c As Long 'customer column Dim n As Long 'customer count Dim x As Long 'max column Dim b As Long 'ext part iterator Dim z As Long 'ext all rows iterator Dim partcol As Long 'part number column Dim p() As Double 'log Dim m() As String 'customer name Dim ext() As String Dim sql As String Dim exists As Boolean z = 0 partcol = 2 ReDim ext(3, 10000) ext(0, 0) = "part" ext(1, 0) = "customer" ext(2, 0) = "price" ext(3, 0) = "region" For Each sh In Application.Worksheets If InStr(sh.Name, "Price & Vol") > 0 Then ReDim p(30) ReDim m(30) a = 6 '----find max row------------------------------------ i = a + 1 Do Until sh.Cells(i, 2) = "" Or i = 1000 i = i + 1 Loop i = i - 1 '----find starting column---------------------------- j = 1 Do Until InStr(sh.Cells(a, j), "Order $") Or j = 1000 j = j + 1 Loop c = 1 '----identity price columns numbers------------------ n = 0 Do Until sh.Cells(a, c + j) = "" If InStr(sh.Cells(a, c + j), "NEW PRICE") > 0 Then n = n + 1 p(n) = c + j End If c = c + 1 Loop x = c + j '----get the customer names-------------------------- n = 0 For c = j To x If sh.Cells(a - 1, c) <> "" Then n = n + 1 m(n) = sh.Cells(a - 1, c) End If Next c '---resize arrays------ ReDim Preserve p(n) ReDim Preserve m(n) '---for each customer loop through all the parts For n = 1 To UBound(p) For b = a + 1 To i z = z + 1 ext(0, z) = sh.Cells(b, partcol) ext(1, z) = m(n) ext(2, z) = sh.Cells(b, p(n)) ext(3, z) = sh.Cells(2, 1) Next b Next n Else 'not a price tab End If Next sh ReDim Preserve ext(3, z) Call tbo.TBLp_FilterSingle(ext, 2, "0", False) Call tbo.TBLp_FilterSingle(ext, 2, "", False) '---------dump consolidated pricing to worksheet------------ exists = False For Each sh In Application.Worksheets If sh.Name = "consolidated price list" Then sh.Cells.ClearContents exists = True Exit For End If Next sh '--------- If Not exists Then Set sh = Application.Worksheets.Add() sh.Name = "consolidated price list" End If Call tbo.SHTp_Dump(ext, "consolidated price list", 1, 1, False, True) ext = tbo.TBLp_Transpose(ext) ' sql = tbo.ADOp_BuildInsertSQL(ext, "rlarp.nregional", True, 1, UBound(ext, 2), Array("S", "S", "N", "S")) ' sql = "truncate table rlarp.nregional;" & vbCrLf & sql & ";" ' If Not tbo.ADOp_Exec(0, sql, 1, True, PostgreSQLODBC, "usmidlnx01", False, "ptrowbridge", "qqqx53!030", "Port=5030;Database=ubm") Then ' MsgBox (tbo.ADOo_errstring) ' Else ' MsgBox ("Uploaded") ' End If End Sub Sub convert_to_value() Dim c As Object For Each c In Selection.Cells If IsNumeric(c.value) Then c.value = CDbl(c.value) Next c End Sub Sub pricegroup_upload() Dim sql As String Selection.CurrentRegion.Select sql = x.SQLp_build_sql_values(x.ARRAYp_get_range_string(Selection), True, True, PostgreSQL, False, "S", "S", "S", "S", "S", "S", "S", "S", "S", "N", "S", "S", "S", "A") sql = "BEGIN;" & vbCrLf & "DELETE FROM rlarp.price_map;" & vbCrLf & "INSERT INTO rlarp.price_map" & vbCrLf & sql & ";" & vbCrLf & "COMMIT;" If Not x.ADOp_Exec(0, sql, 1, True, PostgreSQLODBC, "usmidlnx01", False, "ptrowbridge", "qqqx53!030", "Port=5030;Database=ubm") Then MsgBox (x.ADOo_errstring) Exit Sub Else 'MsgBox ("Upload Complete") End If Call x.ADOp_CloseCon(0) sql = x.SQLp_build_sql_values(x.ARRAYp_get_range_string(Selection), True, True, PostgreSQL, False, "S", "S", "S", "S", "S", "S", "S", "S", "S", "N", "S", "S", "S", "A") sql = "BEGIN" & vbCrLf & "DELETE FROM rlarp.price_map;" & vbCrLf & "INSERT INTO rlarp.price_map" & vbCrLf & sql & ";" & vbCrLf & "END" If Not x.ADOp_Exec(0, sql, 1, True, ADOinterface.SqlServer, "usmidsql01", True) Then MsgBox (x.ADOo_errstring) Else MsgBox ("Upload Complete") End If Call x.ADOp_CloseCon(0) Set x = Nothing Call pricegroup_upload_db2 End Sub Sub pricegroup_upload_db2() Dim sql As String Selection.CurrentRegion.Select Dim ulv() As Variant Dim ul() As String Dim i As Long Dim inc As Long ulv = Selection ul = x.TBLp_VarToString(ulv) ul = x.TBLp_Transpose(ul) 'sql = x.SQLp_build_sql_values(x.ARRAYp_get_range_string(Selection), True, True, Db2, False) 'sql = "BEGIN" & vbCrLf & "DELETE FROM rlarp.price_map;" & vbCrLf & "INSERT INTO rlarp.price_map" & vbCrLf & sql & ";" & vbCrLf & "END" 'Dim w As New Windows_API 'Call w.ClipBoard_SetData(sql) If Not x.ADOp_OpenCon(0, ISeries, "S7830956", False, "PTROWBRIDG", "QQQX53@048") Then MsgBox (x.ADOo_errstring) Exit Sub End If If Not x.ADOp_Exec(0, "DELETE FROM rlarp.price_map") Then MsgBox (x.ADOo_errstring) Exit Sub End If '------------incremental upload---------------------- i = 2 inc = 250 Do While i <= UBound(ul, 2) 'sql = x.ADOp_BuildInsertSQL(ul, "rlarp.price_map", True, i, WorksheetFunction.Min(i + inc, UBound(ul, 2)), Array("S", "S", "S", "S", "S", "S", "S", "N", "S", "S")) sql = x.SQLp_build_sql_values_ranged(ul, True, True, Db2, False, i, i + inc, "S", "S", "S", "S", "S", "S", "S", "S", "S", "N", "S", "S", "S", "A") sql = "INSERT INTO rlarp.price_map " & vbCrLf & sql If Not x.ADOp_Exec(0, sql) Then MsgBox (x.ADOo_errstring) Call x.ADOp_CloseCon(0) Exit Sub End If i = i + inc + 1 If i > UBound(ul, 2) Then Exit Do If i + inc > UBound(ul, 2) Then inc = UBound(ul, 2) - i Loop MsgBox ("Upload Complete") Call x.ADOp_CloseCon(0) Set x = Nothing End Sub