VBA hoán đổi vị trí các cột tăng dần . (1 người xem)

Liên hệ QC

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

nggiahoang

Thành viên hoạt động
Tham gia
18/5/13
Bài viết
167
Được thích
108
Thay đổi vị trí các cột của danh sách dữ liệu theo chiều tăng dần , sau mỗi lần nhấn nút chạy code .

Em gởi lên diễn đàn Giải Pháp Excel 1 danh sách với ít dòng và cột để nhờ ACE viết cho đoạn code , thực hiện việc hoán đổi chỗ của các cột theo điều kiện tăng dần từng cột từ sau ra trước theo chỉ định.
Chân thành cám ơn !
 

File đính kèm

Có lẽ việc hoán đổi các cột phải ngắt quãng nhiều lần đã vượt giới hạn của excel.Thôi thì anh chị vào giúp em thay đổi vị trí 1,2 cột ,rồi em sẽ tùy biến sau.Cám ơn !
 
Upvote 0
Thay đổi vị trí các cột của danh sách dữ liệu theo chiều tăng dần , sau mỗi lần nhấn nút chạy code .

Em gởi lên diễn đàn Giải Pháp Excel 1 danh sách với ít dòng và cột để nhờ ACE viết cho đoạn code , thực hiện việc hoán đổi chỗ của các cột theo điều kiện tăng dần từng cột từ sau ra trước theo chỉ định.
Chân thành cám ơn !

Ý bạn là:
1. Dịch dần cột đầu tiên của "vùng thay đổi", tức cột Toán ở thời điểm "chào buổi sáng", về cuối qua 6 lần nhấn Run
2. Lặp lại bước 1

Cứ thế cho tới ngày tận thế, hoặc mỏi tay, hoặc chán thì thôi? Có thể mọi người cho là trò vô bổ nên không ai quan tâm?

Mà thôi, bạn thử chơi code sau.

Mã:
Sub DaoChieu()
Static index As Long
Dim rng As Range, Arr
    index = (index + 1) Mod [B][COLOR=#ff0000]7[/COLOR][/B]
    If index = 0 Then index = 1
    Set rng = Range("[B][COLOR=#ff0000]E6:E16[/COLOR][/B]").Offset(, index)
    Arr = rng.Offset(, -1).Value
    rng.Copy Range("[B][COLOR=#ff0000]E6[/COLOR][/B]").Offset(, index - 1)
    rng.Value = Arr
End Sub

7 là số cột của "vùng thay đổi", sửa lại theo dữ liệu thực. Tương tự với E6:E16
 
Upvote 0
Thử record macro rồi sửa 1 tí:
PHP:
Sub MoveCol()
Set rng = Range("D6:AZ6").Find("Toán")
rng.Resize(12, 1).Cut
rng.Offset(0, 2).Insert Shift:=xlToRight
End Sub
 
Upvote 0
Thử record macro rồi sửa 1 tí:
PHP:
Sub MoveCol()
Set rng = Range("D6:AZ6").Find("Toán")
rng.Resize(12, 1).Cut
rng.Offset(0, 2).Insert Shift:=xlToRight
End Sub

Trích
RUN CODE LẦN 1: Cột Lý chuyển vào chỗ cột Toán ( cột E)
RUN CODE LẦN 2: Cột Hóa chuyển vào chỗ cột Toán
RUN CODE LẦN 3: Cột Sinh chuyển vào chỗ cột Toán
RUN CODE LẦN 4: Cột Tin chuyển vào chỗ cột Toán
RUN CODE LẦN 5: Cột Văn chuyển vào chỗ cột Toán
RUN CODE LẦN 6: Cột NN chuyển vào chỗ cột Toán
( tương tự cho đến khi hết các cột cần đổi ,thì quay lại từ đầu )

Tôi lại hiểu là:

1. "hết các cột cần đổi ,thì quay lại từ đầu" có nghĩa là có thể nhấn nút Run rất rất nhiều lần. Như thế thì cột Toán đi mãi về bên phải và "đào ngũ".

2. Tôi hiểu quay lại từ đầu có nghĩa là ta lặp lại các thao tác nhưng cột cần dịch lúc này là cột Lý do kết thúc "vòng trước" thì cột Lý là cột đầu tiên. Tất nhiên cái "quay lại từ đầu" tác giả không nói rõ nên chỉ đoán mò thôi.

Mà tôi thấy chạy MoveCol thì bảng tính giật giật như động kinh ấy.
 
Upvote 0
Hic, anh siw tom nói từ "đào ngũ" quá đúng. Tôi lại không để ý đến chỗ "quay lại từ đầu".

Để chữa cháy, và cứu vớt vụ giật đùng đùng, tôi sửa code như sau, với cell L1 là tên cột cần địch chuyển thí dụ copy "Lý" vào L1).

PHP:
Sub MoveCol()
Application.ScreenUpdating = False
Set rng = Range("D6:AZ6").Find([L1])
rng.Resize(12, 1).Cut
rng.Offset(0, 2).Insert Shift:=xlToRight
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Em cám ơn thầy Siwtom , thầy Ptm đã quan tâm và viết hộ code .Trong file em có dùng từ " hoán đổi vị trí " cho nên mới nói là quay lại từ đầu đó mà , trong bước làm thủ công của em thì đã thấy rõ là đâu có cột nào bị mất đâu.
 
Upvote 0
Hic, anh siw tom nói từ "đào ngũ" quá đúng. Tôi lại không để ý đến chỗ "quay lại từ đầu".

Để chữa cháy, và cứu vớt vụ giật đùng đùng, tôi sửa code như sau, với cell L1 là tên cột cần địch chuyển thí dụ copy "Lý" vào L1).
em lại hiểu là chủ topic muốn hoán đổi vị trí theo vòng tròn sư phụ
PHP:
Sub Doicot()
Application.ScreenUpdating = 0
Sheet1.Range("E6:E17").Cut
Range("A6").End(xlToRight).Offset(0, 1).Insert Shift:=xlToRight
Application.ScreenUpdating = 1
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chưa biết kết quả cuối cùng tác giả muốn gì, nhưng đại khái là tác giả muốn dịch chuyển cột Toán chẳng hạn, từng bước từng bước đến khi vừa ý thì ngưng. Sau đó dịch chuyển tiếp cột Lý, v.v...
 
Upvote 0
[ThongBao]Chưa biết kết quả cuối cùng tác giả muốn gì, nhưng đại khái là tác giả muốn dịch chuyển cột Toán chẳng hạn, từng bước từng bước đến khi vừa ý thì ngưng. Sau đó dịch chuyển tiếp cột Lý, v.v...[/ThongBao]

Đòng í là tác giả muốn dịch chuyển, nhưng không fải là 1 cột mà chí ít sẽ là 2 cột (tạm gán Name là "dịch chuyển") hay "di chuyển", lúc này sẽ là chuyển toàn bộ các cột(?)

Có lẽ mọi người đọc xong iêu cầu của tác giả đa số hiểu rằng chì dịch chuyển 2 cột 1 lần chạy macro mà thôi;

Mình cho rằng, sau khi các bạn đã giải chuyện dịch chuyển 2 cột thì lại được Ai đó có voi đòi tiên cho xem(!)

Còn chuyện tổng quát nhất của bài này sẽ là:

Số cột cần dịch chuyển là nhiều & có thể tăng hàng năm hay từng cấp học;

Dịch chuyển & cả di chuyển theo cả hai chiều xuôi & ngược (4 trường hợp)

(Đó chưa còn là fịa ra chuyện dịch chuyển chỉ trong các môn cùng nhóm (Tự nhiên, Xã hội hay đánh giá xếp loại)

Lúc đó thì bài tổng quát sẽ gồm các bài fía trên

Vui thử đi các bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
test code

test code
Do em mô tả không kỹ lưỡng cho nên code chạy chưa đúng ý ; đích đến của các cột chính là cột E (E6:E16 )

LẦN 1: Cột Lý chuyển vào chỗ cột E ( E6 :E16 )
LẦN 2: Cột Hóa chuyển vào chỗ cột E ( E6 :E16 )
LẦN 3: Cột Sinh chuyển vào chỗ cột E ( E6 :E16 )
LẦN 4: Cột Tin chuyển vào chỗ cột E ( E6 :E16 )
LẦN 5: Cột Văn chuyển vào chỗ cột E ( E6 :E16 )
LẦN 6: Cột NN chuyển vào chỗ cột E ( E6 :E16 )



bấm tiếp , cột TOÁN ( k6 : k16 ) sẽ quay lên trên đầu ( cột E ) và cứ thế tiếp tục .....

@ code của thầy Ptm : em áp code cuối của thầy vào thì thấy " bất động ".
@ code của thầy Siwtom : Có thấy cột Toán nhảy đúng về phía bên phải cho đến cuối cùng của cột ( cột K6: K16 ) , nhưng sau đó không thấy nhảy vế lại từ đầu khi bấm tiếp , ngoài ra cột Lý sau khi chiếm chỗ cột E ở lần chạy code LAN 1 thì không nhường chỗ cho các cột khác nữa.Hic .

@code của LêDuy Thương : em chỉ mới tải vềchưa test , chiều này e sẽ báo cáo tình hình.
 

File đính kèm

Upvote 0
test code
Do em mô tả không kỹ lưỡng cho nên code chạy chưa đúng ý ; đích đến của các cột chính là cột E (E6:E16 )

LẦN 1: Cột Lý chuyển vào chỗ cột E ( E6 :E16 )
LẦN 2: Cột Hóa chuyển vào chỗ cột E ( E6 :E16 )
LẦN 3: Cột Sinh chuyển vào chỗ cột E ( E6 :E16 )
LẦN 4: Cột Tin chuyển vào chỗ cột E ( E6 :E16 )
LẦN 5: Cột Văn chuyển vào chỗ cột E ( E6 :E16 )
LẦN 6: Cột NN chuyển vào chỗ cột E ( E6 :E16 )



bấm tiếp , cột TOÁN ( k6 : k16 ) sẽ quay lên trên đầu ( cột E ) và cứ thế tiếp tục .....
.

Mình hỏi ngoài lề chút: Hổng biết "nhảy tới nhảy lui" rồi "đi lùi đi tới" (như tiểu đoàn 307) thế để làm gì nhỉ?
Ý tôi muốn hỏi MỤC ĐÍCH
 
Upvote 0
Cha này toàn làm chuyện nữa vời

LẦN 1: Cột Lý chuyển vào chỗ cột E ( E6 :E16 )
LẦN 2: Cột Hóa chuyển vào chỗ cột E ( E6 :E16 )
LẦN 3: Cột Sinh chuyển vào chỗ cột E ( E6 :E16 )
LẦN 4: Cột Tin chuyển vào chỗ cột E ( E6 :E16 )
LẦN 5: Cột Văn chuyển vào chỗ cột E ( E6 :E16 )
LẦN 6: Cột NN chuyển vào chỗ cột E ( E6 :E16 )

Cứ điệp khúc Cột {Này,kia} chuyển vô cột [E] nhai hoài không chán
(Người khác hay tiếng Việt, nhai 3 lần chán ốm rồi!)

Nhưng cái quan trọng là trước khi "nhảy" đó, dữ liệu hiện ở cột [E] đó fải chuyển đi đâu?

Bạn mà dạy văn chắc chết hết học sinh! Nên xin chuyển làm giáo vụ đi bạn!
 
Upvote 0
@Thầy Ptm :e mới vừa copy thử 1 cột nào đó trong bảng và chạy code thì thấy đã dịch chuyển , nếu như cái cột copy đó mà nhảy ra chỗ cột E thì hay quá vì e sẽ chủ động muốn cột nào ra thay chỗ cột E thì chọn ngay ,không phải nhấn liền tù tì .... phải chăng khi thầy bố trí cột L là muốn dùng nút chọn cột để copy ra đây trước khi chạy code ? Cám ơn thầy !

@Thầy ndu : em dùng mốc cột E làm chuẩn tham chiếu đến nút validation động ở sheet khác mà thống kê từng khối trên 1 danh sách chung của toàn trường , ngoài ra cũng dùng nó làm file thu tiền các khoản đầu năm sắp tới....

@ Bac SA_DQ : bác tải file dao cot lan 2 sẽ thấy các cột khác đi đâu về đâu ?

@ Lê Duy Thương : em đã test code , tuy chưa đúng như ý " file dao cot lần 2 " , nhưng cách này cũng đã đạt yêu cầu em đề ra .Cám ơn bác rất nhiều !
 
Upvote 0
@Thầy ndu : em dùng mốc cột E làm chuẩn tham chiếu đến nút validation động ở sheet khác mà thống kê từng khối trên 1 danh sách chung của toàn trường , ngoài ra cũng dùng nó làm file thu tiền các khoản đầu năm sắp tới....

Vậy thì thay đổi công thức cho validation hợp lý là được, dùng offset theo môn (thứ 1,2,..k) cần chọn (sao phải sửa thứ tự gốc dữ liệu làm chi cho KHỔ???)
 
Upvote 0
@Thầy Ptm :e mới vừa copy thử 1 cột nào đó trong bảng và chạy code thì thấy đã dịch chuyển , nếu như cái cột copy đó mà nhảy ra chỗ cột E thì hay quá vì e sẽ chủ động muốn cột nào ra thay chỗ cột E thì chọn ngay ,không phải nhấn liền tù tì .... phải chăng khi thầy bố trí cột L là muốn dùng nút chọn cột để copy ra đây trước khi chạy code ? Cám ơn thầy !
Bản chất của thuật toán bạn đề nghị nó là như thế: chạy code 1 lần, dịch chuyển cột (đã chọn) ra sau 1 bước. Giả sử cột E đang là toán, và muốn cột Lý ở vị trí khác về E, thì phải dời lần lượt toán, hóa, ... đi. không có vụ dịch chuyển lùi ra trước.

Nếu bạn chỉ cần muốn 1 thứ tự khác, chẳng thà bạn đưa ra cái thứ tự khác đó, tôi làm 1 cái đùng ra luôn kết quả, khỏi chạy code nhiều lần.

Ngoài ra, bạn xem lại bài của vodoi2x, nếu mục đích cuối cùng của bạn là validation thì chỉ cần sửa công thức validation, cần gì sắp thứ tự lại?
 
Lần chỉnh sửa cuối:
Upvote 0
Thí dụ bạn muốn thứ tự cột là 2, 5, 4, 7, 3, 1, 6 thì gõ vào dòng dưới cùng, rồi chạy code này, 1 phát ra kết quả.
Tôi đang ghi kết quả vào ô E20 để bạn có thể kiểm chứng, muốn chép vào chỗ cũ thì sửa E20 thành E6

PHP:
Sub Reorder()
Dim SArr, RArr
Dim Rws As Long, Cols As Long
SArr = Sheet1.[E6:K17].Value
Rws = UBound(SArr, 1): Cols = UBound(SArr, 2)
ReDim RArr(1 To Rws, 1 To Cols)
For i = 1 To Rws
    For j = 1 To Cols
        RArr(i, SArr(Rws, j)) = SArr(i, j)
    Next
Next
Sheet1.[e20].Resize(Rws, Cols) = RArr
End Sub
 

File đính kèm

Upvote 0
test code
Do em mô tả không kỹ lưỡng cho nên code chạy chưa đúng ý ; đích đến của các cột chính là cột E (E6:E16 )

LẦN 1: Cột Lý chuyển vào chỗ cột E ( E6 :E16 )
LẦN 2: Cột Hóa chuyển vào chỗ cột E ( E6 :E16 )
LẦN 3: Cột Sinh chuyển vào chỗ cột E ( E6 :E16 )
LẦN 4: Cột Tin chuyển vào chỗ cột E ( E6 :E16 )
LẦN 5: Cột Văn chuyển vào chỗ cột E ( E6 :E16 )
LẦN 6: Cột NN chuyển vào chỗ cột E ( E6 :E16 )



bấm tiếp , cột TOÁN ( k6 : k16 ) sẽ quay lên trên đầu ( cột E ) và cứ thế tiếp tục .....

@ code của thầy Ptm : em áp code cuối của thầy vào thì thấy " bất động ".
@ code của thầy Siwtom : Có thấy cột Toán nhảy đúng về phía bên phải cho đến cuối cùng của cột ( cột K6: K16 ) , nhưng sau đó không thấy nhảy vế lại từ đầu khi bấm tiếp , ngoài ra cột Lý sau khi chiếm chỗ cột E ở lần chạy code LAN 1 thì không nhường chỗ cho các cột khác nữa.Hic .

@code của LêDuy Thương : em chỉ mới tải vềchưa test , chiều này e sẽ báo cáo tình hình.

Tại bạn không miêu tả rõ thôi.

Bạn viết trong tập tin:
RUN CODE LẦN 1: Cột Lý chuyển vào chỗ cột Toán ( cột E)
RUN CODE LẦN 2: Cột Hóa chuyển vào chỗ cột Toán
RUN CODE LẦN 3: Cột Sinh chuyển vào chỗ cột Toán
RUN CODE LẦN 4: Cột Tin chuyển vào chỗ cột Toán
RUN CODE LẦN 5: Cột Văn chuyển vào chỗ cột Toán
RUN CODE LẦN 6: Cột NN chuyển vào chỗ cột Toán

Trong giải thích trên thì bạn không nói cột Toán sẽ đi đâu. Mà sau lần 1 thì Toán và Lý không thể cùng ở cột E được nên tôi cho là cột Toán sẽ phải đi vào F6:F16 là chỗ mà cột Lý vừa giải phóng. Nếu thế thì phải hiểu
RUN CODE LẦN 2: Cột Hóa chuyển vào chỗ cột Toán

là cột Hóa chuyển vào F6:F16, vì sau lần 1 thì cột Toán ở F6:F16 cơ mà?

Bây giờ bạn mới nóí:
LẦN 1: Cột Lý chuyển vào chỗ cột E ( E6 :E16 )
LẦN 2: Cột Hóa chuyển vào chỗ cột E ( E6 :E16 )
LẦN 3: Cột Sinh chuyển vào chỗ cột E ( E6 :E16 )
LẦN 4: Cột Tin chuyển vào chỗ cột E ( E6 :E16 )
LẦN 5: Cột Văn chuyển vào chỗ cột E ( E6 :E16 )
LẦN 6: Cột NN chuyển vào chỗ cột E ( E6 :E16 )

Tức cứ mỗi lần bấm thì cột tiếp theo LUÔN nhẩy vào E6:E16. Vào E6:E16 khác với "vào chỗ cột Toán".

Nhưng bạn vẫn không nói cột Toán sẽ di chuyển thế nào.

Tôi hiểu là sau khi bấm Run code lần 1 thì có thứ tự các cột là:

Mã:
Lý, Toán, Hóa, Sinh, Tin, Văn, NN

Bạn hãy điền thứ tự các cột sau lần bấm 2, 3, 4, 5, 6, 7

Nếu bạn điền tiếp được thứ tự các cột sau lần bấm 2, 3, 4, 5, 6, 7 thì ta chơi tiếp. Bằng không thì dọn đồ chơi ở đây. Bởi tôi không chơi trò "đoán ý đồng đội" nữa.
 
Upvote 0
Mình hỏi ngoài lề chút: Hổng biết "nhảy tới nhảy lui" rồi "đi lùi đi tới" (như tiểu đoàn 307) thế để làm gì nhỉ?
Ý tôi muốn hỏi MỤC ĐÍCH

Nếu tôi nhớ không lầm thì: "... ai đã từng nghe tiếng Tiểu đoàn, tiếng Tiểu đoàn ba trăm lẻ bẩy ..."
 
Upvote 0
Web KT

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

Back
Top Bottom