Sắp xếp các Sheet - Bài toán sắp xếp

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Gửi các bạn phương pháp sắp xếp các Sheet trong Workbook theo thứ tự nào đó.
 

File đính kèm

  • Sapxep.zip
    14.8 KB · Đọc: 2,752
Hi Anh Duy Tuân . Anh ơi , em đã tải file sắp xếp của anh về nhưng bây giờ phải làm sao để sắp xếp các sheet được ạ. Mong anh giúp em với, vì em không rành mấy vụ này lắm.
Em cảm ơn anh nhiều.
 
Upvote 0
Hi Anh Duy Tuân . Anh ơi , em đã tải file sắp xếp của anh về nhưng bây giờ phải làm sao để sắp xếp các sheet được ạ. Mong anh giúp em với, vì em không rành mấy vụ này lắm.
Em cảm ơn anh nhiều.

Bạn mở file Sapxep.xls và file của bạn cần sắp xếp. Nhấn ALT+F8 và chọn macro có tên "SapXep", chọn "Run" là được nhé.

Hướng dẫn chi tiết cách sắp xếp các sheet trong Excel tại đây
 
Lần chỉnh sửa cuối:
Upvote 0
Hi anh Nguyễn Duy Tuân, em muốn sắp xếp vị trí các sheet theo một thứ tự cho trước chứ không theo thứ tự 123... hay abc... ạ. Trong file em gửi kèm, tên các sheet ở cột A, thứ tự cần sắp xếp theo cột B. Anh làm giúp em với. Cảm ơn anh nhiều!!!
 

File đính kèm

  • VD.xlsx
    10.4 KB · Đọc: 22
Upvote 0
Hi anh Nguyễn Duy Tuân, em muốn sắp xếp vị trí các sheet theo một thứ tự cho trước chứ không theo thứ tự 123... hay abc... ạ. Trong file em gửi kèm, tên các sheet ở cột A, thứ tự cần sắp xếp theo cột B. Anh làm giúp em với. Cảm ơn anh nhiều!!!

Nếu là thứ tự cho trước thì bạn làm thủ công rồi?
 
Upvote 0
Hi anh Nguyễn Duy Tuân, em muốn sắp xếp vị trí các sheet theo một thứ tự cho trước chứ không theo thứ tự 123... hay abc... ạ. Trong file em gửi kèm, tên các sheet ở cột A, thứ tự cần sắp xếp theo cột B. Anh làm giúp em với. Cảm ơn anh nhiều!!!
Bạn có thể dùng macro sau.
PHP:
Sub SortShs()
Dim ArrIndex As Variant, i As Long
ArrIndex = Sheets("Index").Range("A2:B6").Value
SortArr ArrIndex
Application.ScreenUpdating = False
For i = 1 To UBound(ArrIndex, 1)
    Sheets(ArrIndex(i, 1)).Move Before:=Sheets(1)
Next
Sheets("Index").Move Before:=Sheets(1) 'Xoa dong nay neu muon sheet Index nam o cuoi cung'
Sheets("Index").Select
Application.ScreenUpdating = True
End Sub

Private Function SortArr(ByRef Arr As Variant) As Variant
Dim i As Long, j As Long, TmpVal As Variant
For i = 1 To UBound(Arr, 1) - 1
    For j = i + 1 To UBound(Arr, 1)
        If Arr(j, 2) > Arr(i, 2) Then
            TmpVal = Arr(i, 1): Arr(i, 1) = Arr(j, 1): Arr(j, 1) = TmpVal
            TmpVal = Arr(i, 2): Arr(i, 2) = Arr(j, 2): Arr(j, 2) = TmpVal
        End If
    Next
Next
End Function
 
Upvote 0
Hi anh Nguyễn Duy Tuân, em muốn sắp xếp vị trí các sheet theo một thứ tự cho trước chứ không theo thứ tự 123... hay abc... ạ. Trong file em gửi kèm, tên các sheet ở cột A, thứ tự cần sắp xếp theo cột B. Anh làm giúp em với. Cảm ơn anh nhiều!!!
Cho bạn thêm cách:
PHP:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:B6]
For num1 = 1 To UBound(arr1)
    Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
Next num1
Sheets("index").Select
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cho bạn thêm cách:
PHP:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:B6]
For num1 = 1 To UBound(arr1)
    Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
Next num1
Sheets("index").Select
End Sub
Thứ tự hiện tại là S1, S2, S3 tôi muốn xếp lại là S3, S1, S2 nhưng không đúng :)
 
Upvote 0
Em chưa hiểu ý anh ta, em sếp thấy vẫn đúng !!!
ten sheet thứ tự
sheet1 2
sheet2 3
sheet3 1
có trường hợp bị sai sheet đầu cần bẩy sheet đầu
Mã:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:C6]
For num1 = 1 To UBound(arr1)
    If arr1(num1, 2) = 1 Then
      Sheets(arr1(num1, 1)).move before:=Sheets(1)
    Else
      Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
    End If
Next num1
Sheets("index").Select
End Sub
 
Upvote 0
Cho bạn thêm cách:
PHP:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:B6]
For num1 = 1 To UBound(arr1)
    Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
Next num1
Sheets("index").Select
End Sub
Code này hơi chủ quan! Vì làm sao bạn chắc ăn sheets(arr1(num1, 1)) thật sự tồn tại? Bạn không nghĩ rằng có thể người dùng gõ sai sao?
Nếu bạn viết code cho chính bạn thì không vấn đề gì rồi (bạn thừa sức sửa nếu có sai sót) nhưng ở đây là người khác dùng, có thể họ chưa biết gì về vba luôn... Vậy ta càng cẩn thận càng tốt
 
Upvote 0
Chưa
Thứ tự hiện tại là S1, S2, S3 tôi muốn xếp lại là S3, S1, S2 nhưng không đúng :)
có trường hợp bị sai sheet đầu cần bẩy sheet đầu
Mã:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:C6]
For num1 = 1 To UBound(arr1)
    If arr1(num1, 2) = 1 Then
      Sheets(arr1(num1, 1)).move before:=Sheets(1)
    Else
      Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
    End If
Next num1
Sheets("index").Select
End Sub
Em nghĩ sữa lại vầy là được:
PHP:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:B6]
For num2 = 1 To 2
    For num1 = 1 To UBound(arr1)
        Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
    Next num1
Next num2
Sheets("index").Select
End Sub
Code này hơi chủ quan! Vì làm sao bạn chắc ăn sheets(arr1(num1, 1)) thật sự tồn tại? Bạn không nghĩ rằng có thể người dùng gõ sai sao?
Nếu bạn viết code cho chính bạn thì không vấn đề gì rồi (bạn thừa sức sửa nếu có sai sót) nhưng ở đây là người khác dùng, có thể họ chưa biết gì về vba luôn... Vậy ta càng cẩn thận càng tốt
Vâng, em viết theo file thôi anh ạ, không để ý tới nếu viết sai , chắc thêm on error nữa là được phải không anh!!
 
Upvote 0
...không để ý tới nếu viết sai , chắc thêm on error nữa là được phải không anh!!

On error là loại giải pháp nguy hiểm. Nó cho phép bạn lướt qua lỗi. Nhưng có chắc là ngừoi dùng muốn lướt qua lỗi hay không?
Tuỳ theo điều kiện yêu cầu.
Nếu yêu cầu "làm được mức nào hay mức đó" thì On Error sử dụng được.
Nếu yêu cầu "nếu không được cả thì để yên như cũ" thì On Error không thể sử dụng được.

Ví dụ tôi có một vài tên gõ sai. Và sau đó tôi chạy một cái sub dựa vào vị trí của sheets để làm việc thì kết quả của tôi sẽ sai bấy hết.
 
Upvote 0
Vâng, em viết theo file thôi anh ạ, không để ý tới nếu viết sai , chắc thêm on error nữa là được phải không anh!!
Vậy bạn cũng đâu biết thật sự điều gì đang diễn ra! Sao bạn không viết thêm 1 hàm kiểm tra sự tồn tại của tên sheet có phải êm chuyện không?
Hễ nhìn thấy lỗi thì phải bẫy cho bằng được! On Errorr... chỉ nên là biện pháp cuối cùng để phòng những tình huống ta chưa nghĩ ra hoặc cho 1 lỗi nào đó mà ta không tài nào bẫy được bằng cách khác
 
Upvote 0
On error là loại giải pháp nguy hiểm. Nó cho phép bạn lướt qua lỗi. Nhưng có chắc là ngừoi dùng muốn lướt qua lỗi hay không?
Tuỳ theo điều kiện yêu cầu.
Nếu yêu cầu "làm được mức nào hay mức đó" thì On Error sử dụng được.
Nếu yêu cầu "nếu không được cả thì để yên như cũ" thì On Error không thể sử dụng được.

Ví dụ tôi có một vài tên gõ sai. Và sau đó tôi chạy một cái sub dựa vào vị trí của sheets để làm việc thì kết quả của tôi sẽ sai bấy hết.
Vâng , như anh nói dùng On error .. thì đúng là không biết có lỗi hay không hay là lỗi ở đâu, có lẽ là biết lỗi chỗ nào thì khắc phục chỗ đấy sẽ ổn hơn!!!
 
Upvote 0
Vậy bạn cũng đâu biết thật sự điều gì đang diễn ra! Sao bạn không viết thêm 1 hàm kiểm tra sự tồn tại của tên sheet có phải êm chuyện không?
Hễ nhìn thấy lỗi thì phải bẫy cho bằng được! On Errorr... chỉ nên là biện pháp cuối cùng để phòng những tình huống ta chưa nghĩ ra hoặc cho 1 lỗi nào đó mà ta không tài nào bẫy được bằng cách khác
Trường hợp sheets(arr1(num1, 1)) thì em có thể dùng vòng lặp để xét cái arr1(num1, 1) có tồn tại trong các sheets.name của workbook hay không, nhưng trường hợp Sheets(arr1(num1, 2)) (với arr1(num1, 2) là number) thì em chưa nghĩ ra cách để bẫy lỗi trường hợp này anh ạ, anh có thể cho em một đoạn code kiểm tra trường hợp này được không ạ!!!
 
Upvote 0
Chưa


Em nghĩ sữa lại vầy là được:
PHP:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:B6]
For num2 = 1 To 2
    For num1 = 1 To UBound(arr1)
        Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
    Next num1
Next num2
Sheets("index").Select
End Sub

Vâng, em viết theo file thôi anh ạ, không để ý tới nếu viết sai , chắc thêm on error nữa là được phải không anh!!
Thêm 1 vòng lập For num2 = 1 To 2, mặc dù giải quyết được vấn đề, nhưng làm cho thuật toán trở nên khó hiểu, có vẽ ăn may chứ không dựa trên cơ sở phân tích tình huống và đưa ra giải thuật phù hợp
 
Upvote 0
Trường hợp sheets(arr1(num1, 1)) thì em có thể dùng vòng lặp để xét cái arr1(num1, 1) có tồn tại trong các sheets.name của workbook hay không, nhưng trường hợp Sheets(arr1(num1, 2)) (với arr1(num1, 2) là number) thì em chưa nghĩ ra cách để bẫy lỗi trường hợp này anh ạ, anh có thể cho em một đoạn code kiểm tra trường hợp này được không ạ!!!
số sheet = Sheets.Count
 
Upvote 0
Em nghĩ sữa lại vầy là được:
PHP:
Sub move()
Dim arr1, num1 As Long
arr1 = Sheets("index").[A2:B6]
For num2 = 1 To 2
    For num1 = 1 To UBound(arr1)
        Sheets(arr1(num1, 1)).move after:=Sheets(arr1(num1, 2))
    Next num1
Next num2
Sheets("index").Select
End Sub
Nếu bạn có thể chứng minh thuật toán đúng trong mọi trường hợp dữ liệu (hợp lệ) thì mới được. Không nên sử dụng một thuật toán chỉ vì chưa thấy nó sai. Trường hợp bạn đang nghiên cứu thì càng phải như vậy.
Khi xây dựng một thuật toán người ta phải lường trước và xử lý tất cả các trường hợp có thể xảy ra.
 
Upvote 0
------------------------
 
Lần chỉnh sửa cuối:
Upvote 0
----------------------
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom