Vba 在多个excel文件上运行相同的excel宏
我有一个文件夹,每天接收1000多个excel文件,它们的格式和结构都相同。我想做的是每天对所有100多个文件运行一个宏Vba 在多个excel文件上运行相同的excel宏,vba,excel,Vba,Excel,我有一个文件夹,每天接收1000多个excel文件,它们的格式和结构都相同。我想做的是每天对所有100多个文件运行一个宏 有没有办法实现自动化?所以我可以每天在1000多个文件上运行相同的宏 假设您将文件放在相对于主工作簿的“files”目录中,您的代码可能如下所示: 子进程文件() Dim文件名,路径名为字符串 将wb设置为工作簿 路径名=ActiveWorkbook.Path&“\Files\” Filename=Dir(路径名和“*.xls”) 文件名“”时执行此操作 设置wb=Workb
有没有办法实现自动化?所以我可以每天在1000多个文件上运行相同的宏 假设您将文件放在相对于主工作簿的“files”目录中,您的代码可能如下所示:
子进程文件()
Dim文件名,路径名为字符串
将wb设置为工作簿
路径名=ActiveWorkbook.Path&“\Files\”
Filename=Dir(路径名和“*.xls”)
文件名“”时执行此操作
设置wb=Workbooks.Open(路径名和文件名)
销钉wb
wb.Close SaveChanges:=真
Filename=Dir()
环
端接头
子工作(wb作为工作簿)
与wb
“你在这里工作吗
.Worksheets(1).Range(“A1”).Value=“你好,世界!”
以
端接头
在本例中,DoWork()
是应用于所有文件的宏。确保宏中的所有处理始终在wb
(当前打开的工作簿)的上下文中进行
免责声明:为了简洁起见,跳过了所有可能的错误处理。问题的一部分可能是如何在1000个文件上运行此操作?。。。我是否必须将此宏添加到所有1000个工作簿中 一种方法是将宏集中添加到文件
PERSONAL.XLSB
(有时扩展名可能不同)。每次启动Excel时,都会在后台加载此文件,并使宏随时可用
最初,PERSONAL.XLSB文件将不存在。要自动创建此文件,只需开始录制“虚拟”宏(电子表格左下角的“录制”按钮),然后选择“个人宏工作簿”将其存储
录制宏后,可以使用Alt+F11打开VBA编辑器,您将看到带有“虚拟”录制宏的PERSONAL.XLSB文件
我使用这个文件来存储总是可用的常规宏的加载,与我打开的.xlsx文件无关。我已将这些宏添加到我自己的菜单功能区中
此常用宏文件的一个缺点是,如果启动多个Excel实例,您将收到一条错误消息,说明PERSONAL.XLSB文件已被Excel实例1使用。只要此时不添加新宏,这没有问题。除了将值传递给DoWork,还可以在
Processfiles()
中运行作业
子进程文件()
Dim文件名,路径名为字符串
将wb1设置为工作簿
将wb2设置为工作簿
将工作表设置为工作表
从范围开始
作为整数的Dim计数器
设置wb1=ActiveWorkbook
设置粘贴开始=[RRimport!A1]
Pathname=ActiveWorkbook.Path&“\用于运行宏\”
Filename=Dir(路径名和“*.xls”)
文件名“”时执行此操作
Set wb2=Workbooks.Open(路径名和文件名)
对于wb2.Sheets中的每张工作表
使用Sheet.UsedRange
.复制粘贴开始
设置PasteStart=PasteStart.Offset(.Rows.Count)
以
下一页
wb2.关闭
Filename=Dir()
环
端接头
谢谢彼得
实际上,我的宏使用的代码与您发布的代码完全相同(process_fiels和dowork)
真是太棒了!!(在我的问题之前)
我的1000本工作簿中,每本都有84张工作表。我自己的宏(终于起作用了!)将每个工作簿拆分为85个不同的文件(每个工作表的原始+简短版本保存为单个文件)
这让我在同一个文件夹中有1000个文件+1000x85,这真的很难分类
我真正需要的是Process_Files获取第一个文件,使用第一个文件的名称创建一个文件夹,将第一个文件移动到具有ist名称的文件夹,然后运行我的宏(在新创建的文件夹中以第一个文件命名的文件夹中…),返回并获取第二个文件,使用第二个文件的名称创建一个文件夹,将第二个文件移动到具有ist名称的文件夹中,然后运行“我的宏”(在新创建的文件夹中以第二个文件命名的文件夹中…),等等
最后,我应该将所有文件移动到与文件同名的文件夹中,并且原始\files\文件夹的内容将是1000个具有原始文件名称的文件夹,其中包含原始文件+84个文件,而我自己的宏已经这样做了
也许使用代码更容易:
子进程文件()
Dim文件名,路径名为字符串
将wb设置为工作簿
Pathname = ActiveWorkbook.Path & "\Files\"
Filename = Dir(Pathname & "*.xls")
Do While Filename <> ""
Pathname = ActiveWorkbook.Path & "\Files\"
Filename = Dir(Pathname & "*.csv")
Do While Filename <> ""
NewPath = Pathname & Left(Filename, 34) & "\"
On Error Resume Next
MkDir (NewPath)
On Error GoTo 0
Set wb = Workbooks.Open(Pathname & Filename)
DoWorkPlease wb ' <------------ It is important to say please!!
端接头
Sub ProcessFiles()
Dim Filename, Pathname As String
Dim wb As Workbook
Pathname = ActiveWorkbook.Path & "\C:\Users\20098323\Desktop\EXCL\"
Filename = Dir(Pathname & "*.xlsx")
Do While Filename <> ""
Set wb = Workbooks.Open(Pathname & Filename)
DoWork wb
wb.Close SaveChanges:=True
Filename = Dir()
Loop
End Sub
Sub DoWork(wb As Workbook)
With wb
'Do your work here
.Worksheets(1).Range("A1").Value = "Hello World!"
End With
End Sub
子工作表(wb作为工作簿)
与wb
“因为我的应用程序每列有1800多个单元格,而且非常耗时
我使用“测试模式”,因为我只玩18个值
Dim TestingMode As Integer
Dim ThisRange(1 To 4) As Variant
TestingMode = 0
If TestingMode = 1 Then
ThisRange(1) = "B2:CG18"
ThisRange(2) = "CT2:CT18"
ThisRange(3) = "CH2:CN18"
ThisRange(4) = "CN2:CS18"
Rows("19:18201").Select
Selection.Delete Shift:=xlUp
End If
If TestingMode = 0 Then
ThisRange(1) = "B2:CG18201"
ThisRange(2) = "CT2:CT18201"
ThisRange(3) = "CH2:CN18201"
ThisRange(4) = "CN2:CS18201"
End If
'加快宏速度,关闭更新和警报Application.ScreenUpdating=False Application.DisplayAlerts=False “这是我的代码,它从数字(传感器读取的值需要“翻译”成真实世界的值)中操作单元格值。实际上,代码不是在这里 然后我把整个过程复制成数字,不再有公式,这样更容易操作 "_____________________________________ '只获取值-不再获取公式
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet1").Select
Columns("A:CT").Select
Selection.Copy
Sheets("Sheet2").Select
Columns("A:A").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.NumberFormat = "0"
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
'然后我将此新工作簿保存到一个具有自己名称的文件夹中(在文件夹\文件下)\
"_____________________________________
'将工作保存在其自己的文件夹下
将CleanName、CleanPath、CleanNewName变为变量
CleanPath=ActiveWorkbook.Path
CleanName=ActiveWorkbook.Name
CleanName=Left(CleanName,34)'I取出扩展名
CleanPath=CleanPath+“\”+CleanName
CleanNewName=CleanPath+“\”+CleanName
CleanNewName=CleanNewName+“_clean.csv””和I a
Filename = Dir()
Loop
Dim TestingMode As Integer
Dim ThisRange(1 To 4) As Variant
TestingMode = 0
If TestingMode = 1 Then
ThisRange(1) = "B2:CG18"
ThisRange(2) = "CT2:CT18"
ThisRange(3) = "CH2:CN18"
ThisRange(4) = "CN2:CS18"
Rows("19:18201").Select
Selection.Delete Shift:=xlUp
End If
If TestingMode = 0 Then
ThisRange(1) = "B2:CG18201"
ThisRange(2) = "CT2:CT18201"
ThisRange(3) = "CH2:CN18201"
ThisRange(4) = "CN2:CS18201"
End If
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Sheet1").Select
Columns("A:CT").Select
Selection.Copy
Sheets("Sheet2").Select
Columns("A:A").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.NumberFormat = "0"
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
If Err.Number <> 0 Then
MkDir (CleanPath + "_error_" + CleanName)
End If
For i = 1 To CounterMode
Sheets("Sheet1").Select
Cells.Select
Selection.ClearContents
Range("A1").Activate
Sheets(2).Select
Range(Col(i)).Select
Selection.Copy
Sheets("Sheet1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Columns("A:E").EntireColumn.AutoFit
'_____________save the work________________
Range("A1").Select
Sheets("Sheet1").Select
Sheets("Sheet1").Copy
Dim SheetName As Variant
Columns("A:E").EntireColumn.AutoFit
Columns("B:E").Select
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("'Sheet1'!$B:$E")
ActiveChart.ChartType = xlXYScatterLinesNoMarkers
ActiveWorkbook.Sheets(1).Name = SheetName
If Err.Number <> 0 Then
MkDir (ThePath + "_error_" + TheName)
End If
ActiveWorkbook.Close
End With
Sub ProcessFiles()
Dim Filename, Pathname As String
Dim wb As Workbook
Pathname = ActiveWorkbook.Path & "\C:\Users\20098323\Desktop\EXCL\"
Filename = Dir(Pathname & "*.xlsx")
Do While Filename <> ""
Set wb = Workbooks.Open(Pathname & Filename)
DoWork wb
wb.Close SaveChanges:=True
Filename = Dir()
Loop
End Sub
Sub DoWork(wb As Workbook)
With wb
'Do your work here
.Worksheets(1).Range("A1").Value = "Hello World!"
End With
End Sub
Sub ProcessFiles()
Dim Filename, Pathname As String
Dim wb As Workbook
Pathname = ActiveWorkbook.Path & "C:\Users\jkatanan\Desktop\20170206Glidepath\V37\"
Filename = Dir(Pathname & "*.xls")
Do While Filename <> ""
Set wb = Workbooks.Open(Pathname & Filename)
BSAQmacro wb
wb.Close SaveChanges:=True
Filename = Dir()
Loop
End Sub
Sub DoWork(wb As Workbook)
With wb
'Do your work here
.Worksheets(1).Range("A1").Value = "Hello World!"
End With
End Sub