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 !
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.
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 đó.
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.
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 đó.
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.
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.
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.
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".
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 ).
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
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 !
.
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 !
.
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é !
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ư ý.