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
Đoạn code mọi người cho ở trên em chạy trên file VD làm ví dụ thì OK lắm nhưng khi chạy trên file thực tế cần làm thì nó lại chạy không ra thứ tự gì. Bác VietMini nói thế thành ra chả ai giúp em. Thực ra e mới biết sử dụng macro thôi chứ để viết ra nó thì em chưa biết. Chắc là bác thấy file em gửi lên có macro ở trong nên bác nghĩ em biết mà không chịu làm lại đi nhờ người khác phải không ạ. Huhu em chưa biết thuật toán trong đó là gì ạ. Mong các bác biết thông thạo rồi thì bớt chút thời gian giúp em vì em đang cần gấp, sau này em sẽ cố gắng học.
Để có câu trả lời chuẩn và nhanh, bạn nên gởi file giống thực tế, dữ liệu có thể giả định
Không chạy được do tên sheet là số
bạn dùng code
Mã:
Sub move()
Dim Arr1 As Variant, Arr2 As Variant, i As Long
Application.ScreenUpdating = False
Arr1 = Sheets("Index").Range("A2", Sheets("Index").Range("B" & Rows.Count).End(xlUp)).Value
ReDim Arr2(1 To UBound(Arr1))
For i = 1 To UBound(Arr1)
  Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Next i
On Error Resume Next
Sheets(Arr2(1)).move Before:=Sheets(1)
For i = 2 To UBound(Arr2)
    Sheets(Arr2(i)).move after:=Sheets(i - 1)
Next i
Sheets("index").Select
Application.ScreenUpdating = true
End Sub
 
Upvote 0
Để có câu trả lời chuẩn và nhanh, bạn nên gởi file giống thực tế, dữ liệu có thể giả định
Không chạy được do tên sheet là số
bạn dùng code
Mã:
Sub move()
Dim Arr1 As Variant, Arr2 As Variant, i As Long
Application.ScreenUpdating = False
Arr1 = Sheets("Index").Range("A2", Sheets("Index").Range("B" & Rows.Count).End(xlUp)).Value
ReDim Arr2(1 To UBound(Arr1))
For i = 1 To UBound(Arr1)
  Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Next i
On Error Resume Next
Sheets(Arr2(1)).move Before:=Sheets(1)
For i = 2 To UBound(Arr2)
    Sheets(Arr2(i)).move after:=Sheets(i - 1)
Next i
Sheets("index").Select
Application.ScreenUpdating = true
End Sub
Em cảm ơn bác nhiều nhiều !!!
 
Upvote 0
Để có câu trả lời chuẩn và nhanh, bạn nên gởi file giống thực tế, dữ liệu có thể giả định
Không chạy được do tên sheet là số
bạn dùng code
Mã:
Sub move()
Dim Arr1 As Variant, Arr2 As Variant, i As Long
Application.ScreenUpdating = False
Arr1 = Sheets("Index").Range("A2", Sheets("Index").Range("B" & Rows.Count).End(xlUp)).Value
ReDim Arr2(1 To UBound(Arr1))
For i = 1 To UBound(Arr1)
  Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Next i
On Error Resume Next
Sheets(Arr2(1)).move Before:=Sheets(1)
For i = 2 To UBound(Arr2)
Next i
Sheets("index").Select
Application.ScreenUpdating = true
End Sub
Sao em nhìn code Anh, nhưng muốn học code Anh mà khó lắm Anh,
Sheets(Arr2(1)).move Before:=Sheets(1)
Đoạn này em chưa hiểu lắm. Mong Ang chỉ dạy thêm.

Chúc Anh ngày vui.
 
Upvote 0
Sao em nhìn code Anh, nhưng muốn học code Anh mà khó lắm Anh,
Sheets(Arr2(1)).move Before:=Sheets(1)
Đoạn này em chưa hiểu lắm. Mong Ang chỉ dạy thêm.
Chúc Anh ngày vui.
Bạn phải hiểu thuật toán trước

Arr1 = Sheets("Index").Range("A2", Sheets("Index").Range("B" & Rows.Count).End(xlUp)).Value
Tạo mảng Arr1 có 2 cột, cột 1 là tên sheet, cột 2 là thứ tự các sheet mong muốn

ReDim Arr2(1 To UBound(Arr1))
For i = 1 To UBound(Arr1)
Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Next i
Tạo mảng Arr2 lưu tên sheet với thứ tự là thứ tự các sheet mong muốn, Arr2(1) là tên sheet ở vị trí 1, Arr(2) là tên sheet ở vị trí 2 ...

Đầu tiên phải đưa tên sheet ở vị trí 1 lên đầu các sheet
Sheets(Arr2(1)).move Before:=Sheets(1)

Sau đó mới xếp các sheet còn lại
For i = 2 To UBound(Arr2)
Sheets(Arr2(i)).move after:=Sheets(i - 1)
Next i
 
Upvote 0
PHP:
Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Còn dòng lệnh nữa này Anh? Em chưa hiểu?
từ CStr là từ viết tắt phải không Anh?
Em cảm ơn Anh,.
Chúc Anh ngày vui!
Lệnh Sheets(Arr2(i)), nếu Arr2(i) là số thì VBA hiểu là sheet thứ Arr2(i), nhưng mục tiêu là lấy tên sheet Arr2(i), do đó cần chuyển số thành chuỗi bằng hàm Cstr, còn có phải viết tắt hay không thì không rỏ
 
Upvote 0
Lệnh Sheets(Arr2(i)), nếu Arr2(i) là số thì VBA hiểu là sheet thứ Arr2(i), nhưng mục tiêu là lấy tên sheet Arr2(i), do đó cần chuyển số thành chuỗi bằng hàm Cstr, còn có phải viết tắt hay không thì không rỏ
Dạ, cái này em phải từ từ nghiên cứu thêm, có gì không hiểu em hỏi Anh nhé!

Cảm ơn Anh nhiều!
 
Upvote 0
sheets là một collection. Toán tử ( ) - dấu ngoặc - của loại collection này nhận 2 loại tham để truy trị. Nếu tham là số thì nó coi như là tìm theo chỉ số và truy theo vi trí. Nếu tham là chuỗi thì nó coi như là tìm theo tên.

Muón bảo đảm là tìm theo tên thì chỉ cần làm như sau - hàm CStr đổi số thành chuỗi:
Sheets(CStr(Arr2(1))).move Before:=Sheets(1)
For i = 2 To UBound(Arr2)
Sheets(CStr(Arr2(i))).move after:=Sheets(i - 1)
Next i
 
Upvote 0
sheets là một collection. Toán tử ( ) - dấu ngoặc - của loại collection này nhận 2 loại tham để truy trị. Nếu tham là số thì nó coi như là tìm theo chỉ số và truy theo vi trí. Nếu tham là chuỗi thì nó coi như là tìm theo tên.

Muón bảo đảm là tìm theo tên thì chỉ cần làm như sau - hàm CStr đổi số thành chuỗi:
Sheets(CStr(Arr2(1))).move Before:=Sheets(1)
For i = 2 To UBound(Arr2)
Sheets(CStr(Arr2(i))).move after:=Sheets(i - 1)
Next i
Mình đã chuyển tên sheet thành chuỗi trước đó rồi
For i = 1 To UBound(Arr1)
Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Next i
 
Upvote 0
Xếp thứ tự trước cho chắc ăn, khỏi phải mệt óc đoán các khả năng xảy ra để xét hàm If
Bất cứ 1 chuỗi (hay biến nào) mà muốn đưa vào làm tên sheet, bạn cứ cho nó vào hàm CStr() là xong chứ gì, đâu cần phải để ý nó là text hay number. Tức là xử lý ngay lúc đưa vào tên sheet chứ không phải thông qua 1 vòng lập lòng vòng thế kia đâu
Tôi thường làm vậy và thấy rất chắc ăn!
 
Upvote 0
Bất cứ 1 chuỗi (hay biến nào) mà muốn đưa vào làm tên sheet, bạn cứ cho nó vào hàm CStr() là xong chứ gì, đâu cần phải để ý nó là text hay number. Tức là xử lý ngay lúc đưa vào tên sheet chứ không phải thông qua 1 vòng lập lòng vòng thế kia đâu
Tôi thường làm vậy và thấy rất chắc ăn!
Mảng Arr1 lấy từ cột A và B chưa xếp thứ tự theo vị trí các sheet
Arr1 = Sheets("Index").Range("A2", Sheets("Index").Range("B" & Rows.Count).End(xlUp)).Value

Mình dùng mảng Arr2 với mục đích chủ yếu là xếp thứ tự
ReDim Arr2(1 To UBound(Arr1))
For i = 1 To UBound(Arr1)
Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Next i

Nếu lấy dữ liệu từ cột E đã xếp thứ tự rồi thì không cần dùng vòng lặp xếp thứ tự
 
Upvote 0
Anh Chị! cho em xin Macro xắp xếp codeName
kích 1 cái là xắp xếp codeName tăng dần. Em xin cảm ơn
 
Upvote 0
Anh Chị! cho em xin Macro xắp xếp codeName
kích 1 cái là xắp xếp codeName tăng dần. Em xin cảm ơn
Bạn thử di chuyển bằng tay sheet code name xem có được không? Nếu bằng tay làm được thì code VBA sẽ làm được và ngược lại
 
Upvote 0
Bạn thử di chuyển bằng tay sheet code name xem có được không? Nếu bằng tay làm được thì code VBA sẽ làm được và ngược lại
được 1 sheets thôi anh ạ:
Sheets("DS Fix").Move Before:=Sheets(1)
---------------------------------
Như này còn thiếu gì anh nhỉ
Sub Macro2()
Dim i As Long
For i = 1 To i
CodeName.Sheets(i).move Before:=Sheets(i + 1)
Next i
End Sub
Untitled.png


Untitled2.png
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn thử di chuyển bằng tay sheet code name xem có được không? Nếu bằng tay làm được thì code VBA sẽ làm được và ngược lại
à! em nói sai ý
Ý em muốn các sheets đang lộn xộn muốn xắp xếp về theo thứ tự của CodeName
 
Upvote 0
à! em nói sai ý
Ý em muốn các sheets đang lộn xộn muốn xắp xếp về theo thứ tự của CodeName
Nếu so sánh dạng text thì không sao, còn bạn muốn so sánh kiểu sheet1 < sheet2< sheet9 < sheet10 thì có nhiều trường hợp. Ví dụ code name của excel tiếng Việt là Trang_tính1·hoặc bạn có thể sửa codename thành abc chẳng hạn, cần giới hạn trong các codename được sinh ra tự động chưa sửa chữa thôi.
 
Upvote 0
Web KT
Back
Top Bottom