VBA处理数据与Python Pandas处理数据案例比较分析(python vs vba)原创

随心笔谈11个月前发布 admin
75 0


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

© 版权声明

相关文章