Dùng Macro để đổi định dạng file hàng loạt

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
937
Được thích
571
Chào các anh chị

Em có đống dữ liệu dùng chung, được hình thành ngày qua ngày.
Mỗi ngày có khoảng 10-15 file được đặt trong 1 folder. Mỗi folder là 1 ngày lại được đặt trong 1 folder tháng. Tóm lại là mỗi tháng có khoảng 400 file trong 30 folder.
Các file hiện tại đều cùng cấu trúc và có đuôi .xlsb
Em muốn xóa macro khỏi các file đó để không ai kích hoạt lại chức năng của Macro trong nó. Em đang xóa macro bằng cách Save as ra .xlsx nhưng bằng cách hoàn toàn thủ công.
Mong các anh chị viết cho 1 đoạn code để chỉ 1 Click là các file được loại bỏ Macro (bằng cách Save as sang .xlsx)
Xin chân thành cảm ơn
 
Chào các anh chị

Em có đống dữ liệu dùng chung, được hình thành ngày qua ngày.
Mỗi ngày có khoảng 10-15 file được đặt trong 1 folder. Mỗi folder là 1 ngày lại được đặt trong 1 folder tháng. Tóm lại là mỗi tháng có khoảng 400 file trong 30 folder.
Các file hiện tại đều cùng cấu trúc và có đuôi .xlsb
Em muốn xóa macro khỏi các file đó để không ai kích hoạt lại chức năng của Macro trong nó. Em đang xóa macro bằng cách Save as ra .xlsx nhưng bằng cách hoàn toàn thủ công.
Mong các anh chị viết cho 1 đoạn code để chỉ 1 Click là các file được loại bỏ Macro (bằng cách Save as sang .xlsx)
Xin chân thành cảm ơn
Xóa code nhưng vẫn giữ định dạng .xlsb được không bạn? (Vì khi lưu sang xlsx thì phải mất công xóa file .xlsb) Tức là mở nó lên xóa hết code sau đó lưu lại file và đóng.
 
Upvote 0
Xóa code nhưng vẫn giữ định dạng .xlsb được không bạn? (Vì khi lưu sang xlsx thì phải mất công xóa file .xlsb) Tức là mở nó lên xóa hết code sau đó lưu lại file và đóng.
Tôi nghĩ SaveAs sang XLSX rồi xóa file XLSB sẽ dễ hơn xóa code đấy. Bởi đã là code thì sẽ có ở khắp nơi: Trong sheet, trong Thisworkbook, trong UserForm, trong class và thậm chí là trong các name macro 4.... Đuối luôn đấy
 
Upvote 0
Tôi nghĩ SaveAs sang XLSX rồi xóa file XLSB sẽ dễ hơn xóa code đấy. Bởi đã là code thì sẽ có ở khắp nơi: Trong sheet, trong Thisworkbook, trong UserForm, trong class và thậm chí là trong các name macro 4.... Đuối luôn đấy
Em thấy đoạn code này xóa rất dễ anh (Đã test), chỉ cần nâng cấp chút em nghĩ sẽ ngon cành đào.
http://www.vbaexpress.com/kb/getarticle.php?kb_id=93
 
Upvote 0
Tôi nghĩ SaveAs sang XLSX rồi xóa file XLSB sẽ dễ hơn xóa code đấy. Bởi đã là code thì sẽ có ở khắp nơi: Trong sheet, trong Thisworkbook, trong UserForm, trong class và thậm chí là trong các name macro 4.... Đuối luôn đấy
Vâng bác. Ý em là có code này kích các file được mở rồi ép nó đóng lại bằng lệnh Save as .xlxs. Trường hợp không thể xóa file gốc có đuôi .xlsb thì em dùng Search của Windows để gom chúng lại rồi delete
Bác giúp em các Save as với.
 
Upvote 0
Upvote 0
Xóa code nhưng vẫn giữ định dạng .xlsb được không bạn? (Vì khi lưu sang xlsx thì phải mất công xóa file .xlsb) Tức là mở nó lên xóa hết code sau đó lưu lại file và đóng.
Làm sao cũng được, miễn là xóa code bên trong.
Mình chỉ nghĩ cách xóa code nhanh và đơn giản bằng cách kích mở từng file trong thư mục chỉ định sau đó cho save as lại với file type là .xlxs. Cách này đơn giản nhưng mình chưa biết cách làm bằng Code
 
Upvote 0
Làm sao cũng được, miễn là xóa code bên trong.
Mình chỉ nghĩ cách xóa code nhanh và đơn giản bằng cách kích mở từng file trong thư mục chỉ định sau đó cho save as lại với file type là .xlxs. Cách này đơn giản nhưng mình chưa biết cách làm bằng Code
Đặt tất cả các file cần xóa code vào chung thư mục với file chứa code này và cho chạy code xem sao.
Mã:
Sub DeleteAllCode()
On Error Resume Next
    Const ExcelExtension As String = "|xlsb|xlsm|"
    Dim Wb As Workbook
    Dim x As Integer
    Dim sFolder As String, iFile As Object, FullPath As String
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False
    With CreateObject("Scripting.FileSystemObject")
        sFolder = .GetParentFolderName(ThisWorkbook.FullName)
        For Each iFile In .GetFolder(sFolder).Files
            If InStr(ExcelExtension, "|" & .GetExtensionName(iFile.Path) & "|") > 0 Then
                If iFile.Path <> ThisWorkbook.FullName And Left(iFile.Name, 2) <> "~$" Then
                Set Wb = Workbooks.Open(sFolder & "\" & iFile.Name)
                    With Wb.VBProject
                        For x = .VBComponents.Count To 1 Step -1
                            .VBComponents.Remove .VBComponents(x)
                        Next x
                        For x = .VBComponents.Count To 1 Step -1
                            .VBComponents(x).CodeModule.DeleteLines _
                            1, .VBComponents(x).CodeModule.CountOfLines
                        Next x
                    End With
                    Wb.Close True
                    Set Wb = Nothing
                End If
            End If
        Next
    End With
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True
    MsgBox "Da thuc hien xong", vbExclamation, "GPE!"
End Sub
 
Upvote 0
Đặt tất cả các file cần xóa code vào chung thư mục với file chứa code này và cho chạy code xem sao.
Mã:
Sub DeleteAllCode()
On Error Resume Next
    Const ExcelExtension As String = "|xlsb|xlsm|"
    Dim Wb As Workbook
    Dim x As Integer
    Dim sFolder As String, iFile As Object, FullPath As String
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False
    With CreateObject("Scripting.FileSystemObject")
        sFolder = .GetParentFolderName(ThisWorkbook.FullName)
        For Each iFile In .GetFolder(sFolder).Files
            If InStr(ExcelExtension, "|" & .GetExtensionName(iFile.Path) & "|") > 0 Then
                If iFile.Path <> ThisWorkbook.FullName And Left(iFile.Name, 2) <> "~$" Then
                Set Wb = Workbooks.Open(sFolder & "\" & iFile.Name)
                    With Wb.VBProject
                        For x = .VBComponents.Count To 1 Step -1
                            .VBComponents.Remove .VBComponents(x)
                        Next x
                        For x = .VBComponents.Count To 1 Step -1
                            .VBComponents(x).CodeModule.DeleteLines _
                            1, .VBComponents(x).CodeModule.CountOfLines
                        Next x
                    End With
                    Wb.Close True
                    Set Wb = Nothing
                End If
            End If
        Next
    End With
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True
    MsgBox "Da thuc hien xong", vbExclamation, "GPE!"
End Sub
Cảm ơn bạn đã dành thời gian
Mình đã thử xem sao nhưng code chạy rất lâu mà chưa biết kết quả. (khả năng bị treo)

Folder có chứa 16 file, mỗi file có dung lượng ~ 150KB, trong file có 1 modul và 2 Sub.
Lưu ý: Có đặt pass để xem được Code

Vậy bạn xem nguyên nhân gì mà Code lại không hoạt động như mong muốn. (Không biết có phải nó muốn xóa chính nó nên mắc lỗi không nhỉ)
Xin cảm ơn
 
Upvote 0
Cảm ơn bạn đã dành thời gian
Mình đã thử xem sao nhưng code chạy rất lâu mà chưa biết kết quả. (khả năng bị treo)

Folder có chứa 16 file, mỗi file có dung lượng ~ 150KB, trong file có 1 modul và 2 Sub.
Lưu ý: Có đặt pass để xem được Code

Vậy bạn xem nguyên nhân gì mà Code lại không hoạt động như mong muốn. (Không biết có phải nó muốn xóa chính nó nên mắc lỗi không nhỉ)
Xin cảm ơn
Bạn điều chỉnh dòng dưới cho phù hợp:
Const ExcelExtension As String = "|xlsb|xlsm|"
 
Upvote 0
Bạn điều chỉnh dòng dưới cho phù hợp:
Const ExcelExtension As String = "|xlsb|xlsm|"
Mình chưa hiểu gợi ý của bạn.
Lúc trước các file đều có đuôi .xlsb bao gồm cả file có code xóa. Sau đó mình chuyển file có code xóa sang .xlsm và thử chay cũng vẫn bị treo
Hướng dẫn thêm giúp mình nhé. Xin cảm ơn
 
Upvote 0
Cảm ơn bạn đã dành thời gian

Lưu ý: Có đặt pass để xem được Code
Vậy bạn xem nguyên nhân gì mà Code lại không hoạt động như mong muốn. (Không biết có phải nó muốn xóa chính nó nên mắc lỗi không nhỉ)
Xin cảm ơn
Chổ màu đỏ thì code không thực hiện được nhé bạn, code chỉ thực hiện trên file không đặt password vba Project. Vậy mở file lên và save lại định dạng xlsx thì sửa code như sau:
Mã:
Sub DeleteAllCode()
On Error Resume Next
    Const ExcelExtension As String = "|xlsb|xlsm|"
    Dim Wb As Workbook
    Dim x As Integer
    Dim sFolder As String, iFile As Object, FullPath As String
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False
    With CreateObject("Scripting.FileSystemObject")
        sFolder = .GetParentFolderName(ThisWorkbook.FullName)
        MkDir sFolder & "\GPE"
        For Each iFile In .GetFolder(sFolder).Files
            If InStr(ExcelExtension, "|" & .GetExtensionName(iFile.Path) & "|") > 0 Then
                If iFile.Path <> ThisWorkbook.FullName And Left(iFile.Name, 2) <> "~$" Then
                Set Wb = Workbooks.Open(sFolder & "\" & iFile.Name)
                    Wb.SaveAs Filename:=Left(sFolder & "\GPE\" & iFile.Name, Len(sFolder & "\GPE\" & iFile.Name) - 4) & "xlsx", FileFormat:=xlOpenXMLWorkbook
                    Wb.Close False
                    Set Wb = Nothing
                End If
            End If
        Next
    End With
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True
    MsgBox "Da thuc hien xong", vbExclamation, "GPE!"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hiện tại các file đều được đặt pass xem code và mình có pass để xem.
Vậy có cách nào xử lý vấn đề này không bạn ??
Hiện tại các file đều được đặt pass xem code và mình có pass để xem.
Vậy có cách nào xử lý vấn đề này không bạn ??
Cái này mình chịu rồi bạn nhé, chưa hề tìm hiểu về nó.
 
Upvote 0
Mình chưa hiểu gợi ý của bạn.
Lúc trước các file đều có đuôi .xlsb bao gồm cả file có code xóa. Sau đó mình chuyển file có code xóa sang .xlsm và thử chay cũng vẫn bị treo
Hướng dẫn thêm giúp mình nhé. Xin cảm ơn
Hôm qua tôi quên không nói với bạn là trong các File của bạn không được khóa Code VBA.
 
Upvote 0
Mình thử xóa cái vbaProject.bin thì code hết (trừ Macro4 trong name).
Trên GPE có bài về trích file để xử lý (...) không biết bài này áp dụng được không.

View attachment 195212
Có phải @befaint gợi ý đổi đuôi thủ công sang .zip sau đó giải nén và tìm xóa các vbaProject.bin ??
Có 2 vấn đề xảy ra
1. Mình thử mà không được
2. Vấn đề ban đầu mình muốn tự động để giảm thao tác thủ công, chứ nếu cứ mở thủ công và save as sang file .xlsx thì vấn đề giải quyết được ngay
Xin cảm ơn mọi người
 
Upvote 0
Mình thử xóa cái vbaProject.bin thì code hết (trừ Macro4 trong name).
Trên GPE có bài về trích file để xử lý (...) không biết bài này áp dụng được không.

View attachment 195212
Muốn làm được chuyện này thì đầu tiên phải SaveAs sang XLSX. Mà khi đã SaveAs rồi thì mọi chuyện đã... xong và không cần làm thêm gì nữa cả
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom