Cách tráo đổi tự động tuần tự dữ liệu trong bảng. (1 người xem)

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

JuneAngle

Thành viên mới
Tham gia
5/10/08
Bài viết
10
Được thích
0
Dear các Anh Chị,

Các Anh /Chị có thể giúp em với file đính kèm được không ạ? Bài toán đặt ra như sau:
Trong bảng là một dạng thời khóa biểu với ngày thứ (Từ thứ Hai đến thứ Sáu) và mỗi ngày có 6 tiết học. Em có các dữ liệu trong từng ngày tương ứng với từng tiết học. Câu hỏi là, làm cách nào để các dữ liệu đó sẽ hoán đổi tuần tự cho nhau vào các ngày và các tiết khác nhau theo mỗi tuần mà không bị lặp lại của tuần trước (cho đến khi hết lượt thì sẽ quay lại từ đầu), (1 năm - 52 tuần) ? Rất mong các Anh / Chị giúp cho em ạ.+-+-+-+

Em xin chân thành cảm ơn./-*+/
 

File đính kèm

Bạn giải thích cụ thể hơn hoán đổi như thế nào, cho ví dụ tuần 2 xem sao
 
Em xin gửi lại ví dụ dài hơn như file đính kèm ạ. Ý của em là các tuần thứ 2, 3, 4, 5....sau đó, dữ liệu sẽ không bị lặp lại ở tuần 1. Ví dụ tuần 1, A nằm ở Tiết 1, thứ Hai. Thì đến tuần 2, A sẽ nằm ở những ô khác. Tương tự với các dữ liệu tại các ô khác trong bảng ạ.
 

File đính kèm

Em xin gửi lại ví dụ dài hơn như file đính kèm ạ. Ý của em là các tuần thứ 2, 3, 4, 5....sau đó, dữ liệu sẽ không bị lặp lại ở tuần 1. Ví dụ tuần 1, A nằm ở Tiết 1, thứ Hai. Thì đến tuần 2, A sẽ nằm ở những ô khác. Tương tự với các dữ liệu tại các ô khác trong bảng ạ.
Bạn xem thử theo file đính kèm nhé.
 

File đính kèm

Em cảm ơn anh nhiều lắm lắm. Anh làm hay quá. Đó chính xác là những gì em cần ạ. }}}}} %#^#$ :-=
 
Dear bác tttmuahmuah, giải pháp bác đưa ra đã rất đúng với yêu cầu của "đề bài" rồi ạ. Tuy nhiên, bác có thể chỉ dẫn em làm thế nào được không ạ? Vì em còn có những thời khóa biểu khác với phạm vi hoán đổi hẹp hơn, em phải làm như thế nào hả bác? Theo em thấy thì hình như bác dùng Macro gì đó chứ không phải là hàm bình thường đúng không ạ? :-)
 
Dear bác tttmuahmuah, giải pháp bác đưa ra đã rất đúng với yêu cầu của "đề bài" rồi ạ. Tuy nhiên, bác có thể chỉ dẫn em làm thế nào được không ạ? Vì em còn có những thời khóa biểu khác với phạm vi hoán đổi hẹp hơn, em phải làm như thế nào hả bác? Theo em thấy thì hình như bác dùng Macro gì đó chứ không phải là hàm bình thường đúng không ạ? :-)
"cướp lời" bạn tttmuahmuah tý nhé:
cái ví dụ trên dùng công thức bình thường cho mảng (array), không phải Macro đâu. Khi nào bạn thấy công thức trong 2 dấu móc là nó đấy (để gõ công thức bạn không gõ Enter mà gõ Ctrl+Shift+Enter). Công nhận bạn tttmuahmuah sưu tầm những hàm độc đáo thật.
Còn "phạm vi hẹp" thế nào thì bạn phải có yêu cầu cụ thể hơn. Cái ví dụ trên chỉ trộn lẫn thứ tự các môn học, còn nếu thêm đều kiện:VD gv môn A có con nhỏ, không bố trí tiết đầu, gv môn B xin nghỉ ngày thứ 5, ... phải cụ thể mới được.
 
Em xin gửi ví dụ về trường hợp cụ thể phát sinh khi mà có những khoảng ô trống (bôi đen), phạm vi tráo đổi thông tin giữa các ô sẽ hẹp hơn, chỉ tráo đổi vị trí giữa những ô có dữ liệu, còn những ô bôi đen thì không được tính đến ạ.

Em cũng đã thử đi thử lại với Mixdata mà không tài nào ra nổi kết quả ạ. Các Anh/ Chị giúp em với ạ. Em xin chân thành cảm ơn.
 

File đính kèm

Em xin gửi ví dụ về trường hợp cụ thể phát sinh khi mà có những khoảng ô trống (bôi đen), phạm vi tráo đổi thông tin giữa các ô sẽ hẹp hơn, chỉ tráo đổi vị trí giữa những ô có dữ liệu, còn những ô bôi đen thì không được tính đến ạ.

Em cũng đã thử đi thử lại với Mixdata mà không tài nào ra nổi kết quả ạ. Các Anh/ Chị giúp em với ạ. Em xin chân thành cảm ơn.
Bạn copy hàm sau vào module nhé
[GPECODE=vb]Function MixData(MyRange As Range, NoWeek As Byte, Optional ByVal MyColor As Boolean = False)
Dim MyArray() As Variant
Dim ResultArray() As Variant
Dim cell As Variant
Dim Rng As Range
i = 0
j = 0
Set Rng = MyRange
Rbegin = Rng.Rows.Count - 1
Cbegin = Rng.Columns.Count - 1

For Each cell In Rng
If MyColor = True Then
If cell.Interior.ColorIndex = xlNone Then
ReDim Preserve MyArray(i)
MyArray(i) = cell.Value
i = i + 1
End If
Else
ReDim Preserve MyArray(i)
MyArray(i) = cell.Value
i = i + 1
End If
Next

ReDim Preserve ResultArray(Rbegin, Cbegin)
For Each cell In Rng
Rcell = cell.Row - Rng.Row
Ccell = cell.Column - Rng.Column
If MyColor = True Then
If cell.Interior.ColorIndex = xlNone Then
ResultArray(Rcell, Ccell) = MyArray((j + NoWeek) Mod (UBound(MyArray) + 1))
j = j + 1
Else
ResultArray(Rcell, Ccell) = cell.Value
End If
Else
ResultArray(Rcell, Ccell) = MyArray((j + NoWeek) Mod (UBound(MyArray) + 1))
j = j + 1
End If
Next
MixData = ResultArray
End Function[/GPECODE]
Sau đó áp dụng vào file, bạn xem thêm theo đính kèm
 

File đính kèm

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

Back
Top Bottom