| Option Base 1 Option Explicit Sub main() On Error GoTo error_handling Dim wb As Workbook Dim wb_out As Workbook Dim sht As Worksheet Dim sht_out As Worksheet Dim rng As Range Dim usedrows As Byte Dim usedrows_out As Byte Dim dict_cnum_company As Object Dim str_file_path As String Dim str_new_file_path As String 'assign values to variables: str_file_path = "C:\Users\12078\Desktop\Python\CNUM_COMPANY.csv" str_new_file_path = "C:\Users\12078\Desktop\Python\CNUM_COMPANY_OUTPUT.csv" Set wb = checkAndAttachWorkbook(str_file_path) Set sht = wb.Worksheets("CNUM_COMPANY") Set wb_out = Workbooks.Add wb_out.SaveAs str_new_file_path, xlCSV 'create a csv file Set sht_out = wb_out.Worksheets("CNUM_COMPANY_OUTPUT") Set dict_cnum_company = CreateObject("Scripting.Dictionary") usedrows = WorksheetFunction.Max(getLastValidRow(sht, "A"), getLastValidRow(sht, "B")) 'rename the header 'COMPANY' to 'Company_New',remove blank & duplicate lines/rows. Dim cnum_company As String cnum_company = "" For Each rng In sht.Range("A1", "A" & usedrows) If VBA.Trim(rng.Offset(0, 1).Value) = "COMPANY" Then rng.Offset(0, 1).Value = "Company_New" End If cnum_company = rng.Value & "-" & rng.Offset(0, 1).Value If VBA.Trim(cnum_company) <> "-" And Not dict_cnum_company.Exists(rng.Value & "-" & rng.Offset(0, 1).Value) Then dict_cnum_company.Add rng.Value & "-" & rng.Offset(0, 1).Value, "" End If Next rng 'loop the keys of dict split the keyes by '-' into cnum array and company array. Dim index_dict As Byte Dim arr_cnum() Dim arr_Company() For index_dict = 0 To UBound(dict_cnum_company.keys) ReDim Preserve arr_cnum(1 To UBound(dict_cnum_company.keys) + 1) ReDim Preserve arr_Company(1 To UBound(dict_cnum_company.keys) + 1) arr_cnum(index_dict + 1) = Split(dict_cnum_company.keys()(index_dict), "-")(0) arr_Company(index_dict + 1) = Split(dict_cnum_company.keys()(index_dict), "-")(1) Debug.Print index_dict Next 'assigns the value of the arrays to the celles. sht_out.Range("A1", "A" & UBound(arr_cnum)) = Application.WorksheetFunction.Transpose(arr_cnum) sht_out.Range("B1", "B" & UBound(arr_Company)) = Application.WorksheetFunction.Transpose(arr_Company) 'add 6 columns to output csv file: Dim arr_columns() As Variant arr_columns = Array("C_col", "D_col", "E_col", "F_col", "G_col", "H_col") ' sht_out.Range("C1:H1") = arr_columns Call checkAndCloseWorkbook(str_file_path, False) Call checkAndCloseWorkbook(str_new_file_path, True) Exit Sub error_handling: Call checkAndCloseWorkbook(str_file_path, False) Call checkAndCloseWorkbook(str_new_file_path, False) End Sub ' 辅助函数: 'Get last row of Column N in a Worksheet Function getLastValidRow(in_ws As Worksheet, in_col As String) getLastValidRow = in_ws.Cells(in_ws.Rows.count, in_col).End(xlUp).Row End Function Function checkAndAttachWorkbook(in_wb_path As String) As Workbook Dim wb As Workbook Dim mywb As String mywb = in_wb_path For Each wb In Workbooks If LCase(wb.FullName) = LCase(mywb) Then Set checkAndAttachWorkbook = wb Exit Function End If Next Set wb = Workbooks.Open(in_wb_path, UpdateLinks:=0) Set checkAndAttachWorkbook = wb End Function Function checkAndCloseWorkbook(in_wb_path As String, in_saved As Boolean) Dim wb As Workbook Dim mywb As String mywb = in_wb_path For Each wb In Workbooks If LCase(wb.FullName) = LCase(mywb) Then wb.Close savechanges:=in_saved Exit Function End If Next End Function |