Đăng ký học Excel và VBA cùng GPE tháng 11 - TPHCM

Đăng ký học Excel và phân tích số liệu cùng GPE tháng 12 - TPHCM

Mua sách "VBA trong Excel - Cải thiện và tăng tốc" tái bản

làm Add-ins tự chạy xoá sheet XL4Poppy trong excel

Thảo luận trong 'Các Add-ins cho excel' bắt đầu bởi khanhvc2003, 22 Tháng tám 2012.

  1. khanhvc2003

    khanhvc2003 Thành viên mới

    Công ty mình đang bị con virus marco XL4Poppy, mình định viết code
    bằng VBA của excel đưa vào add-ins để xoá Sheet XL4Poppy một cách tự động sau khi mở file lên.

    Mình không biết là sao để thực hiện công việc này.

    Mong được được trợ giúp.
     
  2. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Lỡ như cái sheet Macro 4 ấy hổng phải tên là "XL4Poppy" thì sao?
    Vậy nên phải duyệt qua các sheet, xét Type của nó ---> If Sheets(wksName).Type = 3 Then SheetType = "MacroSheet" ---> Gặp đúng thằng này thì XÓA
    -------------
    Đại khái thế thôi chứ nếu muốn đưa vào AddIn và hoạt động 1 cách tự động thì phải qua 1 công đoạn khá dài (đang mường tượng là phải cần đến Class đấy)
     
  3. khanhvc2003

    khanhvc2003 Thành viên mới

    Cám ơn bạn đã trả lời, ý mình là con virus này tạo thêm một sheet có tên là XL4Poppy trong mỗi file excel. nên mình chỉ cần kiểm tra trong file nếu có đúng tên đó thì xóa ngược lại không làm gì cả .

    đoạn code này mình không hiểu mong bạn giải thích thêm
    Thực ra mình cũng ghi code để xóa sheet đó rồi nhưng bị vướn là đối với những file có password khi mở thì không làm được, nên sinh ra ý tưởng là đưa vào add-ins để tự động chạy luôn. Dưới đây là code VBA mình đã build

     
  4. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Thì dùng để kiểm tra xem kiểu của sheet là Worksheet hay Macrosheet (con XL4Popy chính là Macrosheet)
    Bạn nên nhớ rằng đâu phải con virus macro 4 nào cũng đặt tên sheet là XL4Popy. Vậy nếu gặp con khác thì.. nghỉ xóa à?
    Vậy nên ta dùng code kiểm tra, thấy kiểu của sheet là Macrosheet thì xóa (hổng cần biết nó tên gì)
    Đương nhiên nếu mở file có pass thì dù các phần mềm viết sẵn cũng phải thua thôi
    Giờ muốn viết thành AddIn thì ta không cần duyệt file trong thư mục làm gì. Cứ file nào mở lên thì code làm việc
    Ví dụ thế này:
    1> Chèn 1 ClassModule, đặt tên cho nó là wkbEvent
    2> Chèn code dưới đầy vào Class Module
    PHP:
    Public WithEvents ExlApp As Application
    Private Sub Class_Initialize()
      
    Set ExlApp Application
    End Sub
    PHP:
    Private Sub Class_Terminate()
      
    Set ExlApp Nothing
    End Sub
    Mã:
    Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
      MsgBox "Có file moi mo"
      ''Thay MsgBox bằng code xóa sheet của bạn
    End Sub
    3> Chèn 1 Module và paste code dưới đây vào:
    PHP:
    Dim ExlObj As New wkbEvent
    Sub Auto_Open
    ()
      If 
    ExlObj Is Nothing Then Set ExlObj = New wkbEvent
    End Sub
    PHP:
    Sub Auto_Close()
      
    Set ExlObj Nothing
    End Sub
    4> Lưu file thành 1 Add và thí nghiệm
     
  5. nghiaphuc

    nghiaphuc Hoàng Nghĩa Phúc Staff Member

    Theo mình thì sử dụng VirusMacroWarning của anh Nguyễn Duy Tuân cho chắc, không những xóa được những sheet dạng này nó còn làm được nhiều việc hơn thế nữa...
     
  6. khanhvc2003

    khanhvc2003 Thành viên mới

    Tools này rất hay nhưng xóa được sheet này nhưng sheet có tên XL4poppy không xóa, tool này hình nhưng không biết đến sheet này.
     
  7. khanhvc2003

    khanhvc2003 Thành viên mới

    wow, Mình test OK, đúng đây là cái mình cần.
    Cám ơn bạn nhiều.
     
  8. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Mình CẢM ƠN bạn đúng hơn!
    Vì lâu lâu mới có 1 người nhìn code áp dụng được luôn
    Khỏi giải thích và đưa file lên ---> Đở mất công mình ghê!
    Ẹc... Ẹc... --=0
    (Bệnh nguyên tuần nay, con mắt mờ luôn rồi)
     
  9. khanhvc2003

    khanhvc2003 Thành viên mới

    Bạn ui,
    Mình còn vướn chổ này cho mình hỏi luôn tí, hihi`
    Về lý thuyết đã xóa được Sheet XL4Poppy rồi nhưng mình muốn tự động lưu luôn, chứ không khi user mở lên không chỉnh gì hết trong file mà đóng file nó hỏi có save không mà user chọn NO thì cũng như không?
    Lần nữa xin cám ơn bạn nhiều.
     
  10. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Câu hỏi rất hay đây (mà làm được cũng.. tê)
    Vì không biết code xóa sheet của bạn thế nào nên tôi làm 1 ví dụ khác:
    1> Trong Class tên wkbEvent
    PHP:
    Public WithEvents ExlApp As Application
    Private Sub Class_Initialize()
      
    Set ExlApp Application
    End Sub
    PHP:
    Private Sub Class_Terminate()
      
    Set ExlApp Nothing
    End Sub
    Mã:
    Private Sub ExlApp_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
      Dim tmp As String
      If n > 0 Then
        tmp = vbTab & Join(Arr, vbTab) & vbTab
        If InStr(tmp, vbTab & Wb.Name & vbTab) Then 
          MsgBox "file này có sheet tên NDU"  ''----> Thay bằng việc lưu file wb.Save
        End If
      End If
    End Sub
    Mã:
    Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
      Dim wks As Worksheet
      For Each wks In Wb.Sheets
        If UCase(wks.Name) = "NDU" Then '' ---> Thay bằng điều kiện xóa sheet của bạn
          n = n + 1
          ReDim Preserve Arr(1 To n)
          Arr(n) = Wb.Name
        End If
      Next
    End Sub
    2> Code trong Module
    PHP:
    Dim ExlObj As New wkbEvent
    Public Arr(), As Long
    Sub Auto_Open
    ()
      If 
    ExlObj Is Nothing Then Set ExlObj = New wkbEvent
    End Sub
    PHP:
    Sub Auto_Close()
      
    Set ExlObj Nothing
    End Sub
    Code trên sẽ kiểm tra những file vừa mở, nếu trong file có 1 sheet mang tên là "NDU" thì khi đóng file nó sẽ thông báo
    Bạn tự mình sửa code cho trường hợp có sự kiện xóa sheet xãy ra thì lưu file nhé
    -----------------------
    Hoặc bạn cũng có cách khác đơn giản hơn: Khi sự kiện Private Sub ExlApp_WorkbookOpen kích hoạt, nếu có xóa sheet diễn ra thì lưu luôn (wb.Save)
     
    Lần chỉnh sửa cuối: 22 Tháng tám 2012
  11. khanhvc2003

    khanhvc2003 Thành viên mới

    Bác thật là Bở Rồ,

    Trong sự kiện WorkbookOpen mình thay nội dung
    "n = n + 1
    ReDim Preserve Arr(1 To n)
    Arr(n) = Wb.Name"
    thành wb.delete và sau NEXT mình wb.save nhưng khi mở file MS excel lại hỏi có xóa không, nếu chọn Yes mới xóa, còn No thì không xóa.

    Ý mình muốn là mở file lên nếu sheet có tên thỏa điều kiện (ví dụ: NDU) thì xóa luôn không hỏi gì hết và tự động share luôn.

    Rất mong được trợ giúp.
     
  12. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Việc xóa sheet muốn "trót lọt" mà không bị "hỏi thăm" gì ta phải thêm dòng Application.DisplayAlerts = False ở đầu code và Application.DisplayAlerts = True ở cuối code
    Ví dụ thế này:
    1> Code trong Module
    PHP:
    Dim ExlObj As New wkbEvent
    Public chk As Boolean
    Sub Auto_Open
    ()
      If 
    ExlObj Is Nothing Then Set ExlObj = New wkbEvent
    End Sub
    PHP:
    Sub Auto_Close()
      
    Set ExlObj Nothing
    End Sub
    2> Code trong ClassModule
    PHP:
    Public WithEvents ExlApp As Application
    Private Sub Class_Initialize()
      
    Set ExlApp Application
    End Sub
    PHP:
    Private Sub Class_Terminate()
      
    Set ExlApp Nothing
    End Sub
    Mã:
    Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
      Dim wks As Worksheet
      chk = False
      Application.DisplayAlerts = False
      For Each wks In Wb.Sheets
        If UCase(wks.Name) = "NDU" Then ''---> Chổ này là điều kiện xóa sheet của bạn
          wks.Delete
          chk = True
        End If
      Next
      If chk Then
        MsgBox "file này có sheet tên NDU"
        Wb.Save
      End If
      Application.DisplayAlerts = True
    End Sub
    (Code bài trước viết vội quá nên hơi bị... khùng chứ Bở Rồ gì)
     
    Lần chỉnh sửa cuối: 22 Tháng tám 2012
  13. khanhvc2003

    khanhvc2003 Thành viên mới

    Một lần nữa thành thật cám ơn Bờ Rồ.
     

Chia sẻ trang này