Code kiểm Group Sheets ? (1 người xem)

  • Thread starter Thread starter KUMI
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

KUMI

Bụi phấn
Tham gia
17/1/12
Bài viết
564
Được thích
571
Xin chào GPE!
Em đang cần một code để kiểm tra xem trong một File có tình trạng group sheets hay không ạ.
Rất mong nhận được sự giúp đỡ.
Xin cảm ơn!
 
Xin chào GPE!
Em đang cần một code để kiểm tra xem trong một File có tình trạng group sheets hay không ạ.
Rất mong nhận được sự giúp đỡ.
Xin cảm ơn!
Group sheets là cái gì vậy nhóc? Mình hỏng có biết cái này là cái gì hết á!

Phải chăng nhóc chọn một sheet rồi đồng thời nhấn Shift rồi chọn thêm một sheet khác để cho nhiều sheet được chọn gọi thì gọi là GROUP hay không? Hoặc đang chọn sheet này, rồi bấm Ctrl rồi chọn thêm sheet khác nữa. Chứ tự nhiên sao nó bị vậy được?

Nếu là vậy thì làm sao mà kiểm tra được tình trạng này được!
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng rồi ạ.
nó giống như chiêu này nè anh Nghĩa.
http://www.giaiphapexcel.com/forum/...g-tuyệt-chiêu-trong-Excel&p=105714#post105714
Không phải là tự nhiên nó bị đâu ạ. Mà em muốn xin một code kiểm tra khi mà mình thực hiện thao tác này anh ạ.
Cụ thể là ví dụ nếu em chọn Sheets 1 và và sheets 2 thì sẽ hiện sẽ hiện thông báo là có sheets đang nhóm ...
 
Upvote 0
Group sheets là cái gì vậy nhóc? Mình hỏng có biết cái này là cái gì hết á!

Phải chăng nhóc chọn một sheet rồi đồng thời nhấn Shift rồi chọn thêm một sheet khác để cho nhiều sheet được chọn gọi thì gọi là GROUP hay không? Hoặc đang chọn sheet này, rồi bấm Ctrl rồi chọn thêm sheet khác nữa. Chứ tự nhiên sao nó bị vậy được?

Nếu là vậy thì làm sao mà kiểm tra được tình trạng này được!

được đó bác N, --=0
Trường hợp của Kumi cũng khá hợp lý, nếu người dùng đang Group thì có thể phát sinh lỗi như: Khi điền số liệu 1 sheet thì các sheet đang group sẽ bị điền theo, việc xoá sheet và ẩn sheet cũng thế. :-=

' - - -
to Kumi

bạn thử code sau nhé
Mã:
Sub check_groupSheets()
Dim Answer
n = ActiveWindow.SelectedSheets.Count
    If n > 1 Then
        mSg = mSg & "Tim thay " & n & " sheet dang group" & vbNewLine & "Ban co muon Ungroup"
        Answer = MsgBox(mSg, vbYesNo + vbQuestion)
        If Answer = vbNo Then Exit Sub
        
        If Answer = vbYes Then
            ActiveWindow.SelectedSheets(1).Select
            MsgBox ("Da~ ungroup")
        End If
    Else
        MsgBox ("Ko tim thay Group sheets"), vbInformation
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Hihi,Code trên đúng là cái em đang cần.
Đúng như anh PhucBuGis nói nhiều khi ta Group sheets lại để làm một cái gì đó nhưng quên không Ungroup dẫn đến nhiều hậu quả hoặc những lỗi không hay xảy ra (ví dụ anh nói là một minh họa).
Em cảm ơn anh nhiều nhé, gần đây anh tiến bộ nhanh quá. :)
Chúc anh trong cuộc sống gặp nhiêu thành công lớn!
 
Upvote 0
được đó bác N, --=0
Trường hợp của Kumi cũng khá hợp lý, nếu người dùng đang Group thì có thể phát sinh lỗi như: Khi điền số liệu 1 sheet thì các sheet đang group sẽ bị điền theo, việc xoá sheet và ẩn sheet cũng thế. :-=

' - - -
to Kumi

bạn thử code sau nhé
Mã:
Sub check_groupSheets()
Dim Answer
n = ActiveWindow.SelectedSheets.Count
    If n > 1 Then
        mSg = mSg & "Tim thay " & n & " sheet dang group" & vbNewLine & "Ban co muon Ungroup"
        Answer = MsgBox(mSg, vbYesNo + vbQuestion)
        If Answer = vbNo Then Exit Sub
        
        If Answer = vbYes Then
            ActiveWindow.SelectedSheets(1).Select
            MsgBox ("Da~ ungroup")
        End If
    Else
        MsgBox ("Ko tim thay Group sheets"), vbInformation
    End If
End Sub
À há, nào giờ chỉ biết chọn nhiều sheet để xóa cái rẹt là xong, giờ mới biết vụ đang group mà ghi vào đâu đó thì ở đâu đó trên sheet khác cũng dính chưởng luôn! kaka, đây cũng là một kinh nghiệm mới đó.

Nhưng cũng may mắn là khi sheet đang group, nếu ta ghi rõ địa chỉ sheet nào cần tác động thì nó cũng không ảnh hưởng đến sheet khác!

Mã:
Sub Macro1()
    Sheets(Array("[COLOR=#ff0000]Sheet1[/COLOR]", "Sheet2", "Sheet3", "Sheet4")).Select
    Sheets("Sheet1").[A1] = "hoang trong nghia"
End Sub

Tuy nhiên, nếu ta không để địa chỉ sheet rõ ràng thì ngầm hiểu ActiveSheet ở đây sẽ là sheet đầu tiên được chọn (trong trường hợp này là sheet màu đỏ).
 
Upvote 0
Hihi,Code trên đúng là cái em đang cần.
Đúng như anh PhucBuGis nói nhiều khi ta Group sheets lại để làm một cái gì đó nhưng quên không Ungroup dẫn đến nhiều hậu quả hoặc những lỗi không hay xảy ra (ví dụ anh nói là một minh họa).
Em cảm ơn anh nhiều nhé, gần đây anh tiến bộ nhanh quá. :)
Chúc anh trong cuộc sống gặp nhiêu thành công lớn!
Cho hỏi, giả sử file của bạn đang thực thi, vô tình bạn bị group sheets mà không biết, vậy làm sao để bạn nhận ra chúng đang group? Nếu bạn chủ động bấm chạy code, thì thôi thà nhìn vào Sheet Tabs còn nhanh hơn!
 
Upvote 0
Cho hỏi, giả sử file của bạn đang thực thi, vô tình bạn bị group sheets mà không biết, vậy làm sao để bạn nhận ra chúng đang group? Nếu bạn chủ động bấm chạy code, thì thôi thà nhìn vào Sheet Tabs còn nhanh hơn!

Đúng như anh nghĩ, vì thế em sẽ gán nó vào lúc mở file hoặc lưu file.
Hoặc trong trường hợp này,cũng có thể thể dùng đến:
Mã:
Dim n
    For n = 1 To 10
        Sheets(n).Activate
        ActiveSheet.Unprotect Password:="xxx"
    Next

Với code trên khi em chạy thường hay bị lỗi ảnh đến các code nằm trong :
Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
...........
End Sub

vì thế em định làm như sau:
Mã:
Dim n,i
For n = 1 To 10
Sheets(n).Activate
ActiveSheet.Unprotect Password:="xxx"
Next
i = ActiveWindow.SelectedSheets.Count
If i > 1 Then ActiveWindow.SelectedSheets(1).Select
Sheets(1).Activate
 
Upvote 0
Đúng như anh nghĩ, vì thế em sẽ gán nó vào lúc mở file hoặc lưu file.
Hoặc trong trường hợp này,cũng có thể thể dùng đến:
Mã:
Dim n
    For n = 1 To 10
        Sheets(n).Activate
        ActiveSheet.Unprotect Password:="xxx"
    Next

Với code trên khi em chạy thường hay bị lỗi ảnh đến các code nằm trong :
Mã:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
...........
End Sub

vì thế em định làm như sau:
Mã:
Dim n,i
For n = 1 To 10
Sheets(n).Activate
ActiveSheet.Unprotect Password:="xxx"
Next
i = ActiveWindow.SelectedSheets.Count
If i > 1 Then ActiveWindow.SelectedSheets(1).Select
Sheets(1).Activate
Theo mình hiểu thì code của KUMI dùng để khóa toàn bộ các sheet đúng không bạn?
 
Upvote 0
Theo mình hiểu thì code của KUMI dùng để khóa toàn bộ các sheet đúng không bạn?
Dạ ngược lại anh ạ đó là mở khóa , em chỉ minh họa trong trường hợp nay là chọn nhiều sheets liên tiếp thôi ạ.. vì nó sẽ xảy ra lỗi ảnh hưởng đến những vấn đề liên quan khác.
 
Upvote 0
Đúng như anh nghĩ, vì thế em sẽ gán nó vào lúc mở file hoặc lưu file.
Hoặc trong trường hợp này,cũng có thể thể dùng đến:
Mã:
Dim n
    For n = 1 To 10
        Sheets(n).Activate
        ActiveSheet.Unprotect Password:="xxx"
    Next
....
[/QUOTE]

việc mở khóa sheet thì Kumi ko phải nhất thiết phải Active từng sheet như vậy --=0, nó ảnh hưởng đến Selection_change là phải.

bạn xem thử code sau có áp dụng vào được ko?
[CODE]Sub Unlock_sheet()
Dim ws As Worksheet
Set WSArray = Sheets(Array("Sheet1", "Sheet3", "Sheẹt3", "Sheet7", "Sheet9"))
    For Each ws In WSArray
        ws.Unprotect password:="xxx"
        'ws.Cells.Locked = false
    Next
End Sub
 
Upvote 0
việc mở khóa sheet thì Kumi ko phải nhất thiết phải Active từng sheet như vậy --=0, nó ảnh hưởng đến Selection_change là phải.

bạn xem thử code sau có áp dụng vào được ko?
Mã:
Sub Unlock_sheet()
Dim ws As Worksheet
Set WSArray = Sheets(Array("Sheet1", "Sheet3", "Sheẹt3", "Sheet7", "Sheet9"))
    For Each ws In WSArray
        ws.Unprotect password:="xxx"
        'ws.Cells.Locked = false
    Next
End Sub
:-=...Code trên chỉ áp dụng trong trường hợp ít sheets thôi phải không anh? chứ nhiều sheets thì làm sao mà liệt kê hết được ạ.;;;;;;;;;;;
 
Upvote 0
Bài của KUMI có 2 yêu cầu: Bỏ Group sheets và Bỏ Password
Bỏ Group sheets mà Sheets(1).Activate là chưa ổn vì nếu trong Worksheets không có Sheets(1) thì tèo luôn. Vậy giải pháp là cứ chọn từng sheet thì tự nhiên mất Group sheets (nếu có).

Bạn nghiên cứu thử Code này (Không cần biết tên Sheet và cũng không cần biết File có bao nhiêu Sheet)

Mã:
Sub Macro1()
    For Each sh In Worksheets
        With sh
            .Select  '
            .Unprotect Password:="xxx"
        End With
    Next
End Sub
 
Upvote 0
Bài của KUMI có 2 yêu cầu: Bỏ Group sheets và Bỏ Password
Bỏ Group sheets mà Sheets(1).Activate là chưa ổn vì nếu trong Worksheets không có Sheets(1) thì tèo luôn. Vậy giải pháp là cứ chọn từng sheet thì tự nhiên mất Group sheets (nếu có).

Bạn nghiên cứu thử Code này (Không cần biết tên Sheet và cũng không cần biết File có bao nhiêu Sheet)

Mã:
Sub Macro1()
    For Each sh In Worksheets
        With sh
            .Select  '
            .Unprotect Password:="xxx"
        End With
    Next
End Sub
Đúng là " GỪNG CÀNG GIÀ CÀNG CAY". Cảm ơn bác!
 
Upvote 0
Bài của KUMI có 2 yêu cầu: Bỏ Group sheets và Bỏ Password
Bỏ Group sheets mà Sheets(1).Activate là chưa ổn vì nếu trong Worksheets không có Sheets(1) thì tèo luôn. Vậy giải pháp là cứ chọn từng sheet thì tự nhiên mất Group sheets (nếu có).

Bạn nghiên cứu thử Code này (Không cần biết tên Sheet và cũng không cần biết File có bao nhiêu Sheet)

Mã:
Sub Macro1()
    For Each sh In Worksheets
        With sh
            .Select  '
            .Unprotect Password:="xxx"
        End With
    Next
End Sub

Cảm ơn Bác đã góp ý ạ,code trên thật là đẹp và rất tổng quát.
Còn về chuyện Sheets(1) cháu cứ nghĩ là Sheet này lúc nào luôn có (không thể không có). Còn Sheets(2) hay là Sheet1 thì chưa hẳn là lúc nào cũng có. không biết cháu hiểu như vậy có đúng không ạ.
Nếu cháu hiểu đúng thì có thể trong quá trình viết Bác đã viết nhầm giữa Sheets(1) và Sheet1 ạ.
Nếu cháu hiểu sai thì Bác có thể cho cháu xin một ví dụ minh họa được không ạ,hix!
Cháu rất mong nhận thêm được sự góp ý của Bác!
 
Upvote 0
Cảm ơn Bác đã góp ý ạ,code trên thật là đẹp và rất tổng quát.
Còn về chuyện Sheets(1) cháu cứ nghĩ là Sheet này lúc nào luôn có (không thể không có). Còn Sheets(2) hay là Sheet1 thì chưa hẳn là lúc nào cũng có. không biết cháu hiểu như vậy có đúng không ạ.
Nếu cháu hiểu đúng thì có thể trong quá trình viết Bác đã viết nhầm giữa Sheets(1) và Sheet1 ạ.
Nếu cháu hiểu sai thì Bác có thể cho cháu xin một ví dụ minh họa được không ạ,hix!
Cháu rất mong nhận thêm được sự góp ý của Bác!
Nói cho rõ ở chỗ này các bạn ạ:

Sheets(1).Select

Sheets(1) có nghĩa là Sheet Item 1 và cũng có nghĩa là sheet có vị trí số 1 được chọn, chứ không phải tên sheet, vì thế nó luôn luôn tồn tại trong một Workbook. Cho nên, việc chọn Sheets(1) không bao giờ báo lỗi trừ khi sheet đó đang ẩn.
 
Lần chỉnh sửa cuối:
Upvote 0
Nói cho rõ ở chỗ này các bạn ạ:

Sheets(1).Select

Sheets(1) có nghĩa là Sheet Item 1 và cũng có nghĩa là sheet có vị trí số 1 được chọn, chứ không phải tên sheet, vì thế nó luôn luôn tồn tại trong một Workbook. Cho nên, việc chọn Sheets(1) không bao giờ báo lỗi trừ khi sheet đó đang ẩn.

Đúng như Nghĩa nói. Cảm ơn Nghĩa và xin lỗi KUMI
 
Upvote 0
Lòng vòng từ đầu đến giờ sao thấy For... Next gì tùm lum hết trơn. Muốn bỏ group thì chọn 1 trong các sheet đang group là được rồi
Ví dụ:
Mã:
Sub UngroupSheets()
  Dim shs As Sheets
  Set shs = ActiveWindow.SelectedSheets
  If shs.Count > 1 Then shs(1).Select
End Sub
Còn cái chuyện bỏ hay thêm password lại chả liên quan gì đến group cả (muốn bỏ cứ bỏ, muốn thêm cứ thêm)
 
Upvote 0
Lòng vòng từ đầu đến giờ sao thấy For... Next gì tùm lum hết trơn. Muốn bỏ group thì chọn 1 trong các sheet đang group là được rồi
Ví dụ:
Mã:
Sub UngroupSheets()
  Dim shs As Sheets
  Set shs = ActiveWindow.SelectedSheets
  If shs.Count > 1 Then shs(1).Select
End Sub
Còn cái chuyện bỏ hay thêm password lại chả liên quan gì đến group cả (muốn bỏ cứ bỏ, muốn thêm cứ thêm)
Ô code này của Thầy hay quá,cảm ơn Thầy ạ.. nhìn code con cứ nghĩa rằng là chưa chuẩn vì giả sử ta group sheets(2) và Sheets(3) thì chạy code sẽ đứng ở Sheets(1).
Nhưng test code thì không phải như vậy mà là sau khi chạy code thì sẽ dừng lại ở sheets (đầu tiên) trong nhóm sheets, hay quá.
Về code ungroup của Thầy và anh PhucBugis đều tuyệt cả,hihi!
Kumi cảm ơn GPE!
 
Upvote 0
Lòng vòng từ đầu đến giờ sao thấy For... Next gì tùm lum hết trơn. Muốn bỏ group thì chọn 1 trong các sheet đang group là được rồi
Ví dụ:
Mã:
Sub UngroupSheets()
  Dim shs As Sheets
  Set shs = ActiveWindow.SelectedSheets
  If shs.Count > 1 Then shs(1).Select
End Sub
Còn cái chuyện bỏ hay thêm password lại chả liên quan gì đến group cả (muốn bỏ cứ bỏ, muốn thêm cứ thêm)

For ... Next là để bỏ password của từng Sheet còn Muốn bỏ group Sheet thì có lẽ thỉ cần Sheets(1).Select (bỏ luôn If... Then)

Mã:
Sub UngroupSheets()
    Sheets(1).Select
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
For ... Next là để bỏ password của từng Sheet còn Muốn bỏ group Sheet thì có lẽ thỉ cần Sheets(1).Select (bỏ luôn If... Then)

Mã:
Sub UngroupSheets()
    Sheets(1).Select
End Sub

Cái này không chắc đâu anh à. Phải là ActiveWindow.SelectedSheets(1).Select thì mới chính xác
Tại sao? Vì Sheets(1) có thể đang ẩn và việc Select nó sẽ gây lỗi, còn ActiveWindow.SelectedSheets(1) thì luôn luôn không ẩn
Với lại: Có đang Group thì mới Ungroup (bằng cách chọn 1 sheet), còn sheet không bị group thì Ungroup làm gì
 
Upvote 0

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

Back
Top Bottom