【发布时间】:2017-12-22 11:05:17
【问题描述】:
我创建了一个 vba 宏,目的是: 1)一个一个打开文件夹中的每个文件 2)循环遍历每个工作表,取消保护每个工作表,查看顶行是否为空白(如果是则删除)并删除有问题的列。 3) 将文件另存为 xlsx。
到目前为止,我已经设法让它遍历每个文件,但无法遍历工作表。我以前能够让它对每个工作簿中的最后一个活动工作表进行更改,但现在它似乎跳过了每个工作表。
知道为什么吗?
Sub LoopThroughFiles()
FolderName = ThisWorkbook.Path & "\Source Data\"
If Right(FolderName, 1) <> Application.PathSeparator Then FolderName = FolderName & Application.PathSeparator
Fname = Dir(FolderName & "*.xls*")
'loop through the files
Do While Len(Fname)
With Workbooks.Open(FolderName & Fname)
Dim folderPath As String
Dim filename As String
Dim wb As Workbook
Dim ws As Worksheet
Application.DisplayAlerts = False
Application.AskToUpdateLinks = False
'Unshare Workbook
If ActiveWorkbook.MultiUserEditing Then
ActiveWorkbook.ExclusiveAccess
End If
'Unprotect Workbook
ActiveWorkbook.Unprotect "pa55word"
For Each ws In ThisWorkbook.Worksheets
'Unprotect Worksheet
ws.Unprotect "pa55word"
'Unhide Columns and Rows
ws.Cells.EntireColumn.Hidden = False
ws.Cells.EntireRow.Hidden = False
'Delete Blank top Row
Set MR = ws.Range("A1:C1")
For Each cell In MR
If cell.Value = "" Then cell.EntireRow.Delete
Next
'Delete annoying Column
Set MR = ws.Range("A1:BZ1")
For Each cell In MR
If cell.Value = "a2a" Then cell.EntireColumn.Delete
Next
'Remove Filter
If ws.AutoFilterMode Then
ws.ShowAllData
ws.AutoFilterMode = False
End If
Next ws
ActiveWorkbook.SaveAs ThisWorkbook.Path & "\Cleansed Data\" & Replace(Replace(ActiveWorkbook.Name, ".xlsx", ""), ".xls", "") & ".xlsx", FileFormat:=51
ActiveWorkbook.Close
End With
' go to the next file in the folder
Fname = Dir
Loop
End Sub
【问题讨论】:
-
只是猜测,但将每个
ActiveSheet更改为ws。您从未将 ws 设置为活动工作表,因此它仅在上次活动时生效 -
最好不发布一组运行正常的冗长代码,并在仍然生成的同时尽可能多地删除问题,以便将重点放在实际问题上。请阅读:minimal reproducible example加上stackoverflow.com/help/on-topic和How to Ask。
-
...另一方面,有像@Vityata 和 Magnetron 这样的成员,他们有 X 射线 VBA 眼镜。 (无论如何,请阅读我发布的链接,以帮助您解决下一个问题。):-)
-
@ashleedawg - 这让我笑了,谢谢! :)
-
感谢磁控管的建议,但不幸的是没有奏效。