自动打开 Excel 文件/运行脚本/然后使用 VBA 脚本保存过程
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4546471/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Automating open Excel file/Run Script/Then Save Process with a VBA Script
提问by Growler
I'm trying to build a database in Access by importing and appending hundreds of Excel documents in a certain folder together. Each imported excel spreadsheet needs to be basically uniform if it is to be appended correctly to the last excel spreadsheet in Access. In addition, blank spaces in the cells cause problems in access... Since there are hundreds of excel files to be added to Access, I wished to use VBA to automate the process... so here's what I'd like to accomplish:
我试图通过在某个文件夹中导入和附加数百个 Excel 文档来在 Access 中构建一个数据库。每个导入的excel电子表格如果要正确附加到Access中的最后一个excel电子表格,则需要基本统一。此外,单元格中的空格会导致访问问题...由于要添加到 Access 中的 excel 文件有数百个,我希望使用 VBA 来自动化该过程...所以这是我想要完成的:
1st) The macro first scans through the folder with all Excel spreadsheets I wish to import... and automatically opens a single excel file at a time. 2nd) Checks that excel file to see that all blank spaces are filled with " - " 3rd) When it is, save that updated excel copy to a folder I name "New Project" 4th) repeat process on the next spreadsheet
1) 宏首先扫描包含我希望导入的所有 Excel 电子表格的文件夹...并一次自动打开一个 Excel 文件。2) 检查该 excel 文件以查看所有空格都填充了“ - ” 3) 当它是时,将更新的 excel 副本保存到我命名为“新项目”的文件夹中 4) 在下一个电子表格中重复该过程
Here's the code I've written so far.. but haven't been able to have it Automatically open each file I need from a particular folder, run the rest of the script, then save it...
这是我到目前为止编写的代码..但无法让它从特定文件夹自动打开我需要的每个文件,运行脚本的其余部分,然后保存它......
Sub Formatting()
Dim counter As Integer
Dim TotalFiles As Integer
TotalFiles = 1
**'Loop through each xl file in a folder**
For counter = 1 To TotalFiles
**'Open multiple Files----------------------------------------------------------------------------------------------**
Dim Filter As String, Title As String, msg As String
Dim i As Integer, FilterIndex As Integer
Dim xlFile As Variant
Filter = "Excel Files (*.xls), *.xls," & "Text Files (*.txt), *.txt," & "All files (*.*), *.*"
**'Default filter = *.***
FilterIndex = 3
**'Set dialog caption**
Title = "Select File(s) to Open"
**'Select Start and Drive path**
ChDrive ("C")
ChDir ("C:\Users\DTurcotte\Desktop\Test_Origin")
With Application
**'Set file name array to selected files (allow multiple)**
xlFile = .GetOpenFilename(Filter, FilterIndex, Title, , True)
**'Reset Start Drive/Path**
ChDrive (Left(.DefaultFilePath, 1))
ChDir (.DefaultFilePath)
End With
**'Exit on Cancel**
If Not IsArray(xlFile) Then
MsgBox "No file was selected."
Exit Sub
End If
**'Open Files**
For i = LBound(xlFile) To UBound(xlFile)
msg = msg & xlFile(i) & vbCrLf
Workbooks.Open xlFile(i)
Next i
MsgBox msg, vbInformation, "Files Opened"
**'Format Column Headings----------------------------------------------------------------------------------------------**
ActiveWorkbook.Sheets.Select
Dim RowIndex As Integer
Dim ColIndex As Integer
Dim totalRows As Integer
Dim totalCols As Integer
Dim LastRow As Long
Dim range As range
totalRows = Application.WorksheetFunction.CountA(Columns(1))
If Cells(1, 1).Value <> "ROOM #" Then Cells(1, 1).Value = "ROOM #"
If Cells(1, 2).Value <> "ROOM NAME" Then Cells(1, 2).Value = "ROOM NAME"
If Cells(1, 3).Value <> "HOMOGENEOUS AREA" Then Cells(1, 3).Value = "HOMOGENEOUS AREA"
If Cells(1, 4).Value <> "SUSPECT MATERIAL DESCRIPTION" Then Cells(1, 4).Value = "SUSPECT MATERIAL DESCRIPTION"
If Cells(1, 5).Value <> "ASBESTOS CONTENT (%)" Then Cells(1, 5).Value = "ASBESTOS CONTENT (%)"
If Cells(1, 6).Value <> "CONDITION" Then Cells(1, 6).Value = "CONDITION"
If Cells(1, 7).Value <> "FLOORING (SF)" Then Cells(1, 7).Value = "FLOORING (SF)"
If Cells(1, 8).Value <> "CEILING (SF)" Then Cells(1, 8).Value = "CEILING (SF)"
If Cells(1, 9).Value <> "WALLS (SF)" Then Cells(1, 9).Value = "WALLS (SF)"
If Cells(1, 10).Value <> "PIPE INSULATION (LF)" Then Cells(1, 10).Value = "PIPE INSULATION (LF)"
If Cells(1, 11).Value <> "PIPE FITTING INSULATION (EA)" Then Cells(1, 11).Value = "PIPE FITTING INSULATION (EA)"
If Cells(1, 12).Value <> "DUCT INSULATION (SF)" Then Cells(1, 12).Value = "DUCT INSULATION (SF)"
If Cells(1, 13).Value <> "EQUIPMENT INSULATION (SF)" Then Cells(1, 13).Value = "EQUIPMENT INSULATION (SF)"
If Cells(1, 14).Value <> "MISC. (SF)" Then Cells(1, 14).Value = "MISC. (SF)"
If Cells(1, 15).Value <> "MISC. (LF)" Then Cells(1, 15).Value = "MISC. (LF)"
**'Fills in blank spaces with "-"**
For RowIndex = 1 To totalRows
For ColIndex = 1 To 15
If Cells(RowIndex, ColIndex).Value = "" Then Cells(RowIndex, ColIndex).Value = "test"
Next ColIndex
Next RowIndex
**'Clears content from "Totals" Row**
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
Rows(LastRow).ClearContents
**'Saves file to a new folder
'Need to have the code run through that excel doc, set that updated copy to a variable, and then have the following code save it to a new folder**
***ToDo***
**'newSaveName = updated excel file**
'ActiveWorkbook.SaveAs ("C:\Users\DTurcotte\Desktop\TestExcelFiles" & Test1_Success & ".xls")
Next counter
End Sub
Can anyone provide any help?
任何人都可以提供任何帮助吗?
回答by Fionnuala
I suggest you use names that will work in Access, that is, no odd characters such as #, and no spaces - it will make your life easier.
我建议您使用可以在 Access 中使用的名称,也就是说,不要使用 # 等奇怪字符,也不要使用空格 - 这将使您的生活更轻松。
It looks quite unsafe to me to simply change a column heading.
简单地更改列标题对我来说看起来很不安全。
Const DirOpen As String = "C:\Users\DTurcotte\Desktop\Test_Origin\"
Const DirSave As String = "C:\Users\DTurcotte\Desktop\Processed\"
Sub Formatting2()
''Reference: Windows Script Host Object Model
''You could just use late binding, but
''the file system object is very useful for this type
''of work.
Dim fs As New FileSystemObject
Dim fldr As Folder
Dim f As File
'**'Loop through each xl file in a folder**
If fs.FolderExists(DirOpen) Then
Set fldr = fs.GetFolder(DirOpen)
For Each f In fldr.Files
If f.Type Like "*Excel*" Then
''Includes:
''Microsoft Excel 97-2003 Worksheet
''Microsoft Excel Comma Separated Values File
''Microsoft Excel Macro-Enabled Worksheet
''Microsoft Excel Worksheet
''Etc
ProcessFile f.Name
End If
Next
End If
End Sub
Sub ProcessFile(FileName As String)
Dim RowIndex As Integer
Dim ColIndex As Integer
''It is not a good idea to use the names of built-in
''objects as variable names
Dim r As range
Dim totalRows As Integer
Dim totalCols As Integer
Dim LastRow As Long
Dim wb As Workbook
Set wb = Workbooks.Open(DirOpen & FileName)
'**'Format Column Headings
wb.Sheets(1).Select
''processing code goes here
'**'Saves file to a new folder
wb.SaveAs DirSave & FileName
wb.Close
End Sub