以下是一種方法,可能是您需要的90%(在vba中,因爲它更容易測試!)
簡而言之:
- 該代碼使用
Dir
打開每XLS * strDir
下文件= 「C:\ TEMP \」
- 真正最後一個單元是在該每一片材中發現工作簿來設置工作範圍
- 代碼循環遍歷該範圍的每一行,並過濾該列的一維數組以獲得「@」
- 然後將已過濾的字符串寫入csv文件
等
[更新:現在,該代碼]
- 遍歷行不列避免了大小問題,現在輸出的行匹配的輸入文件
- 在工作簿和工作表名稱前加上電子郵件列表轉儲
代碼
Sub GetEm()
Dim wb As Workbook
Dim ws As Worksheet
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
Dim strFile As String
Dim strEmail As String
Dim strDir As String
Dim strFiltered As String
Dim objFSO As Object
Dim objTF As Object
With Application
lngcalc = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
.ScreenUpdating = False
End With
Set objFSO = CreateObject("scripting.filesystemobject")
strDir = "c:\tmp\"
strFile = Dir(strDir & "*.xls*")
Set objTF = objFSO.createtextfile(strDir & "output.csv", 2)
Do While Len(strFile) > 0
Set wb = Workbooks.Open(strDir & strFile, False)
For Each ws In wb.Sheets
Set rng1 = ws.Cells.Find("*", ws.[a1], xlFormulas, , xlByRows, xlPrevious)
'avoid blank sheets
If Not rng1 Is Nothing Then
Set rng2 = ws.Cells.Find("*", ws.[a1], xlFormulas, , xlByColumns, xlPrevious)
Set rng2 = ws.Range(ws.[a1], ws.Cells(rng1.Row, rng2.Column))
'avoid array errors on sheets with data only in A1
If rng2.Columns.Count = 1 Then Set rng2 = rng2.Resize(rng2.Rows.Count, 2)
For Each rng3 In rng2.Rows
strFiltered = Join(Filter(Application.Transpose(Application.Transpose(rng3)), "@"), ",")
If Len(strFiltered) > 0 Then
objTF.writeline (wb.Name & "," & ws.Name & ",") & strFiltered
End If
Next
End If
Next
wb.Close False
strFile = Dir
Loop
Set wb = Workbooks.Open(strDir & "output.csv", False)
wb.Sheets(1).Columns.AutoFit
With Application
.Calculation = lngcalc
.EnableEvents = True
.ScreenUpdating = True
End With
末次
如何每個.xls的轉換/ .xlsx文件轉換爲CSV第一,那麼就使用AWK或記事本++替換/使用正則表達式刪除? – Jook
將xls/xlsx轉換爲csv將涉及打開每個xls/xlsx文件並將每張表保存爲自己的csv。這將非常耗時。我試圖消除這個時間(有數百個文件,包含數千張表)。 – user1259798
電子郵件地址的流行程度如何? 1%使用空間,50%等 - 因爲這將用於編碼方法。以及爲什麼vbscript over vba的任何理由? – brettdj