Giúp mình code VBA này với (1 người xem)

Liên hệ QC

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

ngaykhongem1

Thành viên chính thức
Tham gia
14/4/12
Bài viết
50
Được thích
2
Chào mọi người,
Mình có 1 file excel code ngôn ngữ VBA mong được mọi người hỗ trợ.
File 3 là file chứa yêu cầu đề bài.
thanks mọi người nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Thông thường bài ít được trả lời là do các thành viên không hiểu cách diễn đạt của chủ topic. Mình cũng không hiểu rõ nên chỉ làm theo những gì có thể trong file 3
 

File đính kèm

Upvote 0
Bạn muốn gấp ư? . . . Vậy là cần hiểu gấp iêu cầu của bạn, nhưng không thể?

Bạn nào giúp mình với...đang cần gấp!

1./ Khi chạy macro ở file 1 sẽ xuất hiện cửa sổ chèn file để chạy, ta chọn file 2

2./ Sau khi chạy xong chương trinh sẽ xuất ra 1 file mới. Ta chỉ quan tâm Sheet 2

3./ Phần trên là code xong rồi chỉ còn ở dòng MEANS
YÊU CẦU LÀ: dòng MEANS được tính dựa vào dòng COMPARISON

4./ Nếu cặp nào có 3 giá trị thì giá trị còn lại mang so sánh với giá trị bắt đầu được đánh dấu (*)

5./ Trong mỗi cặp so sánh nếu giá trị ở dòng COMPARISON < 0.95 thì ko làm gì còn ngược lại thì gán kí tự cuối của header cột giá trị nhỏ hơn vào cột giá trị lớn hơn

1* Với file lạ, không ai muốn chạy ngay macro mà chưa biết macro chạy đúng hay sai. Tuy nhiên bạn nói trong iêu cầu là còn dòng lệnh chưa đúng; Vậy thì với mình, chả khi nào thực hiện iêu cầu này.

2* 'Xuất' là xuất ra đâu?, 'Sheet2' này ở file nào hay WorkBook nào?

3* Bạn hãy cho biết có bao nhiêu dòng MEANS trong trang tính cần xử lí; Mình nhớ không lầm thì ở topic cũ có nhiều dòng MEANS này thì fải? Có nghĩa là mình muốn hỏi có nhiều cụm kết quả cần xử lí fải không? hay chỉ 1 cụm duy nhất?

4* Có cặp (nhóm mới là từ đúng; cặp thì chỉ có đôi mà thôi - theo cách hiểu thông thường) nào sẽ có 4 trị hay không?

5* Thực ra đọc đến đây thì chí ít mình cũng đã hiểu là có nhiều nhóm số liệu xếp theo cụm hàng (dòng). Nhưng đã vậy sao bạn không đưa số liệu ở file 2 thay vô?

Mà thông thường thì để kiểm chương trình đúng, ta có chí ít vài cụm dòng không xử lý & 2 cụm dòng cần xử lý; Khi đó mới biết macro lập ra có chạy đúng ngay hay không;

Sự khác nhau giữa xử lý chỉ 1 cụm dòng & hơn 1 cụm dòng khác nhau nhiều lắm.

Nếu bạn muốn nhanh, thì cần đưa hết dữ liệu để chúng đại diện đủ mọi trường hợp; nếu không vô hình chung bạn iêu cầu mọi người lần 2, hay hơn nữa cho mà coi!

(*) Riêng cái chuyện nghiên cứu iêu cầu của bạn đã mất cũa cộng đồng này hơn tuần rồi còn gì?!

(Mình cũng hay có ác cảm với những bài tiếng Việt thì không rành rẽ, nhưng tiếng Tây thì liên miên vậy cơ chứ!. . . )

http://www.giaiphapexcel.com/forum/showthread.php?66894-Cần-hỗ-trợ-code-so-sánh-giá-trị

http://www.giaiphapexcel.com/forum/showthread.php?66880-Nhờ-giúp-code-so-sánh-giá-trị


http://www.giaiphapexcel.com/forum/showthread.php?66908-Vi%E1%BA%BFt-code-so-s%C3%A1nh-th%C3%AAm-gi%C3%A1-tr%E1%BB%8B-cho-nh%C3%B3m-d%C3%B2ng-nh%C6%B0-trong-file-(%C4%90%C6%B0a-b%C3%A0i-l%C3%AAn-d%C3%B9m-b%E1%BA%A1n)
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
@ HYen
1/ Macro này là đúng 100% . Do dòng MEANS chưa code được nên mình code cho nó khi chạy tới dòng MEANS thì ko làm gì cả, còn nếu các bạn code giúp mình thì cần gỡ bỏ dòng này vậy thôi.
2/ Sheet 2 này là trong file mới (mình code chương trình chạy ra 1 file excel mới) Bạn cứ chạy macro theo hướng dẫn thì sẽ thấy mà.
3/ Mỗi bảng(table) có thể có nhiều nhất 1 dòng MEANS và ít nhất là ko có dòng MEANS nào. Còn số lượng bảng là ko hạn chế nên mình sẽ dùng vòng lặp xử lí trên bảng thứ nhất xong thì vòng lặp sẽ chạy cho đến khi hết tất cả các bảng.
4/ Các cặp nhóm có thể có 4 giá trị, 5 giá trị, 6 giá trị....(giữa 1 cặp dấu * là 1 nhóm đó bạn, còn số giá trị trong 1 nhóm là ko giới hạn)
5/ cái này mình cũng chưa hiểu ý bạn lắm, chắc bạn chưa chạy chương trình nên hỏi thế, cái này bạn chạy chương trình giúp mình nhé.
//(Mình cũng hay có ác cảm với những bài tiếng Việt thì không rành rẽ, nhưng tiếng Tây thì liên miên vậy cơ chứ!. . . )
Thật sự mình gửi các bạn 3 file thì file 3 mình viết hình như toàn tiếng Việt không ah` còn file 1 với file 2 thì nó thì dữ liệu gốc sao mình để vậy chứ không thể sửa lại được. Mà mấy cái trên là code hết rồi chỉ còn 2 dòng MEANS và COMPARISON à nên bạn thông cảm giúp mình.
 
Upvote 0
@quanghai
Thanks anh nhiều lắm. nếu anh chưa hiểu đề bài chỗ nào thì cứ hỏi em sẽ giải đáp. Còn code ở đây là code trong file 1 anh mở cửa sổ code và code thêm vào đó giúp em.
File 1 là file fortmat chuẩn, File 2 là file dữ liệu khi chạy macro ở file 1 thì sẽ chèn dữ liệu ở file 2 vào dữ liệu file 2 lúc này sẽ được định dạng và xử lí và xuất ra 1 file khác tạm gọi tên là file mới.
 
Upvote 0
Chào mọi người,
Mình có 1 file excel code ngôn ngữ VBA mong được mọi người hỗ trợ.
File 3 là file chứa yêu cầu đề bài.
thanks mọi người nhiều.

4./ Nếu cặp nào có 3 giá trị thì giá trị còn lại mang so sánh với giá trị bắt đầu được đánh dấu (*)
5./ Trong mỗi cặp so sánh nếu giá trị ở dòng COMPARISON < 0.95 thì ko làm gì còn ngược lại thì gán kí tự cuối của header cột giá trị nhỏ hơn vào cột giá trị lớn hơn

Trước hết ta thay "cặp" bằng "nhóm", vì làm gì có vd. "cặp 12 giá trị"???
Về điểm 4: Thế cặp không có 3 mà có 12 giá trị thì so sánh các giá trị "còn lại" như thế nào?
Về điểm 5: Ứng với mỗi nhóm thì chỉ có 1 giá trị COMPARISON? Nó nằm ở cột nào? Ở cột cuối của nhóm? Ở cột bất kỳ?
cột giá trị nhỏ hơn vào cột giá trị lớn hơn
Thế nếu 2 giá trị bằng nhau thì làm hay lờ đi?
--------------
Tôi thử hiểu như thế này xem có đúng không nhé:
PHP:
Header ..., h(x-1), h(x), h(x+1), ..., h(y-1), h(y), h(y+1)
MEANS ..., m(x-1), m(x), m(x+1), ..., m(y-1), m(y), m(y+1)
COMPARISON..., , *,........................................., A, *
1. Nhóm là các giá trị trong dòng MEANS từ cột x tới cột y
2. Trong mỗi nhóm ta tạo các cặp 2 giá trị liên tiếp và so sánh chúng với nhau.
3. Nếu A < 0.95 thì không làm gì cả. Nếu A >= 0.95 thì:

PHP:
for k = x to (y-1)
 if m(k) < m(k+1) then
  m(k+1) = m(k+1) & Right(h(k), 1)
 elseif m(k) > m(k+1) then
  m(k) = m(k) & Right(h(k+1), 1)
 else
  lờ đi???
 end if
next k
if y - x > 1 then
 if m(y) < m(x) then
  m(x) = m(x) & Right(h(y), 1)
 elseif m(y) > m(x) then
  m(y) = m(y) & Right(h(x), 1)
 else
  lờ đi???
 end if
end if

2 code trên có thể gộp làm 1.
Nói cách khác ta lập các cặp:
PHP:
[m(x), m(x+1)], [m(x+1), m(x+2)], ..., [m(y-1), m(y)], [m(y), m(x)]
rồi so sánh???
Tôi hiểu thế đúng không?
Xem bảng ví dụ của bạn tôi thấy cột 1 không có * vậy các giá trị trong các cột từ 1 tới (x-1) không tạo thành nhóm và lờ chúng đi?

Mà tôi nghĩ là đọc code dài dằng dặc thế thì cũng ngại lắm. Vậy có thể làm thế này được không? Tức ai đó viết cho bạn Sub So_sanh(Arr). Sau mỗi lần xử lý xong 1 bảng thì bạn gọi So_sanh và truyền vào bảng hiện hành? Và lúc xử lý bảng thì bạn có thể biết được bảng có dòng MEANS hay không? Nếu biết thì bạn chỉ gọi So_sanh khi có dòng MEANS.

Mà nếu tôi hiểu đúng ý bạn thì việc viết code như trên không có gì là khó.
 
Lần chỉnh sửa cuối:
Upvote 0
3/ Mỗi bảng(table) có thể có nhiều nhất 1 dòng MEANS và ít nhất là ko có dòng MEANS nào. (a) Còn số lượng bảng là ko hạn chế nên mình sẽ dùng vòng lặp xử lí trên bảng thứ nhất xong thì vòng lặp sẽ chạy cho đến khi hết tất cả các bảng.
4/ Các cặp nhóm có thể có 4 giá trị, 5 giá trị, 6 giá trị....(giữa 1 cặp dấu * là 1 nhóm đó bạn, còn số giá trị trong 1 nhóm là ko giới hạn)

Ý của bạn là sau khi xử lý xong dòng MEANS thì bạn sẽ dùng vòng lặp duyệt tìm MEANS để xử các nhóm có MEANS (mà bạn gọi là 'Table')

Theo mình thì ngược lại, ta fải đi từ ngoài vào trong;

Nhưng ở vòng ngoài ta không dùng vòng lặp, nếu điều dưới đây sẩy ra:

Nếu Table nào có dòng MEANS thì dòng này cách dòng Header luôn đúng bằng (24 -6) dòng hay không?
(Bạn đừng nói với tôi là chỉ có duy nhất dòng Header trong cả trang tính đó nhe!)

Hay thế này đi: Bạn làm ơn tạo lại file giả lập của file 3 có cấu trúc trang tính như sau:
Dữ liệu thể hiện là 4 Table, trong đó có 2 table có dòng MEANS & 2 nhóm là không có dòng này.

Trong 2 nhóm có dòng MEANS thì 1 nhóm là ví dụ trên. 1 nhóm nữa có số nhóm trong dòng MEANS đa dạng hơn;

& điều quan trọng là ở trang tính thứ 2 của file giả lập này sẽ là kết quả mong muốn của bạn.

Chờ file của bạn!
 
Upvote 0
@siwtom
Về điểm 4: Thế cặp không có 3 mà có 12 giá trị thì so sánh các giá trị "còn lại" như thế nào?
- gọi là nhóm so sánh đi cho dễ hiểu. lấy các giá trị trong nhóm đem so sánh lần lượt(với điều kiện thỏa dk > 0.95) với giá trị đầu tiên của nhóm(giá trị bắt đầu được đánh (*)). Thường là trong 1 nhóm dù có bao nhiêu giá trị thì chỉ có 1 giá trị thỏa dk >0.95 thôi.
Về điểm 5: Thế nếu 2 giá trị bằng nhau thì làm hay lờ đi?
- 2 giá trị bằng nhau thì không bao giờ thỏa điều kiện >0.95 ở dòng
COMPARISON đâu nên ta ko cần quan tâm đến vấn đề đó.
"
Trong mỗi nhóm ta tạo các cặp 2 giá trị liên tiếp và so sánh chúng với nhau." cái này ko phải mà là mang các giá trị còn lại trong nhóm lần lượt so sánh với giá trị đầu tiên, mà giá trị nào thỏa điều kiện thì so sánh thôi, thường chỉ có 1 giá trị thỏa dk.
 
Lần chỉnh sửa cuối:
Upvote 0
Ý của bạn là sau khi xử lý xong dòng MEANS thì bạn sẽ dùng vòng lặp duyệt tìm MEANS để xử các nhóm có MEANS (mà bạn gọi là 'Table')

Theo mình thì ngược lại, ta fải đi từ ngoài vào trong;

Nhưng ở vòng ngoài ta không dùng vòng lặp, nếu điều dưới đây sẩy ra:

Nếu Table nào có dòng MEANS thì dòng này cách dòng Header luôn đúng bằng (24 -6) dòng hay không?
(Bạn đừng nói với tôi là chỉ có duy nhất dòng Header trong cả trang tính đó nhe!)

Hay thế này đi: Bạn làm ơn tạo lại file giả lập của file 3 có cấu trúc trang tính như sau:
Dữ liệu thể hiện là 4 Table, trong đó có 2 table có dòng MEANS & 2 nhóm là không có dòng này.

Trong 2 nhóm có dòng MEANS thì 1 nhóm là ví dụ trên. 1 nhóm nữa có số nhóm trong dòng MEANS đa dạng hơn;

& điều quan trọng là ở trang tính thứ 2 của file giả lập này sẽ là kết quả mong muốn của bạn.

Chờ file của bạn!

//Ý của bạn là sau khi xử lý xong dòng MEANS thì bạn sẽ dùng vòng lặp duyệt tìm MEANS để xử các nhóm có MEANS (mà bạn gọi là 'Table')...Uh` ý mình là vậy đó.
//Nếu Table nào có dòng MEANS thì dòng này cách dòng Header luôn đúng bằng (24 -6) dòng hay không?
(Bạn đừng nói với tôi là chỉ có duy nhất dòng Header trong cả trang tính đó nhe!)
-
Dòng Header luôn cách dòng MEANS (24 -6) dòng và mỗi table đều có dòng header.
gửi bạn file bạn yêu cầu. Trong file này sheet đầu tiên là dữ liệu 4 Table, sheet 2 là kết quả mình muốn sau khi chạy chương trình
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tôi gửi file sau khi đã bổ sung các chức năng:
1. Từ FILE 1 của bạn, có nút COMPARISON để mở 1 file xử lý (FILE 2 trong ví dụ của bạn)
2. Mã lệnh sẽ tự động dò tìm trong FILE 2 những khối có [header và MEANS] để xử lý
3. Sau khi xử lý xong, sẽ tự động ghi ra file kết quả, với tên có dạng FILE 2-daxuly.xls
Bạn kiểm tra xem đã đúng yêu cầu chưa?
(Lần trước tôi đã viết code này và chạy thử, nhưng bạn không test!!!)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tôi gửi file sau khi đã bổ sung các chức năng:
1. Từ FILE 1 của bạn, có nút COMPARISON để mở 1 file xử lý (FILE 2 trong ví dụ của bạn)
2. Mã lệnh sẽ tự động dò tìm trong FILE 2 những khối có [header và MEANS] để xử lý
3. Sau khi xử lý xong, sẽ tự động ghi ra file kết quả, với tên có dạng FILE 2-daxuly.xls
Bạn kiểm tra xem đã đúng yêu cầu chưa?
(Lần trước tôi đã viết code này và chạy thử, nhưng bạn không test!!!)

Đúng yêu cầu của mình rồi nhưng bạn xem giúp mình vẫn còn lỗi bạn ơi...VD ở 1 nhóm so sánh này
MEANS ........8.24BC....8.03....7.95
COMPARISON * ..........0.98....0.54 (do ko kẻ khung được nên mình dùng dấu ... để cách các số liệu ra nhé)
0.54<0.95 đâu thỏa điều kiện đâu sao vẫn đem đi so sánh và kết quả thành 8.24BC thay vì kết quả đúng là 8.24B . Bạn xem giúp mình nhé..thanks bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Nhóm 2 thì mình đã hiểu; Nhóm 3 ô trở lên nhờ bạn giải thích thêm

gửi bạn file bạn yêu cầu. Trong file này sheet đầu tiên là dữ liệu 4 table, sheet 2 là kết quả mình muốn sau khi chạy chương trình


| e | f | g | h | i | j | k |
48 ||| 8.21 |.|8.24B|8.03|7.95| <-Tạm hiểu
49 |*||*||*|.98|.54| *
64 |8C|34|2|435|6|32A|324| <- O hiểu
65 |*|.59|.97|.28|*|.98|.54| *

Bạn giúp giải thích thêm, tại sao trong nhóm 4 ô đầu, bạn lại gạn C cho ô đầu & trường hợp sau lại gán A cho ô giữa làm vậy?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Đúng yêu cầu của mình rồi nhưng bạn xem giúp mình vẫn còn lỗi bạn ơi...VD ở 1 nhóm so sánh này
MEANS ........8.24BC....8.03....7.95
COMPARISON * ..........0.98....0.54 (do ko kẻ khung được nên mình dùng dấu ... để cách các số liệu ra nhé)
0.54<0.95 đâu thỏa điều kiện đâu sao vẫn đem đi so sánh và kết quả thành 8.24BC thay vì kết quả đúng là 8.24B . Bạn xem giúp mình nhé..thanks bạn

Do lần trước nói không rõ, nên tôi tưởng là cứ có ô thỏa điều kiện >=0.95 thì sẽ so sánh hết trong cả nhóm. Đã sửa lại, bạn down lại file đính kèm ở bài trước nhé!
 
Upvote 0


| e | f | g | h | i | j | k |
48 ||| 8.21 |.|8.24B|8.03|7.95| <-Tạm hiểu
49 |*||*||*|.98|.54| *
64 |8C|34|2|435|6|32A|324| <- O hiểu
65 |*|.59|.97|.28|*|.98|.54| *

Bạn giúp giải thích thêm, tại sao trong nhóm 4 ô đầu, bạn lại gạn C cho ô đầu & trường hợp sau lại gán A cho ô giữa làm vậy?
- Trong nhóm 4 giá trị so sánh đầu tiên thì ta mang tất cả 3 giá trị còn lại so sánh với giá trị bắt đầu có dấu (*) là giá trị 8. Trong 3 giá trị này thì chỉ có giá trị 2 là thỏa điều kiện dòng COMPARISON = 0.97> 0.95 nên ta chỉ đem so sánh 2<8, nên ta lấy ký tự cuối dòng header cột giá trị 2 là chữ C gán vào giá trị lớn hơn là 8 ==> giá trị 8 đổi thành 8C.
- Ở nhóm so sánh tiếp theo cũng vậy. Nhóm so sánh này có 3 giá trị ta mang 2 giá trị còn lại đi so sánh với giá trị bắt đầu dấu (*) là giá trị 6... Ở đây chỉ có giá trị 32 là thỏa điều kiện 0.98>0.95 nên ta chỉ mang giá trị này so sánh với giá trị 6<32 nên gán ký tự cuối header cột chứa giá trị 6 là A vào giá trị lớn hơn là 32 ==> 32 thành 32 A
 
Upvote 0
Do lần trước nói không rõ, nên tôi tưởng là cứ có ô thỏa điều kiện >=0.95 thì sẽ so sánh hết trong cả nhóm. Đã sửa lại, bạn down lại file đính kèm ở bài trước nhé!
Thanks bạn nhiều lắm.Cho mình làm phiền bạn thêm tí, bạn giải thích code luôn vào file excel đó giúp mình được không!
 
Upvote 0
Để hiểu hết bạn thật là khó!

Bạn kiểm dùm số liệu xem sao nha!
 

File đính kèm

Upvote 0
Do lần trước nói không rõ, nên tôi tưởng là cứ có ô thỏa điều kiện >=0.95 thì sẽ so sánh hết trong cả nhóm. Đã sửa lại, bạn down lại file đính kèm ở bài trước nhé!
Bạn ơi giúp mình gộp 2 lệnh thành 1 được không. Là khi chạy chương trình sẽ format định dạng như file mình đã code và chạy thêm phần code so sánh như bạn làm nữa. với lại bây giờ dòng header sẽ ko còn chữ header nữa mà biết là dòng này cách MEANS là 18 dòng hoặc cách dòng có dấu * là 19 dòng. Chương trình sắp hoàn chỉnh rồi mình chỉ còn vướng chỗ này mong bạn giúp đỡ. Thanks bạn!
 
Upvote 0
Trong file của bạn có 1 đoạn code yêu cầu mở 1 file để format. Do không hiểu hết ý của bạn nên mọi người khó có thể giúp.
Tôi đề nghị thế này:
1. Bạn đưa tất cả các nội dung (file) mà bạn cần/sẽ xử lý.
2. Ghi rõ yêu cầu công việc của bạn theo trình tự mà bạn sẽ xử lý. Ví dụ:
bước 1. đọc file gì gì đó, làm gì gì đó (đoạn này hình như là sẽ mở 1 file, sau đó dùng mẫu (Template) ở file 1 để định dạng
bước 2. đọc file 2 và xử lý...

Tôi chỉ đoàn chừng công việc sẽ như thế.

Bạn nên gửi gấp lên bây giờ, hy vọng có thời gian tôi sẽ xem giúp bạn vì 2 ngày kế tiếp tôi bận coi thi tuyển sinh rồi!
 
Upvote 0
Web KT

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

Back
Top Bottom