- 有CSV文件數(shù)據(jù)拷沸,如下圖
- 數(shù)據(jù)都只在一個單元格內
- 完整的一條數(shù)據(jù)分為兩個單元格,見標題處消玄。
- 中間還有小計行跟伏,如下圖
- 開頭是1的特殊數(shù)據(jù)
- 末尾的數(shù)據(jù)格式,如下圖翩瓜。
- 最終結果:如下圖
- 這樣的CSV文件有多個受扳,格式都一樣。
- 處理方法:
Sub InputCSV110()
Dim Arr, brr()
Dim MyName As String
Dim MyPath As String
Dim sFType As String
Dim wkb As Workbook
Application.ScreenUpdating = False'關閉屏幕刷新
Application.DisplayAlerts = False'關閉屏幕提示
ActiveSheet.UsedRange.Offset(1, 0).ClearContents'清空源數(shù)據(jù)區(qū)域
sFType = "*.csv" '文件類型
MyPath = ThisWorkbook.Path & "\" '路徑
MyName = Dir(MyPath & sFType) '返回文件名稱
Do Until MyName = "" '遍歷文件
Set wkb = Workbooks.Open(MyPath & MyName)'打開CSV文件
Arr = wkb.ActiveSheet.[a1].CurrentRegion'將數(shù)據(jù)放進數(shù)組arr
wkb.Close False'關閉CSV文件
'定位有效數(shù)據(jù)的最后一行,即末尾圖片中包含‘小計’的最后單元格兔跌,這里除了循環(huán)勘高,也可以用find方法定位。
For i = UBound(Arr) To LBound(Arr) Step -1
If InStr(Arr(i, 1), "小計") > 0 Then
x = i - 1
Exit For
End If
Next
ReDim brr(1 To UBound(Arr), 1 To 16)'定義數(shù)組brr裝入符合條件的數(shù)據(jù)
For i = 11 To x - 1 Step 2'遍歷數(shù)組元素,提取數(shù)據(jù)
If InStr(Arr(i, 1), "小計") = 0 Then'如果數(shù)組元素不包含‘小計’的字符,就符合要求华望,提取數(shù)據(jù)
k = k + 1'計數(shù)
'數(shù)據(jù)分為2行蕊蝗,split分列,數(shù)組元素值為空的不要赖舟,數(shù)組元素為1的(有且只有開頭為1)不要
s = Split(Arr(i, 1), " ") '第一行數(shù)據(jù)
For Each p In s
If p <> "" And p <> 1 Then
n = n + 1
brr(k, n) = p
End If
Next
ss = Split(Arr(i + 1, 1), " ") '第二行數(shù)據(jù)
For Each pp In ss
If pp <> "" And pp <> 1 Then
n = n + 1
brr(k, n) = pp
End If
Next
n = 0 'n復位
Else
i = i - 1'小計行則倒將i-1蓬戚,回檔跳過小計(步長是step 2)
End If
Next
'循環(huán)結束,輸出數(shù)據(jù)
Range("A" & Cells(Rows.Count, 1).End(xlUp).Row + 1).Resize(k, 16) = brr
k = 0
MyName = Dir'輪到下一個CSV文件
Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
示例文件下載
鏈接: http://pan.baidu.com/s/1gfve7qN 密碼: 397s