これは、おそらく必要なものの90%である1つのアプローチです(テストが簡単だったのでvbaで!)
要するに:
- このコードは、 = "c:\temp\"の下にある
Dir
すべてのxls *ファイルを開くために使用しますstrDir
- 作業範囲を設定するために、そのワークブックの各シートに真の最後のセルがあります
- コードはその範囲の各行をループし、その列の1D配列を「@」でフィルタリングします
- フィルタリングされた文字列は、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
サブ終了