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

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
Web KT

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

Back
Top Bottom