利用VBA刪除指定資料夾內每個檔案的工作表

各位好:

我目前有一個資料夾內會隨時更新檔案,但因為是每天下載整個壓縮檔並更新

然後為了刪除不必要的分頁,都會跑一個程序

如以下:

------------

Sub a1test()
'
' a1test 巨集
'
Windows("VBA01.xlsm").Activate
Workbooks.Open Filename:="C:\TEST\檔案01.xlsx"
Windows("檔案01.xlsx").Activate
Sheets("202101").Select
ActiveWindow.SelectedSheets.Delete
Sheets("202102").Select
ActiveWindow.SelectedSheets.Delete
Sheets("202103").Select
ActiveWindow.SelectedSheets.Delete
Workbooks("檔案01.xlsx").Close SaveChanges:=True
Windows("VBA01.xlsm").Activate

Workbooks.Open Filename:="C:\TEST\檔案02.xlsx"
Windows("檔案02.xlsx").Activate
Sheets("202101").Select
ActiveWindow.SelectedSheets.Delete
Sheets("202102").Select
ActiveWindow.SelectedSheets.Delete
Sheets("202103").Select
ActiveWindow.SelectedSheets.Delete
Workbooks("檔案02.xlsx").Close SaveChanges:=True
Windows("VBA01.xlsm").Activate

End Sub

------------

因為檔案會不斷增加
但要刪除的工作表都是固定的月份當作工作表名稱

因此是可以不斷的增加語法讓它固定刪除就好

但我也好奇要怎麼寫才能夠讓它固定打開資料夾內的每個檔案,並刪除指定的工作表

是否有過類似範例可以提供參考,關鍵字也可以,感謝各位~
2021-08-07 12:04 發佈
https://riverfootmark.blogspot.com/2021/08/vba-kill-vs-filesystemobject.html

參考希望有幫助
snare

您非常熱心,但提醒一下,刪檔案,和刪檔案內的工作表,是不一樣的喔

2021-08-07 18:35
dropit

看來疫苗副作用還沒退,還在暈

2021-08-07 19:03
SUB SHEET_CHECK_DELETE()
CHECK = "P" & "S" & "10" '自己設定的關鍵字檢查
For P = Sheets.Count To 1 Step -1
If InStr(CHECK, Sheets(P).Name) > 0 Then
'工作名稱跟設定的關鍵字比對,出現關鍵字則 執行刪除表示大於0
'或是副程式把CHECK移到SUB SHEET_CHECK_DELETE(CHECK) ,
'然後註解掉原本的CHECK = "P" & "S" & "10" '自己設定的關鍵字檢查,
'每次執行丟新的關鍵字檢查
Application.DisplayAlerts = False '關閉警告
Sheets(P).Delete '刪除
Application.DisplayAlerts = True '開啟警告
End If
Next
END SUB

EX:
SUB SHEET_CHECK_DELETE(CHECK)

https://riverfootmark.blogspot.com/2021/08/vba.html

暈了來去睡,在麻麻熱心的大大有空再潤一下。

稻草人到處草人 wrote:
各位好:

我目前有...(恕刪)

稻草人到處草人 wrote:
各位好:

我目前有...(恕刪)
'vba放在“新建的檔案”

Sub test()

Dim Get_Path As Object, Default_Path As Variant, xls_fullpath As Variant, ttt As Double, Report As String
Dim old_file As Workbook, delsheet() As Variant, check As Range, i As Integer, temp As String

'路徑預設,我的電腦,也可改用其它路徑代替,例如 c:\test\ 、ThisWorkbook.Path
Default_Path = &H11& 'My computer

Set Get_Path = CreateObject("Shell.Application").BrowseForFolder(0, "choose a folder", &H201, Default_Path)

'要刪除的工作表名稱,預訂3個,可用逗點隔開新增名稱
delsheet() = Array("202101", "202102", "202103")


If Get_Path Is Nothing Then
MsgBox "???"
Exit Sub
End If

Application.DisplayAlerts = False
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual


For Each xls_fullpath In Get_Path.items

ttt = Timer
DoEvents


'檔名可用萬用字元過濾,如果沒指定
'預設開啟同目錄下(1層,不含子目錄),所有xls? 檔(刪除用vba檔會自動略過)


If xls_fullpath.Path Like "*.xls*" And Not xls_fullpath.isfolder And xls_fullpath.Name & ".xlsm" <> ThisWorkbook.Name Then

Set old_file = Workbooks.Open(xls_fullpath.Path, , False)

For i = 0 To UBound(delsheet())

'有同名稱工作表=>刪除
If checksheet(old_file, delsheet(i)) = True Then
temp = temp & delsheet(i) & "=>OK,"
old_file.Sheets(delsheet(i)).Delete
Else
'沒有工作表
temp = temp & delsheet(i) & "=>Error,"
End If

Next i

temp = old_file.Name & vbNewLine & temp & ":" & Timer - ttt & "秒" & vbNewLine

old_file.Close 1
Set old_file = Nothing

End If

Report = Report & temp
temp = ""

Next

Application.DisplayAlerts = True
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic


Set Get_Path = Nothing

MsgBox IIf(Report = "", "excel file?", Report)

'程式結束後,report字串是簡易的狀況回報





End Sub


'利用on error,不用迴圈,快速檢查是否有指定的工作表名稱
Function checksheet(wb As Workbook, sheet_name) As Boolean
Dim check As Range
On Error Resume Next
Set check = wb.Sheets(sheet_name).Range("a1")
If Err.Number <> 0 Then checksheet = False Else checksheet = True
On Error GoTo 0
End Function


稻草人到處草人

我沒有想到居然可以寫到這麼細,嘗試理解的過程感覺腦袋快打結了[sorry] 真的感謝S大特地花時間寫了這麼詳細的VBA~ [謝謝][謝謝]

2021-08-07 22:33
snare

不是特別寫的,只是看到熱心人士dropit打疫苗輕微副作用,把以前回答問題的範例改幾行,加註解po上來,順手幫他補充一下而已

2021-08-07 23:00
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?