VBA 文件夹批处理操作 - CSV 列表以填充 XLS 模板
VBA Batch Action on Folder - CSV lists to fill an XLS template
我是 VB/VBA 的新手。正在努力让它发挥作用。
我发现了这个:
Looping a code through a folder of workbooks with VBA?
但它并没有完全解决我想要做的事情。我有大约 60 个干净且符合规范的 .CSV 文件,我想使用 VBA 将它们放入 Excel 模板中。我能够使用 "Record Macro" 函数使一个工作:
Range("A2:A33").Select
Selection.Copy
Workbooks.Open Filename:="C:\Users\rs\Desktop\F15-Template.xlsx"
Range("A6").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Windows("List01.csv").Activate
Range("B2").Select
Application.CutCopyMode = False
Selection.Copy
Windows("F15-Template.xlsx").Activate
Range("H2:J2").Select
ActiveSheet.Paste
Windows("List01.csv").Activate
Range("D2").Select
Application.CutCopyMode = False
Selection.Copy
Windows("F15-Template.xlsx").Activate
Range("H3:J3").Select
ActiveSheet.Paste
但如您所知,这是针对模板中的一个列表。
除了 copy/pasting 从列表到 XLS 模板之外,我还想做的事情是:
- 使上面的代码与目录一起工作
- 另存为 ListName01.xls copy/paste 合并后
- 如果可能,对这些文件应用批处理 "Protect Sheet"。
列表位于 C:\Users\rs\Desktop\lists
中,模板是裸露的 Desktop
-- 如果您能提供帮助,我们将不胜感激。
如果 VB/VBA 是工作的错误工具,请指出正确的方向。提前致谢!
这将为您提供文件夹中的 CSV 文件列表。
Sub test()
Dim FileArray() As String
Call GetFileArray(FileArray, "C:\Users\rs\Desktop\lists\")
Dim x As Integer
For x = LBound(FileArray) To UBound(FileArray)
'action here
Debug.Print FileArray(x)
Next
End Sub
Sub GetFileArray(ByRef FileArray() As String, path)
Dim fileName
Dim fileCt
Dim rowNum
If Right(path, 1) <> "\" Then path = path & "\"
'path = "C:\clientsTAX\"
fileCt = 0
rowNum = 0
fileName = Dir(path)
ReDim Preserve FileArray(fileCt)
FileArray(fileCt) = fileName
Do While fileName <> ""
fileName = Dir
If Right(fileName, 3) = "WK3" Then
fileCt = fileCt + 1
ReDim Preserve FileArray(fileCt)
FileArray(fileCt) = fileName
End If
Loop
End Sub
我会留给你填写其余的代码。
我最终做了各种各样的事情。我能找到的最好的代码块来自 Kent Finkle.
$comments = @'
Script name: DerpExcelGoodness.ps1
Thanks to Kent Finkle
Purpose: How can I use Windows Powershell to Open All the_
Excel Spreadsheets in a Folder
and Run a Specified Macro Found on those Spreadsheets?
Store Macro Excel Sheet in ~/Documents Folder
6 - csv; 51 - xlsx
'@
#-----------------------------------------------------
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject(
[System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
#-----------------------------------------------------
$files = dir("E:\<path>\*.csv")
$xl = new-object -comobject excel.application
$xl.Visible = $True
$xl.DisplayAlerts = $False
foreach ($f In $files) {
$wb = $xl.Workbooks.Open($f.FullName)
$ws = $wb.Worksheets.Item(1)
# Daisy chain is totally possible. Just uncomment.
# $a = $xl.Run("macro.xlsb!clean")
# $a = $wb.SaveAs($f.FullName + "-clean.csv", 6)
# $a = $xl.Run("macro.xlsb!gradesheet")
# $a = $xl.Run("macro.xlsb!protect")
# $a = $xl.Run("macro.xlsb!unprotect")
# $a = $wb.SaveAs($f.FullName + "-gradesheet.xlsx", 51)
$a = $wb.Close()
}
$a = $xl.Quit()
$a = Release-Ref($ws)
$a = Release-Ref($wb)
$a = Release-Ref($xl)
我只是在必要时取消注释,并且能够 运行(来自 Powerscript)文件夹上的外部宏,这非常棒且有用。
我也将这些藏在 GitHub 中:here。
我是 VB/VBA 的新手。正在努力让它发挥作用。
我发现了这个: Looping a code through a folder of workbooks with VBA?
但它并没有完全解决我想要做的事情。我有大约 60 个干净且符合规范的 .CSV 文件,我想使用 VBA 将它们放入 Excel 模板中。我能够使用 "Record Macro" 函数使一个工作:
Range("A2:A33").Select
Selection.Copy
Workbooks.Open Filename:="C:\Users\rs\Desktop\F15-Template.xlsx"
Range("A6").Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Windows("List01.csv").Activate
Range("B2").Select
Application.CutCopyMode = False
Selection.Copy
Windows("F15-Template.xlsx").Activate
Range("H2:J2").Select
ActiveSheet.Paste
Windows("List01.csv").Activate
Range("D2").Select
Application.CutCopyMode = False
Selection.Copy
Windows("F15-Template.xlsx").Activate
Range("H3:J3").Select
ActiveSheet.Paste
但如您所知,这是针对模板中的一个列表。
除了 copy/pasting 从列表到 XLS 模板之外,我还想做的事情是:
- 使上面的代码与目录一起工作
- 另存为 ListName01.xls copy/paste 合并后
- 如果可能,对这些文件应用批处理 "Protect Sheet"。
列表位于 C:\Users\rs\Desktop\lists
中,模板是裸露的 Desktop
-- 如果您能提供帮助,我们将不胜感激。
如果 VB/VBA 是工作的错误工具,请指出正确的方向。提前致谢!
这将为您提供文件夹中的 CSV 文件列表。
Sub test()
Dim FileArray() As String
Call GetFileArray(FileArray, "C:\Users\rs\Desktop\lists\")
Dim x As Integer
For x = LBound(FileArray) To UBound(FileArray)
'action here
Debug.Print FileArray(x)
Next
End Sub
Sub GetFileArray(ByRef FileArray() As String, path)
Dim fileName
Dim fileCt
Dim rowNum
If Right(path, 1) <> "\" Then path = path & "\"
'path = "C:\clientsTAX\"
fileCt = 0
rowNum = 0
fileName = Dir(path)
ReDim Preserve FileArray(fileCt)
FileArray(fileCt) = fileName
Do While fileName <> ""
fileName = Dir
If Right(fileName, 3) = "WK3" Then
fileCt = fileCt + 1
ReDim Preserve FileArray(fileCt)
FileArray(fileCt) = fileName
End If
Loop
End Sub
我会留给你填写其余的代码。
我最终做了各种各样的事情。我能找到的最好的代码块来自 Kent Finkle.
$comments = @'
Script name: DerpExcelGoodness.ps1
Thanks to Kent Finkle
Purpose: How can I use Windows Powershell to Open All the_
Excel Spreadsheets in a Folder
and Run a Specified Macro Found on those Spreadsheets?
Store Macro Excel Sheet in ~/Documents Folder
6 - csv; 51 - xlsx
'@
#-----------------------------------------------------
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject(
[System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
#-----------------------------------------------------
$files = dir("E:\<path>\*.csv")
$xl = new-object -comobject excel.application
$xl.Visible = $True
$xl.DisplayAlerts = $False
foreach ($f In $files) {
$wb = $xl.Workbooks.Open($f.FullName)
$ws = $wb.Worksheets.Item(1)
# Daisy chain is totally possible. Just uncomment.
# $a = $xl.Run("macro.xlsb!clean")
# $a = $wb.SaveAs($f.FullName + "-clean.csv", 6)
# $a = $xl.Run("macro.xlsb!gradesheet")
# $a = $xl.Run("macro.xlsb!protect")
# $a = $xl.Run("macro.xlsb!unprotect")
# $a = $wb.SaveAs($f.FullName + "-gradesheet.xlsx", 51)
$a = $wb.Close()
}
$a = $xl.Quit()
$a = Release-Ref($ws)
$a = Release-Ref($wb)
$a = Release-Ref($xl)
我只是在必要时取消注释,并且能够 运行(来自 Powerscript)文件夹上的外部宏,这非常棒且有用。
我也将这些藏在 GitHub 中:here。