- Tham gia
- 13/6/06
- Bài viết
- 4,737
- Được thích
- 10,243
- Giới tính
- Nam
- Nghề nghiệp
- Giáo viên, CEO tại Bluesofts
Để 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Đ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.
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 !!!Để 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 codeMã: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
Sao em nhìn code Anh, nhưng muốn học code Anh mà khó lắm Anh,Để 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 codeMã: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
Bạn phải hiểu thuật toán trướcSao 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.
Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
Còn dòng lệnh nữa này Anh? Em chưa hiểu?CStr(Arr1(i, 1))
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ỏCòn dòng lệnh nữa này Anh? Em chưa hiểu?PHP:Arr2(Arr1(i, 2)) = CStr(Arr1(i, 1))
từ CStr là từ viết tắt phải không Anh?
Em cảm ơn Anh,.
Chúc Anh ngày vui!
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é!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ỏ
Mình đã chuyển tên sheet thành chuỗi trước đó rồisheets 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
Làm chi cho lòng vòng vậy?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
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 IfLàm chi cho lòng vòng vậy?
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 đâuXế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
Mảng Arr1 lấy từ cột A và B chưa xếp thứ tự theo vị trí các sheetBấ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!
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ạiAnh 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
được 1 sheets thôi anh ạ: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 ý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
Vẫn chưa hình dung ra được sẽ sắp xếp thế nào! Bạn cho 1 ví dụ xemà! 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.à! 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