- 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
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.
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.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!!!
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
Cho bạn thêm cách: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!!!
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 đúngCho 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
có trường hợp bị sai sheet đầu cần bẩy sheet đầuEm chưa hiểu ý anh ta, em sếp thấy vẫn đúng !!!
ten sheet thứ tự
sheet1 2
sheet2 3
sheet3 1
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
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?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
Em nghĩ sữa lại vầy là được:có trường hợp bị sai sheet đầu cần bẩy sheet đầuMã: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
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!!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
...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?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â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!!!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.
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 ạ!!!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
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ợpChư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!!
số sheet = Sheets.CountTrườ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 ạ!!!
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.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