Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在多个excel文件上运行相同的excel宏_Vba_Excel - Fatal编程技术网

Vba 在多个excel文件上运行相同的excel宏

Vba 在多个excel文件上运行相同的excel宏,vba,excel,Vba,Excel,我有一个文件夹,每天接收1000多个excel文件,它们的格式和结构都相同。我想做的是每天对所有100多个文件运行一个宏 有没有办法实现自动化?所以我可以每天在1000多个文件上运行相同的宏 假设您将文件放在相对于主工作簿的“files”目录中,您的代码可能如下所示: 子进程文件() Dim文件名,路径名为字符串 将wb设置为工作簿 路径名=ActiveWorkbook.Path&“\Files\” Filename=Dir(路径名和“*.xls”) 文件名“”时执行此操作 设置wb=Workb

我有一个文件夹,每天接收1000多个excel文件,它们的格式和结构都相同。我想做的是每天对所有100多个文件运行一个宏


有没有办法实现自动化?所以我可以每天在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