在多个Excel文件中自动创build图表?

我花了大量的时间在几十个excel文件(都包含相同格式的数据)上创build相同的graphics,并相信必须有一个更有效的方式来完成我刚刚完成的工作。

为了简化,请考虑使用相同格式的数据的50个excel文档。 是否存在一种自动的方法:

  • 创build一个简单的线条图
  • 添加轴标签,图表标签,删除水平网格线
  • 包括趋势线/ R ^ 2值
  • 将新的工作簿保存到文件名后附加“_graphed”的特定位置

这是Excel VBA可以用来做什么的吗?

对于这样的问题,我将开始通过手动录制一个macros手动到个人的macros工作簿 。 然后,您可以查看由Excel生成的代码,并且您可能会发现无需进行太多的更改就可以将其用作通用过程。

经过testing,如果您想进一步采取自动化,您可以编写一个小程序来遍历目录中的所有Excel文件,并在每个文件打开时调用您的图表过程。 我可以挖出来的代码,我写了类似的东西,如果它会帮助。

更新 这里是一个线程,我已经提供了一些代码来循环所有包含一些给定文本的文件(在本例中为“.pdf”,但很容易就是“.xls”来覆盖xlsx,xlsm等)。

同样这个例子打印出一个find的文件列表。 这是testing结果的一个好的开始,但是一旦这是好的,你需要更换这一行:

 Range(c).Offset(j, 0).Value = vFileList(i) 

用一些代码打开该工作簿并调用您的代码来生成图表。 让我知道如果你卡住了。

进一步更新

我已经回顾了上面提到的代码,并进行了一些改进,包括一个额外的参数,用于指定要针对打开的每个工作簿(符合指定的条件)运行的macros的名称。 您在调用中使用的macros必须存在于您调用所有其他工作簿的工作簿中(例如,如果图表macros在您的个人工作簿中,那么下面的代码也应该放在您的个人macros工作簿中):

 Option Explicit Sub FileLoop(pDirPath As String, _ Optional pPrintToSheet = False, _ Optional pStartCellAddr = "$A$1", _ Optional pCheckCondition = False, _ Optional pFileNameContains = "xxx", _ Optional pProcToRunOnWb) On Error GoTo PrintFileList_err ' Local constants / variables Const cProcName = "FileLoop" Dim vFileList() As String ' array for file names Dim i As Integer ' iterator for file name array Dim j As Integer ' match counter Dim c As String ' variables for optional param pProcToRunOnWb Dim vFullPath As String Dim vTmpPath As String Dim wb As Workbook vFullPath = Application.ThisWorkbook.FullName vFileList = GetFileList(pDirPath) c = pStartCellAddr j = 0 For i = LBound(vFileList) To UBound(vFileList) ' if condition is met (ie filename cotains text or condition is not required... If pCheckCondition And InStr(1, vFileList(i), pFileNameContains, vbTextCompare) > 0 _ Or Not pCheckCondition Then ' print name to sheet if required... If pPrintToSheet Then Range(c).Offset(j, 0).Value = vFileList(i) j = j + 1 ' increment row offset End If ' open wb to run macro if required... If pProcToRunOnWb <> "" Then Application.DisplayAlerts = False ' set alerts off so that macro can run in other wb vTmpPath = pDirPath & "\" & vFileList(i) Set wb = Workbooks.Open(Filename:=vTmpPath) Workbooks(wb.Name).Activate Application.Run "'" & vFullPath & "'!" & pProcToRunOnWb wb.Close (True) ' save and close workbook Application.DisplayAlerts = True ' set alerts back on End If End If Debug.Print vFileList(i) Next i ' clean up Set wb = Nothing PrintFileList_exit: Exit Sub PrintFileList_err: Debug.Print "Error in ", cProcName, vbCrLf, "Err no: ", Err.Number, _ vbCrLf, "Err Description: ", Err.Description Resume Next End Sub Function GetFileList(pDirPath As String) As Variant On Error GoTo GetFileList_err ' Local constants / variables Const cProcName = "GetFileList" Dim objFSO As Object Dim objFolder As Object Dim objFile As Object Dim c As Double ' upper bound for file name array Dim i As Double ' iterator for file name array Dim vFileList() As String ' array for file names Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder(pDirPath) c = objFolder.Files.Count i = 0 ReDim vFileList(1 To c) ' set bounds on file array now we know count 'Loop through the Files collection For Each objFile In objFolder.Files 'Debug.Print objFile.Name i = i + 1 vFileList(i) = objFile.Name Next 'Clean up! Set objFolder = Nothing Set objFile = Nothing Set objFSO = Nothing GetFileList = vFileList GetFileList_exit: Exit Function GetFileList_err: Debug.Print "Error in ", cProcName, vbCrLf, "Err no: ", Err.Number, _ vbCrLf, "Err Description: ", Err.Description Resume Next End Function 

你可以从另一个macros或从立即窗口(ctrl + G)调用这个参数,例如获取所有包含'.xls'的文件,运行一个名为'your_macro_name_here'的macros,代码如下:

 call FileLoop("C:\Users\Prosserc\Dropbox\Docs\Stack_Overflow\Test", False, "", True, ".xls", "your_macro_name_here") 

显然,将第一个参数中的path改为指向包含要运行macros的文件的目录。

有一个名为Xlsxwriter的库,用于python和perl ,允许自动生成图表。 对于一些示例python代码,请参阅我的post。