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
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óí:
...
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".
Tôi cũng "bị" hiểu như anh siwtom, nên tôi cứ lớn tiếng rằng "dịch chuyển qua phải 1 cột", vì cột Toán sau khi chạy code thì đã không còn ở E nữa rồi. Cứ mỗi lần chạy thì thằng "Toán" lại bị chiếm chỗ, cứ thế Toán lại phải chạy đến khi "đào ngũ".

Cuối cùng tôi chạy code theo kiểu tác giả làm bằng tay trong chú thích trong file.

Tôi cũng không gọi là dịch chuyển, đảo, hoán đổi, hay move nữa. Tôi gọi là sắp xếp lại.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thử phát biểu như sau:

"Tôi có 7 bộ môn trong 7 cột từ E tới K. Thứ tự ban đầu là: Toán, Lý, Hóa, Sinh, Tin, Văn, NN. Tôi muốn sau mỗi lần nhấn nút thì trong các cột từ E tới K các bộ môn sẽ có thứ tự như sau:
Mã:
LẦN 1: Lý, Toán, Hóa, Sinh, Tin, Văn, NN
LẦN 2: Hóa, Lý, Toán, Sinh, Tin, Văn, NN
LẦN 3: Sinh, Hóa, Lý, Toán, Tin, Văn, NN
LẦN 4: Tin, Sinh, Hóa, Lý, Toán, Văn, NN
LẦN 5: Văn, Tin, Sinh, Hóa, Lý, Toán, NN
LẦN 6: NN, Văn, Tin, Sinh, Hóa, Lý, Toán
LẦN 7: trở về thứ tự ban đầu

cứ như thế lặp lại"

Tôi phát biểu như thế có đúng không? Nếu đúng thì lần sau thay vì phát biểu "nhẩy" với "hoán vi" hoặc một loạt mũi tên hay "Tiểu đoàn 307" thì cứ bắt chước như thế. Tức liệt kê ra các kết quả cần có. Thế thôi.

Mã:
Sub DaoChieu()
Static index As Long
Static source
Dim rng As Range, Arr, off As Long, width As Long
    If IsEmpty(source) Then source = Range("E6:K16").Value
    index = (index + 1) Mod 7
    If index = 0 Then
        Range("E6:K16").Value = source
    Else
        Set rng = Range("E6:E16").Resize(, index)
        Arr = Range("E6:E16").Offset(, index).Value
        rng.Copy Range("F6")
        Range("E6:E16").Value = Arr
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi thử phát biểu như sau:

"Tôi có 7 bộ môn trong 7 cột từ E tới K. Thứ tự ban đầu là: Toán, Lý, Hóa, Sinh, Tin, Văn, NN. Tôi muốn sau mỗi lần nhấn nút thì trong các cột từ E tới K các bộ môn sẽ có thứ tự như sau:
Mã:
LẦN 1: Lý, Toán, Hóa, Sinh, Tin, Văn, NN
LẦN 2: Hóa, Lý, Toán, Sinh, Tin, Văn, NN
LẦN 3: Sinh, Hóa, Lý, Toán, Tin, Văn, NN
LẦN 4: Tin, Sinh, Hóa, Lý, Toán, Văn, NN
LẦN 5: Văn, Tin, Sinh, Hóa, Lý, Toán, NN
LẦN 6: NN, Văn, Tin, Sinh, Hóa, Lý, Toán
LẦN 7: trở về thứ tự ban đầu

cứ như thế lặp lại"

Tôi phát biểu như thế có đúng không? Nếu đúng thì lần sau thay vì phát biểu "nhẩy" với "hoán vi" hoặc một loạt mũi tên hay "Tiểu đoàn 307" thì cứ bắt chước như thế. Tức liệt kê ra các kết quả cần có. Thế thôi.

Mã:
Sub DaoChieu()
Static index As Long
Static source
Dim rng As Range, Arr, off As Long, width As Long
    If IsEmpty(source) Then source = Range("E6:K16").Value
    index = (index + 1) Mod 7
    If index = 0 Then
        Range("E6:K16").Value = source
    Else
        Set rng = Range("E6:E16").Resize(, index)
        Arr = Range("E6:E16").Offset(, index).Value
        rng.Copy Range("F6")
        Range("E6:E16").Value = Arr
    End If
End Sub


Vâng ! em xin rút kinh nghiệm cho những lần sau .

E cám ơn các bác đã vào giúp e ! nhất là bác Lê Duy Thương đã đáp ứng đúng và đầy đủ vấn đề em yêu cầu và đặc biệt nhất là thầy Siwtom , thầy Ptm người " phát pháo" đầu tiên sau cùng cho đề tài này , không có 2 thầy thì có lẽ em còn phải chờ dài cổ ấy chứ .
Người ta thường nói " được voi đòi tiên " , trước khi có voi của bác LDT để cỡi thì em đã gặp tiên rồi ( code của thầy Siwtom, thầy Ptm ) ,em sẽ vận dụng vào những trường hợp khác như gợi ý của bác Chanh _TQ.
Chân thành cám ơn tất cả !
 
Upvote 0
Tôi thử phát biểu như sau:

"Tôi có 7 bộ môn trong 7 cột từ E tới K. Thứ tự ban đầu là: Toán, Lý, Hóa, Sinh, Tin, Văn, NN. Tôi muốn sau mỗi lần nhấn nút thì trong các cột từ E tới K các bộ môn sẽ có thứ tự như sau:
Mã:
LẦN 1: Lý, Toán, Hóa, Sinh, Tin, Văn, NN
LẦN 2: Hóa, Lý, Toán, Sinh, Tin, Văn, NN
LẦN 3: Sinh, Hóa, Lý, Toán, Tin, Văn, NN
LẦN 4: Tin, Sinh, Hóa, Lý, Toán, Văn, NN
LẦN 5: Văn, Tin, Sinh, Hóa, Lý, Toán, NN
LẦN 6: NN, Văn, Tin, Sinh, Hóa, Lý, Toán
LẦN 7: trở về thứ tự ban đầu
cứ như thế lặp lại"
Tôi phát biểu như thế có đúng không? Nếu đúng thì lần sau thay vì phát biểu "nhẩy" với "hoán vi" hoặc một loạt mũi tên hay "Tiểu đoàn 307" thì cứ bắt chước như thế. Tức liệt kê ra các kết quả cần có. Thế thôi.

Thế này thì cũng nguy bác siwtom ah,

nếu code tehees, trước khi ghi file lại thì phải đưa về trạng thái đúng thứ tự Toán, Lý, Hóa, Sinh, Tin, Văn, NN -- vì nếu không thì sẽ khi bấm lần 7 thì nó CHỈ trở về trang thái file khi mở mà thôi (tức là không trở lại đúng thứ tự trên)

không rõ có phải không (đoán đại theo code, chưa test)
 
Upvote 0
Thế này thì cũng nguy bác siwtom ah,

nếu code tehees, trước khi ghi file lại thì phải đưa về trạng thái đúng thứ tự Toán, Lý, Hóa, Sinh, Tin, Văn, NN -- vì nếu không thì sẽ khi bấm lần 7 thì nó CHỈ trở về trang thái file khi mở mà thôi (tức là không trở lại đúng thứ tự trên)

không rõ có phải không (đoán đại theo code, chưa test)

Tôi cũng nghĩ tới điều đó nhưng tôi không chơi trò "thông tin nhỏ giọt". Cũng có thể người ta muốn:
1. Khi mở tập tin thì các cột phải theo thứ tự Toán, Lý, Hóa, Sinh, Tin, Văn, NN
Lúc này chơi bình thường

2. Khi mở tập tin thì các cột có thứ tự như lúc ghi lần cuối. vd. Lý, Toán, Hóa, Sinh, Tin, Văn, NN
nhưng nếu nhấn Run code thì sẽ dịch chuyển thành Hóa, Lý, Toán, Sinh, Tin, Văn, NN, tức "chơi" tiếp lần trước - cột Toán luôn là cột đi dần về cuối rồi nhẩy bước dài về đầu

3. Khi mở tập tin thì các cột có thứ tự như lúc ghi lần cuối. vd. Lý, Toán, Hóa, Sinh, Tin, Văn, NN
Cột nào ở đầu thì sẽ có vai trò như cột Toán, tức cột đó sẽ dần về cuối và nhấn lần thứ bẩy thì cột đó (vd. Lý) lại nhẩy về đầu

Người ta không nói ra thì người ta "thiệt thòi" chứ chả nhẽ tôi lường được 3 trường hợp thì tôi viết 3 code?

Bạn và tôi làm sao biết được người hỏi có trường hợp nào trong 3 trường hợp trên.
Thực ra th 2 thì cũng là th 1 nhưng lúc đó tôi sẽ nhớ vị trí cột Toán không phải trong biến index mà sẽ nhớ trên sheet sau đó đọc vào index khi mở tập tin. Như thế thì nhấn nút là "chơi" tiếp lần trước.
 
Lần chỉnh sửa cuối:
Upvote 0
Cuối cùng tác giả xin rút kinh nghiệm lần sau, còn lần này thì kệ, mấy "thầy" đoán hay không đoán cũng xong rồi, không giải thích.
Riêng tôi thì thắc mắc tại sao Lê Duy thương lại đúng, và nếu LDT đúng thì giống thế nào so với làm tay (ghi chú trong file)?
 
Upvote 0
cuối cùng tác giả xin rút kinh nghiệm lần sau, còn lần này thì kệ, mấy "thầy" đoán hay không đoán cũng xong rồi, không giải thích.
Riêng tôi thì thắc mắc tại sao lê duy thương lại đúng, và nếu ldt đúng thì giống thế nào so với làm tay (ghi chú trong file)?
chắc do chủ topic giải thích không đúng .hoặc không biết đặt câu hỏi. Hên thì trúng thôi chứ làm sao em biết tại sao sư phụ.
ẹc ẹc
 
Upvote 0
Cuối cùng tác giả xin rút kinh nghiệm lần sau, còn lần này thì kệ, mấy "thầy" đoán hay không đoán cũng xong rồi, không giải thích.
Riêng tôi thì thắc mắc tại sao Lê Duy thương lại đúng, và nếu LDT đúng thì giống thế nào so với làm tay (ghi chú trong file)?

Tối qua loay hoay mãi với code của thầy Siwtom cấp cho lần cuối , gán hoài nút lệnh “ run code “ không xong ; cuối cùng đành phải lấy file của bác Lê Duy Thương ra xóa code và dán vào thì mới bấm được và sau đó lưu lại tên file mới.

Ngồi ở ngoài tiệm nét , các máy toàn xài EX 2010 , em không rành cách sử dụng nên phải lưu USB rồi về nhà test thử trên EX2003. Chính vì lý do trên mà file của bác LDT em cho là đáp ứng đúng ( code chuyển các cột về cột E và quay lại như yêu cầu ) và đủ vì bác ấy đã tạo cho nút run code của e đưa lên ở bài #1 chạy được ; riêng với các đoạn code của 2 thầy thì em phải bấm ALT+F8 + enter để test từng lần một.

Thầy Siwtom góp ý cho em về cách trình bày là rất đúng và gọn gàng nữa so với cách mô tả dài dòng của e khiến cho người đọc hiểu lầm , nên em mới nói là sẽ rút kinh nghiệm cho những lần sau là vậy.

p/s : những gì thuộc về VBA thì em dốt lắm các bác thông cảm cho , chỉ biết rằng cái gì làm bằng tay được thì VBA sẽ làm được mà hay hơn rất nhiều .
 
Upvote 0
tối qua loay hoay mãi với code của thầy siwtom cấp cho lần cuối , gán hoài nút lệnh “ run code “ không xong ; cuối cùng đành phải lấy file ....
P/s : Những gì thuộc về vba thì em dốt lắm các bác thông cảm cho , chỉ biết rằng cái gì làm bằng tay được thì vba sẽ làm được mà hay hơn rất nhiều .
gán code thì right click vào nút button---> assign macro--thấy 1 bảng xuất hiện các sub. Muốn chọn cái nào đó thì chọn
 
Upvote 0
Mấy hôm nay khá bận nên e không vào mạng được, giờ e vào nhờ 2 thầy đây :

Code Thầy Ptm :

code cuối của thầy Ptm ,e gõ sheet1 .E20 thành sheet 2 .E6 đã hoạt động tốt . Chỉ có điều hơi bất tiện là phải cuộn màn hình đến dòng cuối của ds dài và phải gõ nhập bằng tay trước khi nhấn nút , có thể tự động hóa khâu này được không thầy Ptm ?

Code Thầy Siwtom :

Nhấn nút chạy đủ 6 lần nhấn code , rồi bấm tiếp lần 7 thì quay lại từ đầu ! Tuy nhiên nếu chạy mới 4 lần mà lưu ( do e đi ăn cơm ) , lần sau quay vào thì cột toán sẽ kg đi tiếp nữa đến cột cuối cùng của bảng.

Vậy phiền thầy sửa lại code : cứ sau mỗi lần nhấn nút thì copy cả bảng từ E6: K16 của sheet1 sang sheet 2 tại ô E6:K16 ( giống như của thầy Ptm)

Lý do :
a/ dữ liệu gốc của em ở sheet1 sẽ không bị thay đổi.
b/ Nhần nút ở lần thứ bao nhiêu ,lưu file bất cứ lúc nào thì cũng không sao cả .
 
Upvote 0
Mấy hôm nay khá bận nên e không vào mạng được, giờ e vào nhờ 2 thầy đây :

Code Thầy Ptm :

code cuối của thầy Ptm ,e gõ sheet1 .E20 thành sheet 2 .E6 đã hoạt động tốt . Chỉ có điều hơi bất tiện là phải cuộn màn hình đến dòng cuối của ds dài và phải gõ nhập bằng tay trước khi nhấn nút , có thể tự động hóa khâu này được không thầy Ptm?
Vậy thì gõ thứ tự đó trên đầu, trên dòng toán lý hóa.

Tự động thế nào được khi tôi không biết bạn muốn gì, vì tôi cũng như anh siwtom vẫn đang yêu cầu bạn liệt kê kết quả từng lần bấm và kết quả cuối cùng.
Nhắc lại ý của tôi bài trên là: Bạn chỉ hứa rút kinh nghiệm lần sau, còn lần này vẫn chưa nói rõ yêu cầu cuối cùng, hoặc liệt kê kết quả. Tất cả các bài trả lời bên trên toàn là phải đoán, và không biết đúng hay không.
 
Upvote 0
Mấy hôm nay khá bận nên e không vào mạng được, giờ e vào nhờ 2 thầy đây :

Code Thầy Ptm :

code cuối của thầy Ptm ,e gõ sheet1 .E20 thành sheet 2 .E6 đã hoạt động tốt . Chỉ có điều hơi bất tiện là phải cuộn màn hình đến dòng cuối của ds dài và phải gõ nhập bằng tay trước khi nhấn nút , có thể tự động hóa khâu này được không thầy Ptm ?

Code Thầy Siwtom :

Nhấn nút chạy đủ 6 lần nhấn code , rồi bấm tiếp lần 7 thì quay lại từ đầu ! Tuy nhiên nếu chạy mới 4 lần mà lưu ( do e đi ăn cơm ) , lần sau quay vào thì cột toán sẽ kg đi tiếp nữa đến cột cuối cùng của bảng.

Vậy phiền thầy sửa lại code : cứ sau mỗi lần nhấn nút thì copy cả bảng từ E6: K16 của sheet1 sang sheet 2 tại ô E6:K16 ( giống như của thầy Ptm)

Lý do :
a/ dữ liệu gốc của em ở sheet1 sẽ không bị thay đổi.
b/ Nhần nút ở lần thứ bao nhiêu ,lưu file bất cứ lúc nào thì cũng không sao cả .

Bạn ạ, tôi không chơi trò "thông tin nhỏ giọt".
Ngay như ở bài #25 tôi có liệt kê ra 3 trường hợp mà bạn cũng chả thèm nói bạn muốn trường hợp nào. Hay bạn muốn trường hợp 4, 5 nào đó, cũng chả thấy nói.

Bạn nói Toán không đi tiếp. Thì tôi có biết bạn muốn thế nào đâu để mà "chiều"?
 
Upvote 0
Một chuyện quan trọng nữa là:
Giữa 2 lần bấm bạn có làm việc khác không, việc đó có liên quan đến kết quả sau khi bấm không, việc đó có mât thời gian nhiều không. Hay là bạn bấm liên tục 3, 4 cái cho đến khi vừa ý mới ngưng bấm và xử lý kết quả sau khi bấm.

Bởi vì giữa 2 lần bấm mà làm việc khác 30 phút, 6 lần là 3 giờ, nghĩa là code phải treo ở đâu đó trong bộ nhớ 1 giá trị liên quan đến "số lần đã bấm" trong 3 giờ. Trong 3, 4 giờ đó bạn đi ăn cơm, đi tiểu, ngủ trưa, máy cũng phải lưu trữ cái của nợ đó cho bạn.
 
Upvote 0
Vậy thì gõ thứ tự đó trên đầu, trên dòng toán lý hóa.

Tự động thế nào được khi tôi không biết bạn muốn gì, vì tôi cũng như anh siwtom vẫn đang yêu cầu bạn liệt kê kết quả từng lần bấm và kết quả cuối cùng.
Nhắc lại ý của tôi bài trên là: Bạn chỉ hứa rút kinh nghiệm lần sau, còn lần này vẫn chưa nói rõ yêu cầu cuối cùng, hoặc liệt kê kết quả. Tất cả các bài trả lời bên trên toàn là phải đoán, và không biết đúng hay không.


Vậy thì gõ thứ tự đó trên đầu, trên dòng toán lý hóa. Vâng em sẽ test lại và báo lại thầy sau .

Kết quả là các cột đã di chuyển ra cột E sau mỗi lần nhấn nút , code của thầy đã đáp ứng yêu cầu của bài rồi mà , em chỉ tùy biến 1 chút là thay vì copy kết quả xuống E20 thì đưa qua sheet2 .Tiện lợi của cách này là muốn cột nào cần ra cột E thì gõ STT xắp xếp ( thực tế có những bàng ds khá là nhiều cột ). Kết quả cuối cùng của đề tài này thì thầy Siwtom đã liệt kê ra dùm em ở bài trên rồi đó thầy Ptm
 
Upvote 0
Một chuyện quan trọng nữa là:
Giữa 2 lần bấm bạn có làm việc khác không, việc đó có liên quan đến kết quả sau khi bấm không, việc đó có mât thời gian nhiều không. Hay là bạn bấm liên tục 3, 4 cái cho đến khi vừa ý mới ngưng bấm và xử lý kết quả sau khi bấm.

Bởi vì giữa 2 lần bấm mà làm việc khác 30 phút, 6 lần là 3 giờ, nghĩa là code phải treo ở đâu đó trong bộ nhớ 1 giá trị liên quan đến "số lần đã bấm" trong 3 giờ. Trong 3, 4 giờ đó bạn đi ăn cơm, đi tiểu, ngủ trưa, máy cũng phải lưu trữ cái của nợ đó cho bạn.


Trả lời cùng thầy là mỗi lần bấm nút thì em còn phải làm 1 số công việc cho bảng biểu khác , xem và in ra nữa rồi mới quay trở lại để nhấn tiếp cột khác .Em cũng không rành là code chạy lại chiếm bộ nhớ nhiều đến như vậy.Sau mỗi lần nhấn nút thì khoảng chừng 3 phút là xong. nếu phải đi đâu lâu thì em lưu file và tắt máy , lần kế tiếp thì mở file ra và tiếp tục công việc đang dang dở cho đến khi xong.
 
Upvote 0
Đây là code với số TT ghi bên trên dòng tiêu đề, tức là dòng 5. Code này áp dụng cho việc chỉ chạy 1 lần, giữa các lần chạy muốn làm gì thì làm, máy không phải lưu giữ cái gì giữa 2 lần chạy.

Mã:
[COLOR=#000000][COLOR=#0000BB]Sub Reorder[/COLOR][COLOR=#007700]()
[/COLOR][COLOR=#0000BB]Dim SArr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]RArr
Dim Rws [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Cols [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long
SArr [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Sheet1[/COLOR][COLOR=#007700].[[/COLOR][COLOR=#0000BB]E[/COLOR][/COLOR][COLOR=#ff0000]5[/COLOR][COLOR=#000000][COLOR=#007700]:[/COLOR][COLOR=#0000BB]K1[/COLOR][/COLOR][COLOR=#ff0000]6[/COLOR][COLOR=#000000][COLOR=#007700]].[/COLOR][COLOR=#0000BB]Value
Rws [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]UBound[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]): [/COLOR][COLOR=#0000BB]Cols [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]UBound[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700])
[/COLOR][COLOR=#0000BB]ReDim RArr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]1 To Rws[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1 To Cols[/COLOR][COLOR=#007700])
For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]1 To Rws
    [/COLOR][COLOR=#007700]For [/COLOR][COLOR=#0000BB]j [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]1 To Cols
        RArr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700]([/COLOR][/COLOR][COLOR=#ff0000]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700])) = [/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000BB]Next
Next
Sheet1[/COLOR][COLOR=#007700].[[/COLOR][COLOR=#0000BB]e[/COLOR][COLOR=#ff0000]5[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]Resize[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Rws[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Cols[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000BB]RArr
End Sub [/COLOR]

 
Upvote 0
Bạn ạ, tôi không chơi trò "thông tin nhỏ giọt".
Ngay như ở bài #25 tôi có liệt kê ra 3 trường hợp mà bạn cũng chả thèm nói bạn muốn trường hợp nào. Hay bạn muốn trường hợp 4, 5 nào đó, cũng chả thấy nói.

Bạn nói Toán không đi tiếp. Thì tôi có biết bạn muốn thế nào đâu để mà "chiều"?


Oan cho e quá ! em có nhỏ giọt thông tin đâu thầy .Code cuối cùng của thầy sau khi tạo nút nhấn ,em test thử thì thấy các cột đã di chuyển tuần tự như yêu cầu , nhần tiếp lần thứ 7 thì thấy quay trở lại như lúc đầu ,tuy các cột có đổi vị trí so với ds gốc nhưng điều này không sao vì kết quả được copy sang sheet2 :E6:K16.Cho nên mới phiền thầy sửa lại code giúp em khâu này

Còn trường hợp nhấn nút đến lần thứ 4 , em bận việc khác ( đi ăn cơm ) .nên lưu file và tắt máy ra ngoài khoảng 1g , quay trở lại mở máy làm tiếp thì thấy hiện tượng trên nên báo lại cho thầy biết.
 
Upvote 0
Đây là code với số TT ghi bên trên dòng tiêu đề, tức là dòng 5. Code này áp dụng cho việc chỉ chạy 1 lần, giữa các lần chạy muốn làm gì thì làm, máy không phải lưu giữ cái gì giữa 2 lần chạy.

Mã:
[COLOR=#000000][COLOR=#0000BB]Sub Reorder[/COLOR][COLOR=#007700]()
[/COLOR][COLOR=#0000BB]Dim SArr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]RArr
Dim Rws [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Cols [/COLOR][COLOR=#007700]As [/COLOR][COLOR=#0000BB]Long
SArr [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]Sheet1[/COLOR][COLOR=#007700].[[/COLOR][COLOR=#0000BB]E[/COLOR][/COLOR][COLOR=#ff0000]5[/COLOR][COLOR=#000000][COLOR=#007700]:[/COLOR][COLOR=#0000BB]K1[/COLOR][/COLOR][COLOR=#ff0000]6[/COLOR][COLOR=#000000][COLOR=#007700]].[/COLOR][COLOR=#0000BB]Value
Rws [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]UBound[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]): [/COLOR][COLOR=#0000BB]Cols [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]UBound[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]2[/COLOR][COLOR=#007700])
[/COLOR][COLOR=#0000BB]ReDim RArr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]1 To Rws[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1 To Cols[/COLOR][COLOR=#007700])
For [/COLOR][COLOR=#0000BB]i [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]1 To Rws
    [/COLOR][COLOR=#007700]For [/COLOR][COLOR=#0000BB]j [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000BB]1 To Cols
        RArr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700]([/COLOR][/COLOR][COLOR=#ff0000]1[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700])) = [/COLOR][COLOR=#0000BB]SArr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]i[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]j[/COLOR][COLOR=#007700])
    [/COLOR][COLOR=#0000BB]Next
Next
Sheet1[/COLOR][COLOR=#007700].[[/COLOR][COLOR=#0000BB]e[/COLOR][COLOR=#ff0000]5[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000BB]Resize[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]Rws[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]Cols[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000BB]RArr
End Sub [/COLOR]


Em cám ơn thầy nhiều ! mỗi code của mỗi thầy em đều vận dụng trong những trường hợp khác nhau được hết. cái code có cột "đảo ngũ " cũng có cái hay của nó đó thầy !
 
Upvote 0
Oan cho e quá ! em có nhỏ giọt thông tin đâu thầy .Code cuối cùng của thầy sau khi tạo nút nhấn ,em test thử thì thấy các cột đã di chuyển tuần tự như yêu cầu , nhần tiếp lần thứ 7 thì thấy quay trở lại như lúc đầu ,tuy các cột có đổi vị trí so với ds gốc nhưng điều này không sao vì kết quả được copy sang sheet2 :E6:K16.Cho nên mới phiền thầy sửa lại code giúp em khâu này

Còn trường hợp nhấn nút đến lần thứ 4 , em bận việc khác ( đi ăn cơm ) .nên lưu file và tắt máy ra ngoài khoảng 1g , quay trở lại mở máy làm tiếp thì thấy hiện tượng trên nên báo lại cho thầy biết.

Bạn vẫn không hiểu. Bạn chưa một lần nào phát biểu "trọn vẹn" yêu cầu. Kể cả các dịch chuyển trong 1 lần mở và yêu cầu thứ tự cột trong lần mở sau cũng như qui tắc chơi tiếp như thế nào.
Tôi đã bỏ công ra để xét 3 trường hợp, nhưng bạn vẫn không chịu chọn trường hợp nào. Bạn thấy oan à?
 
Upvote 0
Thưa thầy Siwtom ! cách lưu kết quả sang sheet2 và vẫn giữ nguyên gốc của ds lúc ban đầu chính là loại trừ tất cả mọi trường hợp rồi.

em xin gởi file em vừa mới test xong code của thầy Ptm cấp cho lần cuối của sáng nay cho dễ hình dung .
 

File đính kèm

Upvote 0
em xin gởi file em vừa mới test xong code của thầy Ptm cấp cho lần cuối của sáng nay cho dễ hình dung .

Sao bạn cứ đùn công việc cho người khác thế?
Tôi đã nói rồi: trong bài #25 tôi đã xét 3 trường hợp. Có trường hợp nào là trường hợp của bạn không? Nếu có thì đó là trường hợp nào? Nếu không thì phát biểu trọn vẹn yêu cầu.

Không đơn giản là "dễ hình dung". Tôi sẽ phải bỏ công ra tải tập tin về. Rồi phải đọc để hiểu ý tưởng của anh ptm0412. Rồi trên cơ sở đó "đoán" là yêu cầu của bạn như thế nào.

Bạn cố tình không phát biểu trọn vẹn yêu cầu, và cũng không chọn trường hợp nào của tôi? Chắc hẳn bạn cố tình vì tôi lặp lại cái "3 trường hợp" và "phát biểu trọn vẹn yêu cầu" mấy bài rồi mà vẫn không nhận được câu trả lời.

Chỉ một câu thôi mà bạn cố tình không nói ra? Bạn có lý do nào đó quan trọng à?
 
Lần chỉnh sửa cuối:
Upvote 0
Sao bạn cứ đùn công việc cho người khác thế?
...
Chỉ một câu thôi mà bạn cố tình không nói ra? Bạn có lý do nào đó quan trọng à?

Theo như tôi đã lượm lặt đây 1 câu, kia 1 câu thì ý của chủ topic thế này:

1. Code cuối cùng của anh siwtom đã liệt kê đúng các bước:
Kết quả cuối cùng của đề tài này thì thầy Siwtom đã liệt kê ra dùm em ở bài trên rồi đó thầy Ptm

2. Tác giả muốn nhờ anh siwtom sửa 1 chút như sau (mặc dù tôi trích nhưng tôi vẫn không hiểu tại sao copy sau khi chạy code lại bảo toàn được dữ liệu gốc)

Code Thầy Siwtom :
...
Vậy phiền thầy sửa lại code : cứ sau mỗi lần nhấn nút thì copy cả bảng từ E6: K16 của sheet1 sang sheet 2 tại ô E6:K16
Lý do :
a/ dữ liệu gốc của em ở sheet1 sẽ không bị thay đổi.
b/ Nhần nút ở lần thứ bao nhiêu ,lưu file bất cứ lúc nào thì cũng không sao cả .

3. Theo ý tôi là nếu tác giả muốn bảo toàn dữ liệu gốc, thì phải copy dữ liệu gốc sang sheet 2, và code mỗi lần nhấn sẽ xử lý trên sheet này. Khi tắt máy thì chạy lại từ đầu hay bắt đầu bước thứ mấy, thì nhấn 1 số lần liên tiếp cho đến khi đạt tình trạng trước khi tắt máy.
Nếu nói rõ hơn nữa, thì có khi vẫn có thể chạy tiếp được, vì ta có thể lưu số lần chạy xuống 1 ô nào đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo như tôi đã lượm lặt đây 1 câu, kia 1 câu thì ý của chủ topic thế này:
....
2. Tác giả muốn nhờ anh siwtom sửa 1 chút như sau (mặc dù tôi trích nhưng tôi vẫn không hiểu tại sao copy sau khi chạy code lại bảo toàn được dữ liệu gốc)
..
3. Theo ý tôi ......

Toàn thấy "theo tôi", "theo ý tôi" nghĩa là ptm0412 lại đoán lại suy đoán

Tôi hiểu ý siwtom muốn người hỏi phải tự đặt và hiểu yêu cầu, không phải người giúp (trả lời) suốt ngày đi đoán, hay lại phải bỏ thời gian đi đường vòng (đọc/ test code người khác) - đã là nhờ người khác giúp lại y.c họ thế này thế kia thì thật là lạ. Thậm chí nếu chúng ta đoán, chúng ta luận thì thử hỏi chắc gì đúng yêu cầu ý kiến hay là suy nghĩ của người hỏi.

Bài #25 trên siwtom trả lời ý kiến của tôi đã quét đầy đủ các trường hợp không hiểu nggiahoang có đọc bài đó không, mà cứ đề nghi siwtom chạy chỗ này đọc chỗ kia để luận ra ý của nggiahoang là sao???

Hãy để người hỏi phải tự hiểu và biết đặt và xác nhận yêu cầu của mình - dù lần này mất thời gian, nhưng lần sau (hoặc TV khác đọc) rút kinh nghiệm sẽ tốt hơn là những người trả lời cứ tranh nhau vội trả lời và suy đoán.
 
Lần chỉnh sửa cuối:
Upvote 0
Theo như tôi đã lượm lặt đây 1 câu, kia 1 câu thì ý của chủ topic thế này:

1. Code cuối cùng của anh siwtom đã liệt kê đúng các bước:


2. Tác giả muốn nhờ anh siwtom sửa 1 chút như sau (mặc dù tôi trích nhưng tôi vẫn không hiểu tại sao copy sau khi chạy code lại bảo toàn được dữ liệu gốc)



3. Theo ý tôi là nếu tác giả muốn bảo toàn dữ liệu gốc, thì phải copy dữ liệu gốc sang sheet 2, và code mỗi lần nhấn sẽ xử lý trên sheet này. Khi tắt máy thì chạy lại từ đầu hay bắt đầu bước thứ mấy, thì nhấn 1 số lần liên tiếp cho đến khi đạt tình trạng trước khi tắt máy.

Tôi vẫn không hiểu hoàn toàn. Nếu các cột trong sheet1 không thay đổi và dùng sheet2 để ghi lại thứ tự các cột trong mỗi "bước chơi - nhấn nút" thì cũng làm được. Nhưng câu hỏi là: Khi mở lại tập tin và nhấn nút thì sẽ chơi tiếp hay chơi lại từ đầu? Chơi lại từ đầu là chơi từ trạng thái các cột trong sheet1 và chơi tiếp là chơi từ trạng thái các cột trong sheet2?

Nếu là chơi tiếp từ trạng thái các cột trong sheet2 (và Toán luôn là cái đi về cuối rồi nhẩy lên đầu) thì nói 1 câu: Em copy cả bảng ban đầu sang sheet2. Bắt đầu từ bây giờ nhấn nút Run thì chơi trên sheet2 theo cách của trường hợp 2 ở bài #25. Nói ngắn gọn: "trường hợp 2 nhưng chơi trên sheet2"

Nhưng nếu bây giờ so với code của anh thì làm gì có "cột Toán đi dần về cuối"?. Code của anh làm việc khác cơ mà. Tức chọn thứ tự bất kỳ các cột và sắp xếp lại theo thứ tự đó. Code của tôi làm việc khác, tức thao tác như yêu cầu bài #22. Bắt tôi sửa code để vẫn làm việc như bài #22 nhưng lại gửi tập tin của anh? Khó hiểu quá.

Tôi muốn biết chắc chắn vì cái kiểu viết đi sửa lại ngại lắm.
--------------
Thôi thì làm lần cuối, đúng ý hay không tôi cũng kết thúc.

1. Ở lần mở tập tin lần đầu tiên ta có dữ liệu sheet1 và 2 như nhau
2. Chơi theo trường hợp 2 ở bài #25. Chơi khi nào mệt thì ghi lại tập tin.
3. Ở mỗi lần mở tiếp theo thì khi nhấn nút là "chơi tiếp" lần trước.
4. Chỉ chơi trên sheet2, tức các cột chỉ nhẩy múa trên sheet2
5. Tôi chuyển Button sang sheet2. Vì nếu cứ nhấn nút xong lại phải click sheet2 để xem rồi lại click sheet1 để nhấn nút, cứ như thế liên tục thì không phải trò chơi nữa mà là "cực hình"

Mã:
Sub DaoChieu()
Static index As Long
Static source As Range
Dim rng As Range, Arr
    If source Is Nothing Then Set source = Sheet1.[E6:K16]
    index = (Sheet2.[A1].Value + 1) Mod 7
    Sheet2.[A1].Value = index
    If index = 0 Then
        Sheet2.[E6:K16].Value = source.Value
    Else
        Set rng = Sheet2.[E6:E16].Resize(, index)
        Arr = Sheet2.[E6:E16].Offset(, index).Value
        rng.Copy Range("F6")
        Sheet2.[E6:E16].Value = Arr
    End If
End Sub

Nếu nói rõ hơn nữa, thì có khi vẫn có thể chạy tiếp được, vì ta có thể lưu số lần chạy xuống 1 ô nào đó.

Cái này tôi cũng đã nói ở bài #25 rồi mà.
Thực ra th 2 thì cũng là th 1 nhưng lúc đó tôi sẽ nhớ vị trí cột Toán không phải trong biến index mà sẽ nhớ trên sheet sau đó đọc vào index khi mở tập tin. Như thế thì nhấn nút là "chơi" tiếp lần trước.


Vấn đề không khó, cái khó là hiểu được ước muốn để mà "chiều".

@nggiahoang: lần sau bạn bạn phát biểu thật trọn vẹn và phát biểu tại một chỗ thôi. Không phải ở mỗi bài phát biểu một tí.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Toàn thấy "theo tôi", "theo ý tôi" nghĩa là ptm0412 lại đoán lại suy đoán

Tôi hiểu ý siwtom muốn người hỏi phải tự đặt và hiểu yêu cầu, không phải người giúp (trả lời) suốt ngày đi đoán, hay lại phải bỏ thời gian đi đường vòng (đọc/ test code người khác) - đã là nhờ người khác giúp lại y.c họ thế này thế kia thì thật là lạ. Thậm chí nếu chúng ta đoán, chúng ta luận thì thử hỏi chắc gì đúng yêu cầu ý kiến hay là suy nghĩ của người hỏi.

Bài #25 trên siwtom trả lời ý kiến của tôi đã quét đầy đủ các trường hợp không hiểu nggiahoang có đọc bài đó không, mà cứ đề nghi siwtom chạy chỗ này đọc chỗ kia để luận ra ý của nggiahoang là sao???

Hãy để người hỏi phải tự hiểu và biết đặt và xác nhận yêu cầu của mình - dù lần này mất thời gian, nhưng lần sau (hoặc TV khác đọc) rút kinh nghiệm sẽ tốt hơn là những người trả lời cứ tranh nhau vội trả lời và suy đoán.
Chủ đề này làm tôi nhớ lại chủ đề "chia quà" dài lê thê. Bạn đã bỏ ra 1 thời gian để "chia quà" hộ người hỏi nhưng bạn cũng đã bỏ ra 10 thời gian để hiểu được người hỏi muốn gì.

Mệt quá ...
 
Upvote 0
Bài #25 trên siwtom trả lời ý kiến của tôi đã quét đầy đủ các trường hợp không hiểu nggiahoang có đọc bài đó không, mà cứ đề nghi siwtom chạy chỗ này đọc chỗ kia để luận ra ý của nggiahoang là sao???

Hãy để người hỏi phải tự hiểu và biết đặt và xác nhận yêu cầu của mình - dù lần này mất thời gian, nhưng lần sau (hoặc TV khác đọc) rút kinh nghiệm sẽ tốt hơn là những người trả lời cứ tranh nhau vội trả lời và suy đoán.

Quả thực là trong bài đó tôi đã tiếp tục đoán.

Mỗi người có 1 cách ứng xử khác nhau, có thể siwtom muốn người hỏi trực tiếp nói ra, và phải nói cho đúng. Cách hành xử này hoàn toàn đúng, vì người hỏi đã đi làm thì đã là "người lớn", phải biết mình muốn gì, kết quả mong muốn là gì và phải diễn đạt cái mong muốn đó ra.

Còn tôi thì xem tình hình đoán được thì đoán, còn không thì kệ, lơ luôn. Cũng đôi khi tôi không lơ, mà tìm cách lái người hỏi vào những việc trọng tâm mà họ cần phải nói. Như vậy có lẽ là đôi khi tôi bị "mềm lòng".
 
Upvote 0
Từ bài #22 , code của thầy Siwtom đã chạy đúng theo yêu cầu của bài là cột toán dịch chuyển về cuối cột ,rồi lại về đầu và cứ thế tiếp tục.....E đã OK !

Ý của em là mỗi lần nhấn nút run code thì đích đến của các cột là cột E6:E16 ; cứ 1 lần nhấn nút : làm 1 số thao tác ,1 số công việc có liên quan đến cột E và khi xem thấy có kết quả thì in ra ; tiếp tục nhần nút tiếp để thực hiện cho công việc khác .... lúc đầu thì em chưa có hình dung là mình đang làm 1 công việc sai đó là thay đổi dữ liệu gốc của ds như anh Vodoi nêu ra và cũng chưa hình dung ra các trường hợp 1,2,3 mà thầy liệt kê .

Trong quá trình test code của từng người thì code của thầy Ptm đã cho em 1 giải pháp là : kết quả sau 1 lần nhấn được lưu xuống ô E 20 , còn dữ liệu gốc ở trên E6:E16 vẫn không đổi. E thử sửa code từ sh1 .E20 thành sh2.E6 và bấm thử là kết quả đã được đưa sang ô E6 của sheet2 .

vậy là vấn đề :
a/ cấu trúc của Dữ liệu gốc là ds ở sheet 1 không bị thay đổi ( anh vodoi góp ý ).

b/ 3 trường hợp mà thầy Siwtom liệt kê ra cũng được giải quyết luôn vì ở cái sheet2 này là “ bước trung gian “ để làm những việc khác có liên quan đến cột E.

Giả sử em đang làm công việc , đã nhấn đến lần thứ 3 mà có việc khác phải ngưng , thì lúc đó e sẽ lưu file và tắt máy ; lần kế tiếp vào lại nếu như code thầy viết ra :


  • Không lưu gì trên sheet 2 thì cũng không sao cả vì công việc em làm xong ở lần nhấn 2 đã được lưu trên sheet khác , xem xong em sẽ biết mình sẽ tiếp tục làm việc kế tiếp là lần nhấn thứ mấy, cột gì phải làm tiếp theo....


  • Có lưu lại trên sheet 2 kết quả đang làm dở dang nhưng chưa có kết quả ở sheet khác thì em tiếp tục làm từ đây ( trường hợp 2 mà cũng là 1)



  • Có lưu lại trên sheet2 mà thứ tự các cột không theo quy luật nào cả như của thầy Ptm cũng không sao cả vì công việc em làm xong ở lần nhấn 2 đã được lưu trên sheet khác , xem xong em sẽ biết mình sẽ tiếp tục làm việc kế tiếp là lần nhấn thứ mấy, cột gì phải làm tiếp theo....

Với em thì những trường hợp trên đã được giải quyết , nhưng thầy vẫn yêu cầu là em phải nêu ra trường hợp thứ mấy để biết đường mà viết code.Vậy thầy viết giúp cho em trường hợp 2 ( lưu kết quả đang làm dở dang trên sheet2 ).

Cám ơn thầy !
 
Upvote 0
Tôi muốn biết chắc chắn vì cái kiểu viết đi sửa lại ngại lắm.
--------------
Thôi thì làm lần cuối, đúng ý hay không tôi cũng kết thúc.

1. Ở lần mở tập tin lần đầu tiên ta có dữ liệu sheet1 và 2 như nhau
2. Chơi theo trường hợp 2 ở bài #25. Chơi khi nào mệt thì ghi lại tập tin.
3. Ở mỗi lần mở tiếp theo thì khi nhấn nút là "chơi tiếp" lần trước.
4. Chỉ chơi trên sheet2, tức các cột chỉ nhẩy múa trên sheet2
5. Tôi chuyển Button sang sheet2. Vì nếu cứ nhấn nút xong lại phải click sheet2 để xem rồi lại click sheet1 để nhấn nút, cứ như thế liên tục thì không phải trò chơi nữa mà là "cực hình"

Mã:
Sub DaoChieu()
Static index As Long
Static source As Range
Dim rng As Range, Arr
    If source Is Nothing Then Set source = Sheet1.[E6:K16]
    index = (Sheet2.[A1].Value + 1) Mod 7
    Sheet2.[A1].Value = index
    If index = 0 Then
        Sheet2.[E6:K16].Value = source.Value
    Else
        Set rng = Sheet2.[E6:E16].Resize(, index)
        Arr = Sheet2.[E6:E16].Offset(, index).Value
        rng.Copy Range("F6")
        Sheet2.[E6:E16].Value = Arr
    End If
End Sub



Cái này tôi cũng đã nói ở bài #25 rồi mà.



Vấn đề không khó, cái khó là hiểu được ước muốn để mà "chiều".

@nggiahoang: lần sau bạn bạn phát biểu thật trọn vẹn và phát biểu tại một chỗ thôi. Không phải ở mỗi bài phát biểu một tí.

E sẽ test code này và báo cáo lại cho thầy vào buổi chiều tối nay.
 
Upvote 0
Code thầy giúp cho lần cuối này e chạy thử thấy hoạt động trơn tru , có lưu lại lần ghi sau cùng .
Khi em thay đổi dữ liệu bằng bảng biểu khác như " thu tiền đầu năm " từ cột E đến K :HP, CSVC, BHTN,BHYT ... tương ứng là số tiền cụ thể vao các cột ở sheet 1 thì ở sheet2 không thấy cập nhật mới . E chỉ báo cáo lại tình hình chứ không dám làm phiền thầy viết code lại đâu .
Cám ơn thầy !
.
 
Upvote 0
Code thầy giúp cho lần cuối này e chạy thử thấy hoạt động trơn tru , có lưu lại lần ghi sau cùng .
Khi em thay đổi dữ liệu bằng bảng biểu khác như " thu tiền đầu năm " từ cột E đến K :HP, CSVC, BHTN,BHYT ... tương ứng là số tiền cụ thể vao các cột ở sheet 1 thì ở sheet2 không thấy cập nhật mới . E chỉ báo cáo lại tình hình chứ không dám làm phiền thầy viết code lại đâu .
Cám ơn thầy !
.

Chỗ đỏ đỏ là thông tin mới.
Tôi đoán không sai chút nào. Thông tin cứ "nhỏ gọt" dần dần.
Thôi ta kết thúc nhé.
 
Upvote 0
Chỗ đỏ đỏ là thông tin mới.
Tôi đoán không sai chút nào. Thông tin cứ "nhỏ gọt" dần dần.
Thôi ta kết thúc nhé.

Em thì thật tình , thầy lại nghĩ là e dùng " chiêu " , rõ khổ . Hic !

Cám ơn thầy đã rất nhiệt tình với em trong thời gian vừa qua thông qua đề tài " xắp xếp số thứ tự các cột " bằng code.
Hi vọng có dịp nào đó gặp thầy và mời thầy cafe nhé !
 
Upvote 0
Tự động hóa code của thầy Ptm

Tự động hóa code của thầy Ptm

chủ đề " VBA hoán đổi vị trí các cột tăng dần " đã đáp ứng yêu cầu của em ngoài sự mong đợi so với mục tiêu lúc đầu đề ra và cũng đến lúc phải khép lại.

Em chỉ trình bày lại ý tưởng phát sinh của mình khi sử dụng code của thầy Ptm ; thầy không nhất thiết phải trả lời khi nghĩ là em đang nhỏ giọt thông tin.

Tại ô H1 em gõ ví dụ số 5 thì Excell sẽ tự động đưa cột số 5 vào vị trí cột E và đương nhiên cột số 1 tại cột E sẽ vào thế chỗ cho cột số 5 , nhấn nút code , sang sheet2 có kết quả như ý.
 

File đính kèm

Upvote 0

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

Back
Top Bottom