Xóa Styles - Excel 2010!

Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Tôi dùng ex 2010, khi thao tác copy hay move sheet từ file khác thì sinh ra nhiều styles khó chịu.
Dùng Asap Ultilities không xóa hết.
<cellStyle name="1_Du toan Cang Vung Ang ngay 09-8-06 " xfId="14"/><cellStyle name="1_Gia_VLQL48_duyet " xfId="15"/><cellStyle name="¹éºÐÀ²_ " xfId="16"/><cellStyle name="2_Du toan Cang Vung Ang ngay 09-8-06 " xfId="17"/><cellStyle name="2_Gia_VLQL48_duyet " xfId="18"/>
Tôi thử dùng cách đổi đuôi zip và edit file Styles.xml nhưng nhìn "kinh" quá.
Các bạn giúp tôi giải pháp nào tốt hơn hay có Tool nào.
Cám ơn.
Đính kèm file nhhiều style rác.
 

File đính kèm

  • Copy of XoaStyles.zip
    149.6 KB · Đọc: 242
Tôi dùng ex 2010, khi thao tác copy hay move sheet từ file khác thì sinh ra nhiều styles khó chịu.
Dùng Asap Ultilities không xóa hết.

Tôi thử dùng cách đổi đuôi zip và edit file Styles.xml nhưng nhìn "kinh" quá.
Các bạn giúp tôi giải pháp nào tốt hơn hay có Tool nào.
Cám ơn.
Đính kèm file nhhiều style rác.

ThuNghi cứ xóa từ chổ <cellStyle name= đến trước từ khóa cellStyle name="Normal" là được rồi
 
ThuNghi cứ xóa từ chổ <cellStyle name= đến trước từ khóa cellStyle name="Normal" là được rồi
Vậy sao không ai viết 1 tool hay AdIn để làm công việc này.
NDU viết giúp đi.
Unused styles are copied from one workbook to another workbook in Excel 2007
Trang này có nói nhưng làm theo thì nó đòi phải update muốn nản luôn.
http://support.microsoft.com/kb/2553085
 
Vậy sao không ai viết 1 tool hay AdIn để làm công việc này.
NDU viết giúp đi.

Trang này có nói nhưng làm theo thì nó đòi phải update muốn nản luôn.
http://support.microsoft.com/kb/2553085

Món này tôi "chơi" không nỗi, nhưng tôi biết có 1 người có thể làm được, đó là siwtom
Hôm trước trao đổi tin nhắn riêng, tôi được anh ấy giói thiệu 1 đoạn code khá hay liên quan đến vấn đề này ---> Vậy chờ anh ấy vào cuộc rồi ta bàn tiếp nhé
 
Món này tôi "chơi" không nỗi, nhưng tôi biết có 1 người có thể làm được, đó là siwtom
Hôm trước trao đổi tin nhắn riêng, tôi được anh ấy giói thiệu 1 đoạn code khá hay liên quan đến vấn đề này ---> Vậy chờ anh ấy vào cuộc rồi ta bàn tiếp nhé
Tham khảo về Unused Styles Excel 2010 thấy nhiều topic nó về vấn đề này nhưng toàn tiếng Anh và tựu trung là phải update và fix...
Anh Siwtom cố gắng giúp em nhé.
Cám ơn Anh nhiều.
Mỗi lần move hay copy sheet thì sinh ra nhiều styles khó chịu lắm.
 
Tham khảo về Unused Styles Excel 2010 thấy nhiều topic nó về vấn đề này nhưng toàn tiếng Anh và tựu trung là phải update và fix...
Anh Siwtom cố gắng giúp em nhé.
Cám ơn Anh nhiều.
Mỗi lần move hay copy sheet thì sinh ra nhiều styles khó chịu lắm.

Tôi không xem chủ đề này, giờ mới biết là "bị" gọi lên bảng.
Bạn tải tập tin về và thử xem.

1. Trong Sub Test tôi nhập đường dẫn cụ thể là "D:\Copy of XoaStyles.zip". Bạn nhập cho đúng của mình.
2. Trong Sub PrepareAndRun tôi ghi đường dẫn cụ thể tới WinRar là "F:\Program Files\WinRAR\winrar.exe" vì hđh của tôi được cài trên "F". Bạn sửa lại cho đúng đường dẫn tới WinRar.
3. Tôi test trên phiên bản WinRar cụ thể. Tôi có đính kèm để bạn cài đặt. Nhưng trước tiên nếu bạn đã có WinRar và cài đặt thì hãy thử trên phiên bản WinRAR đã cài.
4. Ý của tôi là phục vụ định dạng XLSM, XLSX, ZIP, vậy trước tiên bạn cứ để nguyên tên XLSM, XLSX. Sau đó đổi tên thành ZIP rồi lại test tiếp. Ý tưởng là bung ngay từ XLSM (XLSX?) không cần đổi thành ZIP

Kết quả ra sao bạn thông báo nhé
 

File đính kèm

  • test.rar
    1.2 MB · Đọc: 435
Tôi không xem chủ đề này, giờ mới biết là "bị" gọi lên bảng.
Bạn tải tập tin về và thử xem.

1. Trong Sub Test tôi nhập đường dẫn cụ thể là "D:\Copy of XoaStyles.zip". Bạn nhập cho đúng của mình.
2. Trong Sub PrepareAndRun tôi ghi đường dẫn cụ thể tới WinRar là "F:\Program Files\WinRAR\winrar.exe" vì hđh của tôi được cài trên "F". Bạn sửa lại cho đúng đường dẫn tới WinRar.
3. Tôi test trên phiên bản WinRar cụ thể. Tôi có đính kèm để bạn cài đặt. Nhưng trước tiên nếu bạn đã có WinRar và cài đặt thì hãy thử trên phiên bản WinRAR đã cài.
4. Ý của tôi là phục vụ định dạng XLSM, XLSX, ZIP, vậy trước tiên bạn cứ để nguyên tên XLSM, XLSX. Sau đó đổi tên thành ZIP rồi lại test tiếp. Ý tưởng là bung ngay từ XLSM (XLSX?) không cần đổi thành ZIP

Kết quả ra sao bạn thông báo nhé
Vừa test xong, kết quả rất tốt
Tuy nhiên có 1 lỗi nhỏ: Có vẻ như chương trình bị sự cố đối với đường dẫn dài
Ví dụ:
PrepareAndRun "C:\Users\Anh Tuan\Desktop\Copy of XoaStyles.zip"
Thì sẽ bị lỗi ---> Cửa sổ thông báo lỗi của WinRAR xuất hiện:

Untitled.jpg






















Nhưng nếu là: PrepareAndRun "D:\Copy of XoaStyles.zip"
thì lại chạy ngon lành. Anh xem giúp phải sửa lại chổ nào để có thể chạy cho mọi đường dẫn (nói không chừng đường dẫn tiếng Việt Unicode ta cũng phải để ý luôn)
Cảm ơn anh!
-------------------
Ngoài ra em nói thêm:
- Sub PrepareAndRun có cú pháp:
Mã:
Sub PrepareAndRun(ByVal excelFile As String, Optional ByVal RARExe = "[COLOR=#ff0000]F:\Program Files\WinRAR\winrar.exe[/COLOR]")
Em sửa lại thành:
Mã:
Sub PrepareAndRun(ByVal excelFile As String, Optional ByVal RARExe = "[COLOR=#ff0000]winrar.exe[/COLOR]")
Thấy nó cũng chạy OK
(WinRAR trên máy em là bản Portable, không cài đặt, vậy mà viết gọn thế "nó" cũng tự biết luôn)
 
Lần chỉnh sửa cuối:
Vừa test xong, kết quả rất tốt
Tuy nhiên có 1 lỗi nhỏ: Có vẻ như chương trình bị sự cố đối với đường dẫn dài
Ví dụ:
PrepareAndRun "C:\Users\Anh Tuan\Desktop\Copy of XoaStyles.zip"
Thì sẽ bị lỗi ---> Cửa sổ thông báo lỗi của WinRAR xuất hiện:

View attachment 90499






















Nhưng nếu là: PrepareAndRun "D:\Copy of XoaStyles.zip"
thì lại chạy ngon lành. Anh xem giúp phải sửa lại chổ nào để có thể chạy cho mọi đường dẫn (nói không chừng đường dẫn tiếng Việt Unicode ta cũng phải để ý luôn)
Cảm ơn anh!

Tuấn thử với Sub này xem. Chỗ đỏ là mới thêm vào, chỗ xanh là sửa từ:
Params = "a -apxl " & """" & excelFile & """" & " " & StartDir & styles.xml"
thành
Params = "a -apxl " & """" & excelFile & """" & " styles.xml"
Vì đằng nào thì khi gọi WinRAR thì cũng đã báo cho nó là StartDir là thư mục "xuất phát" rồi

Mã:
' Trong module thêm khai báo

[COLOR=#ff0000]Private Declare Function GetShortPathName Lib "kernel32.dll" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long[/COLOR]

Sub PrepareAndRun(ByVal excelFile As String, Optional ByVal RARExe = "F:\Program Files\WinRAR\winrar.exe")
Dim Params As String, text As String, filename As String, StartDir As String, ext As String
Dim fso As Object, ts As Object, start As Long, end_ As Long
[COLOR=#ff0000]Dim shortName As String, size As Long
    shortName = String(256, Chr(0))
    size = GetShortPathName(excelFile, shortName, 256)
    excelFile = Left(shortName, size)
[/COLOR]    
    start = InStrRev(excelFile, "\")
    filename = Mid(excelFile, start + 1)
    ext = LCase(Mid(filename, InStrRev(filename, ".")))
    'ext = LCase(Mid(filename, Len(filename) - 4))
    If ext <> ".xlsm" And ext <> ".xlsx" And ext <> ".zip" Then Exit Sub ' nęěu không laĚ tâňp tin XLSM, XLSX thiĚ kęět thuěc
'    thý muňc băět đâĚu laĚ thý muc coě chýěa XLSM, XLSX
    StartDir = Mid(excelFile, 1, start)
    
    Set fso = CreateObject("Scripting.FileSystemObject")
'    caěc thông sôě - Params - cho WinRAR - őŇ đây tôi bung luôn týĚ tâňp tin XLSM.
'    chiŇ bung styles.xml  vaĚo cuĚng thý muňc vőěi tâňp tin XLSM, XLSX
    Params = "x -apxl " & """" & excelFile & """" & " xl\styles.xml"
'    kiěch hoaňt WinRAR đęŇ bung styles.xml vaĚo cuĚng thý muňc vőěi tâňp tin XLSM, XLSX
    If RunAndStop(RARExe, Params, StartDir) Then  ' nęěu bung thaĚnh công thiĚ ...
'        mőŇ tâňp tin styles.xml vaĚ đoňc toaĚn bôň nôňi dung
        Set ts = fso.OpenTextFile(StartDir & "styles.xml")
        text = ts.ReadAll
        ts.Close
'        xoěa tâňp tin styles.xml
        fso.DeleteFile StartDir & "styles.xml", True
'        tiĚm <cellStyle name= vaĚ <cellStyle name="Normal" đęŇ lýőňc boŇ
        start = InStr(1, text, "<cellStyle name=")
        end_ = InStrRev(text, "<cellStyle name=""Normal""")
'        nôňi dung đaŢ lýőňc boŇ týĚ <cellStyle name= tőěi trýőěc <cellStyle name="Normal"
        text = Left(text, start - 1) & Mid(text, end_)
'        taňo tâňp tin styles.xml mőěi
        Set ts = fso.CreateTextFile(StartDir & "styles.xml")
'        ghi nôňi dung mőěi vaĚo styles.xml
        ts.Write text
        Set ts = Nothing
'        caěc thông sôě - Params - cho WinRAR đęŇ thęm tâňp tin styles.xml vaĚo XLSM, XLSX
'    - seŢ thay thęě styles.xml cuŢ
        [COLOR=#0000ff]Params = "a -apxl " & """" & excelFile & """" & " styles.xml"
[/COLOR]'        thay thęě styles.xml cuŢ băĚng mőěi
        If RunAndStop(RARExe, Params, StartDir) Then  ' nęěu thęm thaĚnh công thiĚ ...
'            xoěa tâňp tin styles.xml
            fso.DeleteFile StartDir & "styles.xml", True
'            mőŇ tâňp tin XLSM, XLSX
'            Workbooks.Open StartDir & "\" & filename
        End If
        
    End If
    Set fso = Nothing
End Sub

Ngoài ra em nói thêm:
- Sub PrepareAndRun có cú pháp:
Mã:
Sub PrepareAndRun(ByVal excelFile As String, Optional ByVal RARExe = "[COLOR=#ff0000]F:\Program Files\WinRAR\winrar.exe[/COLOR]")
Em sửa lại thành:
Mã:
Sub PrepareAndRun(ByVal excelFile As String, Optional ByVal RARExe = "[COLOR=#ff0000]winrar.exe[/COLOR]")
Thấy nó cũng chạy OK
(WinRAR trên máy em là bản Portable, không cài đặt, vậy mà viết gọn thế "nó" cũng tự biết luôn)

Là cẩn thận thôi. Còn nếu nó vẫn tìm được thì càng tốt.
 
Lần chỉnh sửa cuối:
Tuấn thử với Sub này xem. Chỗ đỏ là mới thêm vào, chỗ xanh là sửa từ:
Params = "a -apxl " & """" & excelFile & """" & " " & StartDir & styles.xml"
thành
Params = "a -apxl " & """" & excelFile & """" & " styles.xml"
Vì đằng nào thì khi gọi WinRAR thì cũng đã báo cho nó là StartDir là thư mục "xuất phát" rồi

.
Đã thử code mới nhưng vẫn bị lỗi anh à
Em "vọc" tùm lum, cuối cùng phát hiện rằng: Chỉ cần thay cái màu xanh (khỏi cần thêm cái màu đỏ vào) là code chạy ngon lành
---------------
Hướng phát triển:
- Sẽ tạo 1 UserForm duyệt đến file cần xóa Style
- ListBox sẽ liệt kê toàn bộ các Style hiện có của file
- Có thể lọc để listbox chỉ hiện ra các Style rác dựa vào điều kiện ActiveWorkbook.Styles("Tên Style").BuiltIn =False
vân vân... còn cả 1 quãng đường dài anh nhỉ? Tuy nhiên, giải thuật cơ bản anh đã viết cả rồi, phần còn lại em nghĩ rằng anh em có thể tự phát triển được (cả Define Name cứng đầu cũng xóa được tuốt)
Trên các mạng nước ngoài chưa thấy có code nào tương tự, em tin rằng code này có thể xem là độc nhất vô nhị chỉ GPE mới có
Ẹc... Ẹc...
Cảm ơn anh nhiều
 
Đã thử code mới nhưng vẫn bị lỗi anh à
Em "vọc" tùm lum, cuối cùng phát hiện rằng: Chỉ cần thay cái màu xanh (khỏi cần thêm cái màu đỏ vào) là code chạy ngon lành
---------------
Hướng phát triển:
- Sẽ tạo 1 UserForm duyệt đến file cần xóa Style
- ListBox sẽ liệt kê toàn bộ các Style hiện có của file
- Có thể lọc để listbox chỉ hiện ra các Style rác dựa vào điều kiện ActiveWorkbook.Styles("Tên Style").BuiltIn =False
vân vân... còn cả 1 quãng đường dài anh nhỉ? Tuy nhiên, giải thuật cơ bản anh đã viết cả rồi, phần còn lại em nghĩ rằng anh em có thể tự phát triển được (cả Define Name cứng đầu cũng xóa được tuốt)
Trên các mạng nước ngoài chưa thấy có code nào tương tự, em tin rằng code này có thể xem là độc nhất vô nhị chỉ GPE mới có
Ẹc... Ẹc...
Cảm ơn anh nhiều
Cám ơn anh Siwtom và NDU rất nhiều, em sẽ thực hiện thử và sẽ báo cáo kết quả.
Sau khi chỉnh sửa code theo ý anh Siwtom và NDU thì code chạy nhưng khi dùng Asap Ultilities thì vẫn báo còn vài Styles, có khi sinh ra do file gốc là 2003 - > 2007 -> 2010.
Trước mắt vậy là khá OK.
Hai anh triển khia giúp thành AddIns giúp và phần tên file cần xóa thì kg cần phải ghi đầy đủ .xlsm hay .xlsx mà cho nó tự nhận dạng.
PHP:
Private Const SEE_MASK_NOCLOSEPROCESS As Long = &H40
Private Const SW_HIDE As Long = 0
Private Const INFINITE As Long = &HFFFFFFFF

Private Type SHELLEXECUTEINFO
    cbSize As Long
    fMask As Long
    hwnd As Long
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As Long
    ' fields
    lpIDList As Long
    lpClass As String
    hkeyClass As Long
    dwHotKey As Long
    hIcon As Long
    hProcess As Long
End Type

Private Declare Function CreateDirectory Lib "kernel32.dll" Alias "CreateDirectoryA" (ByVal lpPathName As String, ByVal lpSecurityAttributes As Long) As Long

Private Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef lpExecInfo As SHELLEXECUTEINFO) As Long
Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Function RunAndStop(ByVal filename As String, ByVal Params As String, ByVal StartDir As String) As Boolean
Dim sei As SHELLEXECUTEINFO
    With sei
        .cbSize = Len(sei)
        .fMask = SEE_MASK_NOCLOSEPROCESS
        .hwnd = Application.hwnd
        .lpVerb = "open"
        .lpFile = filename
        .lpParameters = Params
        .lpDirectory = StartDir
        .nShow = SW_HIDE
    End With
    RunAndStop = ShellExecuteEx(sei)
    If RunAndStop Then  ' nêìu kiìch hoaòt filename thaÌnh công thiÌ ...
'        ðõòi cho tõìi tâòn khi Process kêìt thuìc
        WaitForSingleObject sei.hProcess, INFINITE
'        giaÒi phoìng handle cuÒa Process
        CloseHandle sei.hProcess
    End If
End Function
Sub test()
  PrepareAndRun "E:\XoaStyles\VdXoaStyles.xlsx"
End Sub
Sub PrepareAndRun(ByVal excelFile As String, Optional ByVal RARExe = "winrar.exe")
Dim Params As String, text As String, filename As String, StartDir As String, ext As String
Dim fso As Object, ts As Object, start As Long, end_ As Long
'Dim shortName As String, size As Long
'    shortName = String(256, Chr(0))
'    size = GetShortPathName(excelFile, shortName, 256)
'    excelFile = Left(shortName, size)
    
    start = InStrRev(excelFile, "\")
    filename = Mid(excelFile, start + 1)
    ext = LCase(Mid(filename, InStrRev(filename, ".")))
    'ext = LCase(Mid(filename, Len(filename) - 4))
    If ext <> ".xlsm" And ext <> ".xlsx" And ext <> ".zip" Then Exit Sub ' ne;e(u không laE( tân(p tin XLSM, XLSX thiE( ke;e(t thue(c
'    thý mun(c ba(e(t ?âE(u laE( thý muc coe( chýe(a XLSM, XLSX
    StartDir = Mid(excelFile, 1, start)
    
    Set fso = CreateObject("Scripting.FileSystemObject")
'    cae(c thông sôe( - Params - cho WinRAR - o"N( ?ây tôi bung luôn týE( tân(p tin XLSM.
'    chiN( bung styles.xml  vaE(o cuE(ng thý mun(c vo"e(i tân(p tin XLSM, XLSX
    Params = "x -apxl " & """" & excelFile & """" & " xl\styles.xml"
'    kie(ch hoan(t WinRAR ?e;N( bung styles.xml vaE(o cuE(ng thý mun(c vo"e(i tân(p tin XLSM, XLSX
    If RunAndStop(RARExe, Params, StartDir) Then  ' ne;e(u bung thaE(nh công thiE( ...
'        mo"N( tân(p tin styles.xml vaE( ?on(c toaE(n bôn( nôn(i dung
        Set ts = fso.OpenTextFile(StartDir & "styles.xml")
        text = ts.ReadAll
        ts.Close
'        xoe(a tân(p tin styles.xml
        fso.DeleteFile StartDir & "styles.xml", True
'        tiE(m <cellStyle name= vaE( <cellStyle name="Normal" ?e;N( lýo"n(c boN(
        start = InStr(1, text, "<cellStyle name=")
        end_ = InStrRev(text, "<cellStyle name=""Normal""")
'        nôn(i dung ?aT, lýo"n(c boN( týE( <cellStyle name= to"e(i trýo"e(c <cellStyle name="Normal"
        text = Left(text, start - 1) & Mid(text, end_)
'        tan(o tân(p tin styles.xml mo"e(i
        Set ts = fso.CreateTextFile(StartDir & "styles.xml")
'        ghi nôn(i dung mo"e(i vaE(o styles.xml
        ts.Write text
        Set ts = Nothing
'        cae(c thông sôe( - Params - cho WinRAR ?e;N( the;m tân(p tin styles.xml vaE(o XLSM, XLSX
'    - seT, thay the;e( styles.xml cuT,
        Params = "a -apxl " & """" & excelFile & """" & " styles.xml"
'        thay the;e( styles.xml cuT, ba(E(ng mo"e(i
        If RunAndStop(RARExe, Params, StartDir) Then  ' ne;e(u the;m thaE(nh công thiE( ...
'            xoe(a tân(p tin styles.xml
            fso.DeleteFile StartDir & "styles.xml", True
'            mo"N( tân(p tin XLSM, XLSX
'            Workbooks.Open StartDir & "\" & filename
        End If
        
    End If
    Set fso = Nothing
End Sub
Em xin đính kèm file đã xóa và Kq từ Asap.
 

File đính kèm

  • XoaStyles.rar
    94.8 KB · Đọc: 261
Lần chỉnh sửa cuối:
Cám ơn anh Siwtom và NDU rất nhiều, em sẽ thực hiện thử và sẽ báo cáo kết quả.
Sau khi chỉnh sửa code theo ý anh Siwtom và NDU thì code chạy nhưng khi dùng Asap Ultilities thì vẫn báo còn vài Styles, có khi sinh ra do file gốc là 2003 - > 2007 -> 2010.
Trước mắt vậy là khá OK.
Thì đúng rồi.
Để đơn giản hóa vấn đề nên mình đã nhở anh siwtom xóa từ chổ <cellStyle name= đến trước từ khóa cellStyle name="Normal".
Để ý thấy Style rác thường nằm trước Style Normal nhưng được nhiên trên thực tế vẫn có những Style rác nằm ở nơi khác mà (không biết trước)
Hai anh triển khia giúp thành AddIns giúp và phần tên file cần xóa thì kg cần phải ghi đầy đủ .xlsm hay .xlsx mà cho nó tự nhận dạng.
Thì ThuNghi dùng GetOpenFileName lọc 2 loại file xlsm và xlsx là được rồi ---> Duyệt đến file nào ta mần file nấy
Ví dụ:
PHP:
Sub Test()
  Dim vFile
  vFile = Application.GetOpenFilename("Excel 12 Files, *.xlsx;*.xlsm")
  If TypeName(vFile) = "String" Then PrepareAndRun vFile
End Sub
Lưu ý: Nếu dùng GetOpenFileName thì chắc chắn ta chưa biết vFile có thật sự có Style rác hay không
Để kiểm tra thì hãy xem trong Sub PrepareAndRun có 2 biến startend_
start = InStr(1, text, "<cellStyle name=")
end_ = InStrRev(text, "<cellStyle name=""Normal""")
Nếu 2 biến này cho ra kết quả = nhau thì không có Style rác và ngược lại (tương đối thôi)
Vậy phải thêm cái IF trong Sub PrepareAndRun ---> ThuNghi tự làm nha

-------------------------
Nói chung thì phần khó nhất trong code là giải nén và nén file (anh siwtom đã làm rồi). Phần còn lại là xử lý chuổi từ trong file styles.xml chắc ThuNghi tự phát triển được mà
Tôi đang nghĩ đến hướng sẽ tìm trong chuổi để lấy toàn bộ các Style Name, xong xét xem các Style Name này có BuildIn =False hay không, nếu có thì Delete.
Nghĩ thì nghĩ thế thôi nhưng băt tay vào làm thật sự chắc cũng mệt đây!
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Nói chung thì phần khó nhất trong code là giải nén và nén file (anh siwtom đã làm rồi). Phần còn lại là xử lý chuổi từ trong file styles.xml chắc ThuNghi tự phát triển được mà
Tôi đang nghĩ đến hướng sẽ tìm trong chuổi để lấy toàn bộ các Style Name, xong xét xem các Style Name này có BuildIn =False hay không, nếu có thì Delete.
Đang dùng cách tà đạo như sau:
1/ Lấy 1 file Styles.xlm chuẩn, khi tạo file thì lưu riêng.
2/ Trong quá trình làm việc nếu có copy sh nếu tạo ra style rác thì làm tiếp.
3/ Đổi đuôi file thành .zip
4/Thay thế file chuẩn vào.
5/ Thay lại đuôi.
Công đoạn đó cũng OK, sẽ vận dụng code của anh Siwtom xóa Style.xlm và thay thế.
Còn dùng code sau để xác định các Style BuiltIn và xóa nhưng kg dc.
PHP:
Sub ListStyles()
Dim objStyle As Excel.Style
For Each objStyle In ActiveWorkbook.Styles
  On Error Resume Next
  If Not objStyle.BuiltIn Then
    MsgBox objStyle.Name
    objStyle.Delete
  End If
  On Error GoTo 0
Next objStyle
End Sub
Cám ơn anh Siwtom và NDU nhiều.
 
Đang dùng cách tà đạo như sau:
1/ Lấy 1 file Styles.xlm chuẩn, khi tạo file thì lưu riêng.
2/ Trong quá trình làm việc nếu có copy sh nếu tạo ra style rác thì làm tiếp.
3/ Đổi đuôi file thành .zip
4/Thay thế file chuẩn vào.
5/ Thay lại đuôi.
Công đoạn đó cũng OK, sẽ vận dụng code của anh Siwtom xóa Style.xlm và thay thế.
Còn dùng code sau để xác định các Style BuiltIn và xóa nhưng kg dc.
PHP:
Sub ListStyles()
Dim objStyle As Excel.Style
For Each objStyle In ActiveWorkbook.Styles
  On Error Resume Next
  If Not objStyle.BuiltIn Then
    MsgBox objStyle.Name
    objStyle.Delete
  End If
  On Error GoTo 0
Next objStyle
End Sub
Cám ơn anh Siwtom và NDU nhiều.
Cải tiến tiếp code của anh siwtom đây (xác định BuiltIn ngay trong filt style.xml luôn)
PHP:
Private Const rarApp = "winrar.exe"
Sub PrepareAndRun(ByVal Excel_File As String)
  Dim Params As String, filename As String, StartDir As String, ext As String
  Dim text As String, text2 As String, text3 As String
  Dim Arr, aBuiltInYes(), aBuiltInNo()
  Dim lBuiltInYes As Long, lBuiltInNo As Long, i As Long, start As Long, end_ As Long

  With CreateObject("Scripting.FileSystemObject")
    ext = .GetExtensionName(Excel_File)
    If ext <> "xlsm" And ext <> "xlsx" Then Exit Sub
    filename = .GetFile(Excel_File).Name
    StartDir = .GetFile(Excel_File).ParentFolder.Path
    Params = "x -apxl " & """" & Excel_File & """" & " xl\styles.xml"
    If RunAndStop(rarApp, Params, StartDir) Then
      With .OpenTextFile(StartDir & "\styles.xml")
        text = .ReadAll
        .Close
      End With
      .DeleteFile StartDir & "\styles.xml", True
      start = InStr(1, text, "<cellStyle name=")
      end_ = InStr(1, text, "</cellStyles>")
      text2 = Mid(text, start, end_ - start)
      text3 = Replace(text2, "/><", "/>" & vbLf & "<")
      Arr = Split(text3, vbLf)
      For i = LBound(Arr) To UBound(Arr)
        If InStr(1, Arr(i), "builtinId") Then
          lBuiltInYes = lBuiltInYes + 1
          ReDim Preserve aBuiltInYes(1 To lBuiltInYes)
          aBuiltInYes(lBuiltInYes) = Arr(i)
        Else
          lBuiltInNo = lBuiltInNo + 1
          ReDim Preserve aBuiltInNo(1 To lBuiltInNo)
          aBuiltInNo(lBuiltInNo) = Arr(i)
        End If
      Next
      If lBuiltInNo Then
        text = Replace(text, text2, Join(aBuiltInYes, ""))
        .CreateTextFile(StartDir & "\styles.xml").Write text
        Params = "a -apxl " & """" & Excel_File & """" & " styles.xml"
        If RunAndStop(rarApp, Params, StartDir) Then
          .DeleteFile StartDir & "\styles.xml", True
          MsgBox "Da xoa xong " & lBuiltInNo & " styles rác"
        End If
      Else
        MsgBox "Không có styles rác nào"
      End If
    End If
  End With
End Sub
ThuNghi thử xem!
Tôi vừa chơi xong mấy file, thấy rất ngon lành: Xóa sạch không chừa 1 style rác nào
Trong file đính kèm tôi mới thiết kế cái UserForm nhưng chưa kịp viết code ---> ThuNghi làm tiếp nha ---> Xử lý biến mảng aBuiltInNo rồi cho vào ListBox là được rồi
 

File đính kèm

  • ThiNghiem_CellStyle.rar
    39.3 KB · Đọc: 316
Cải tiến tiếp code của anh siwtom đây (xác định BuiltIn ngay trong filt style.xml luôn)
PHP:
...
ThuNghi thử xem!
Tôi vừa chơi xong mấy file, thấy rất ngon lành: Xóa sạch không chừa 1 style rác nào
Trong file đính kèm tôi mới thiết kế cái UserForm nhưng chưa kịp viết code ---> ThuNghi làm tiếp nha ---> Xử lý biến mảng aBuiltInNo rồi cho vào ListBox là được rồi
Quá ngon rồi, xóa sạch luôn dùng ASAP kiểm tra cũng không còn.
Dùng cách đó xóa là OK rồi, thêm form hiển thị làm gì cho phức tạp.
Cám ơn NDU và anh Siwtom rất nhiều.
 
Dùng cách đó xóa là OK rồi, thêm form hiển thị làm gì cho phức tạp.
.

Mình thì nghĩ khác!
Vì biết sản phẩm của mình "ngon" nên phải cố "đóng gói bao bì" cho đẹp nhằm tạo dấu ấn riêng cho GPE
(Mai này ai biết có thằng cu nước ngoài nào đó vào download về xài cũng nở mày nở mặt cho GPE)
Ẹc... Ẹc...
---------------------------
Nói thêm: Nếu quyết định dùng Form để liệt kê Style rác, mình nghĩ có lẽ phải chia Sub PrepareAndRun ra thành 2 sub riêng: 1 để liệt kê và 1 để xóa
(để có thời gian sẽ nghiên cứu thêm)
 
Cái vụ Style rác nay em mới biết tới! Vọc code một hồi mà chẳng hiểu gì cả! (mà không biết vọc mãi có hiểu được không nữa)
 
Cái vụ Style rác nay em mới biết tới! Vọc code một hồi mà chẳng hiểu gì cả! (mà không biết vọc mãi có hiểu được không nữa)

Toàn bộ giải thuật chỉ là đổi đuôi file xlsx hoặc xlsm thành .RAR. Xong giải nén rồi xử lý chuổi nằm bên trong file styles.xml thôi mà
 
Cảm ơn anh NDU! Em sẽ cố gắng nghiên cứu cái này xem thế nào!!
 
Cải tiến tiếp code của anh siwtom đây (xác định BuiltIn ngay trong filt style.xml luôn)
PHP:
Private Const rarApp = "winrar.exe"
Sub PrepareAndRun(ByVal Excel_File As String)
  Dim Params As String, filename As String, StartDir As String, ext As String
  Dim text As String, text2 As String, text3 As String
  Dim Arr, aBuiltInYes(), aBuiltInNo()
  Dim lBuiltInYes As Long, lBuiltInNo As Long, i As Long, start As Long, end_ As Long

  With CreateObject("Scripting.FileSystemObject")
    ext = .GetExtensionName(Excel_File)
    If ext <> "xlsm" And ext <> "xlsx" Then Exit Sub
    filename = .GetFile(Excel_File).Name
    StartDir = .GetFile(Excel_File).ParentFolder.Path
    Params = "x -apxl " & """" & Excel_File & """" & " xl\styles.xml"
    If RunAndStop(rarApp, Params, StartDir) Then
      With .OpenTextFile(StartDir & "\styles.xml")
        text = .ReadAll
        .Close
      End With
      .DeleteFile StartDir & "\styles.xml", True
      start = InStr(1, text, "<cellStyle name=")
      end_ = InStr(1, text, "</cellStyles>")
      text2 = Mid(text, start, end_ - start)
      text3 = Replace(text2, "/><", "/>" & vbLf & "<")
      Arr = Split(text3, vbLf)
      For i = LBound(Arr) To UBound(Arr)
        If InStr(1, Arr(i), "builtinId") Then
          lBuiltInYes = lBuiltInYes + 1
          ReDim Preserve aBuiltInYes(1 To lBuiltInYes)
          aBuiltInYes(lBuiltInYes) = Arr(i)
        Else
          lBuiltInNo = lBuiltInNo + 1
          ReDim Preserve aBuiltInNo(1 To lBuiltInNo)
          aBuiltInNo(lBuiltInNo) = Arr(i)
        End If
      Next
      If lBuiltInNo Then
        text = Replace(text, text2, Join(aBuiltInYes, ""))
        .CreateTextFile(StartDir & "\styles.xml").Write text
        Params = "a -apxl " & """" & Excel_File & """" & " styles.xml"
        If RunAndStop(rarApp, Params, StartDir) Then
          .DeleteFile StartDir & "\styles.xml", True
          MsgBox "Da xoa xong " & lBuiltInNo & " styles rác"
        End If
      Else
        MsgBox "Không có styles rác nào"
      End If
    End If
  End With
End Sub
ThuNghi thử xem!
Tôi vừa chơi xong mấy file, thấy rất ngon lành: Xóa sạch không chừa 1 style rác nào
Trong file đính kèm tôi mới thiết kế cái UserForm nhưng chưa kịp viết code ---> ThuNghi làm tiếp nha ---> Xử lý biến mảng aBuiltInNo rồi cho vào ListBox là được rồi
A ơi e đang gặp sự cố như trên. A hướng dẫn e cụ thể duoc khong chi tiêt vào. E thử mà ko biết ntn. E ko giỏi mấy cái nè. Hoặc a cho e xin sđt e hỏi cụ thể. e cảm ơn a!
 
Đoạn code sau cũng xóa Style rác, nhưng cũng chưa hoàn toàn triệt để:

Mã:
Sub StyleKill()
		Dim CellStyle As Style
		On Error Resume Next
		Application.ScreenUpdating = False
		For Each CellStyle In ActiveWorkbook.Styles
			If Not CellStyle.BuiltIn Then
				CellStyle.Locked = False	'Bỏ khóa nếu Style bị khóa
				CellStyle.Delete
			End If
		Next CellStyle
		Application.ScreenUpdating = True
		Set CellStyle = Nothing
End Sub
 
Web KT
Back
Top Bottom