Đặt name như thế nào đễ bỏ cột phụ (1 người xem)

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

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,913
Các bạn xem file đính kèm... Về mặt tối ưu thì file này đã dc xử lý tương đối tốt, tuy nhiên vẫn còn 1 nhược điểm nhỏ, đó là cột phụ E trong sheet Detail... Các bạn xem thử có cách nào đặt name đễ bỏ luôn cột này ko? (từ E9 đến E60000)
Mến
ANH TUẤN
 
Lần chỉnh sửa cuối:
anhtuan1066 đã viết:
Các bạn xem file đính kèm... Về mặt tối ưu thì file này đã dc xử lý tương đối tốt, tuy nhiên vẫn còn 1 nhược điểm nhỏ, đó là cột phụ E trong sheet Detail... Các bạn xem thử có cách nào đặt name đễ bỏ luôn cột này ko? (từ E9 đến E60000)
Mến
ANH TUẤN

Đúng là khó thật.

Việc tạo ra các name tĩnh thay đổi theo tháng thì không thành vấn đề. Cái qua trọng là bác dùng sumif, mã đã là sumif với các ĐK không có trực tiếp trên Data thì việc tạo ra cột phụ là điều đương nhiên, đây là điều không thể tránh khỏi (và cũng là yếu điểm của Sumif)

Em nghĩ 1 hướng khác : Dùng name tĩnh kết hợp với sumproduct không biết có hay hơn không ??

Có cái này nữa : Em chưa dùng Sumifs nên không biết với 1 ĐK thì Sumif và Sumifs có khác nhau về tốc độ không nhỉ ???

Thân!
 
Nếu dùng SUMPRODUCT thì sẽ bỏ dc cột phụ luôn (động tỉnh gì cũng dc)... có điều qua thử nghiệm thấy chậm hơn SUMIF rất nhiều, vì thế tôi vẩn quyết định là dùng SUMIF
Bài toán này có lần tôi đã đăng trên mạng, và các bạn cũng đã tranh luận khá nhiều về thuật toán tối ưu tốc độ trong file, cuối cùng mới đi đến kết luận dùng SUMIF là hiệu quả nhất.. tuy nhiên lại phải dùng cột phụ thì dung lượng file tăng lên khá nhiều... Bỏ dc cột phụ này nữa là coi như bài toán đã dc giãi quyết...
Khó thật!
 
anhtuan1066 đã viết:
Nếu dùng SUMPRODUCT thì sẽ bỏ dc cột phụ luôn (động tỉnh gì cũng dc)... có điều qua thử nghiệm thấy chậm hơn SUMIF rất nhiều, vì thế tôi vẩn quyết định là dùng SUMIF
Bài toán này có lần tôi đã đăng trên mạng, và các bạn cũng đã tranh luận khá nhiều về thuật toán tối ưu tốc độ trong file, cuối cùng mới đi đến kết luận dùng SUMIF là hiệu quả nhất.. tuy nhiên lại phải dùng cột phụ thì dung lượng file tăng lên khá nhiều... Bỏ dc cột phụ này nữa là coi như bài toán đã dc giãi quyết...
Khó thật!

Việc này là không thể vì với các điều kiện như thế thì phải có cột phụ.
Giống như xe máy phải có . . . bánh xe vậy.
Việc không nghiên cứu cách làm cho xe máy chạy được mà không cần bánh xe thì . . . !!!!

Bác hãy xem lại : Cái gì là mục tiêu của bác : Tốc độ khi tính toán ??? Dung lượng File ??? Tốc độ khi nhập liệu ??? . . . .

Việc chờ tính toán khi tổng hợp một chút thì cho là lâu, nhưng thời gian khi mở File, đóng File, khi nhập liệu (vì nó đòi phải tính lại) . . . thì lại cho là .. không có gì. Mới có bằng đấy dũ liệu mà đã 8Mb rồi, nhiều hơn nữa thì chắc là khủng luôn.
Bác hãy xem qua File Vật tư Phụ tùng của Vũ Ngọc. Bằng đó dữ liệu, bằng đó Form mà chỉ có khoảng 1,3Mb thôi.

Thân!
 
Mục tiêu trước tiên là TỐC ĐỘ... đã đạt dc rồi... bây giờ thì tính tiếp tới chỉ tiêu DUNG LƯỢNG.. Nói chung là ko bao giờ ta thỏa mãn dc với cái mình vừa làm.. nên phải nghĩ tiếp... Và tôi nghĩ rằng trên đời này ko có cái gì là KO THỂ cả... chỉ tại là mình CHƯA NGHĨ RA...
Tôi vừa post bài vừa đang suy nghĩ thêm về vụ này và đã có những phát hiện mới rồi đấy... Hy vọng là tuần sau có thể giãi quyết dứt điểm vụ cột phụ này mà vẫn dùng SUMIF... hi.. hi...
Về dung lượng 8M của file này Bắp nói thế tôi chưa đồng ý lắm... Bắp cứ thử xóa sheet TOTAL, chỉ chừa lại Detail.. xóa luôn cột phụ và name, chỉ chừa lại dử liệu thô thôi xem nó còn lại dung lượng bao nhiêu? Dử liệu thô nó nhiêu đó thì đành chịu thôi chứ chẳng lẽ có cách tối ưu luôn dử liệu thô này?
ANH TUẤN
 
Lần chỉnh sửa cuối:
anhtuan1066 đã viết:
Mục tiêu trước tiên là TỐC ĐỘ... đã đạt dc rồi... bây giờ thì tính tiếp tới chỉ tiêu DUNG LƯỢNG.. Nói chung là ko bao giờ ta thỏa mãn dc với cái mình vừa làm.. nên phải nghĩ tiếp... Và tôi nghĩ rằng trên đời này ko có cái gì là KO THỂ cả... chỉ tại là mình CHƯA NGHĨ RA...
Tôi vừa post bài vừa đang suy nghĩ thêm về vụ này và đã có những phát hiện mới rồi đấy... Hy vọng là tuần sau có thể giãi quyết dứt điểm vụ cột phụ này mà vẫn dùng SUMIF... hi.. hi...
Về dung lượng 8M của file này Bắp nói thế tôi chưa đồng ý lắm... Bắp cứ thử xóa sheet TOTAL, chỉ chừa lại Detail.. xóa luôn cột phụ và name, chỉ chừa lại dử liệu thô thôi xem nó còn lại dung lượng bao nhiêu? Dử liệu thô nó nhiêu đó thì đành chịu thôi chứ chẳng lẽ có cách tối ưu luôn dử liệu thô này?
ANH TUẤN
Be be be !!!
Còn phải xóa nhiều vậy cơ à bác ??? Sao không xóa hết luôn đi để cho nó nhẹ ???

Đùa vậy thôi, dữ liệu thô là tối giản nhất rồi. Vậy làm cách nào để các dữ liệu không thô thành dữ liệu thô ???

Chứ còn xóa đi như bác thì nó đâu có ra 1 chương trình (tạm gọi như vậy - Vì có DataReport). Cái quan trọng nhất bác lại xóa đi rồi thì lấy gì mà . . tính toán với báo cáo ??

File của VuNgoc đâu có xóa cái gì đâu, cũng có name, cũng có công thức . . . thậm chí còn nhiều hơn của bác nữa mà chỉ có 1,3 Mb.

Nếu như File trên mà bác bảo đạt được yêu cầu về tốc độ rồi thì em cũng chịu, khi em mở File ra, khi đóng File lại, khi nhập liệu vào đều phải chờ hơi lâu. . . .

Còn về làm cách nào với cái File của bác thì âu là tùy bác, bởi quan niệm của em và của bác khác nhau rồi, có muốn làm cho giống nhau cũng không được. Híc híc!!

Thân!
 
Chứ còn xóa đi như bác thì nó đâu có ra 1 chương trình
Bắp hiểu sai ý tôi nói rồi... Ý tôi muốn nói rằng cho dù file của tôi chưa có công thức gì cả, chỉ với dử liệu thô thôi thì dung lượng của nó cũng đã lớn rồi... Giờ làm sao giảm nhỏ dung lượng xuống đây... Với bao nhiêu đó chử nghĩa thì nó phải có dung lượng là như thế, ko thể nhỏ hơn dc... Chẳng lẽ VuNgoc có cách nào làm cho 1 ký tự có dung lượng nhỏ hơn 1 Byte?
ANH TUẤN
 
Các bác tranh luận vui quá, em góp thêm vài câu. Em Không quan tâm dữ liệu thô hay sơ, quan tâm nhất là : ĐẠT MỤC ĐÍCH ĐỀ RA->Tốc độ->Dung lượng
 
Ai chà chà... Tôi mới phát hiện ra 1 chuyện... Nếu mở file trên Excel2007 và dùng SUMIFS thì tốc độ cực nhanh... Nhanh như tôi đang dùng SUMIF vậy!
Chả lẽ ko có giãi pháp nào khác trên Excel2003 trở xuống sao? SUMPRODUCT thì có thể bỏ dc cột phụ, nhưng lại quá chậm.. SUMIF thì nhanh, nhưng lại ko chơi với mãng dc tạo thành từ 2 mãng khác (DATE&DEPT chẳng hạn)... nên phải dùng cột phụ...
Khó khăn thật!
Tôi còn đễ ý là khi chạy file này trên Excel2007, dù sử dụng SUMPRODUCT nó vẫn tính toán nhanh hơn nhiều so với khi dùng SUMPRODUCT trên Excel2002 hoặc 2003...
 
Ha... ha... Giãi quyết xong...
Thay vì đặt cột phụ tại sheet Detail, ta mất hết gần 60.000 cell phụ.. ta có thể đặt cột phụ tại sheet TOTAL, chỉ mất khoảng 60 cell... Mục đích của các cell này là tạo ra những mãng động theo từng ngày tại cột A, từ A9 đến A39...
Ví dụ, chọn tháng là February, tại cell AD9 và AE9 ta có công thức:
Mã:
AD9 ="Detail!$A$"&SR&":$A$"&ER
AE9 ="Detail!$C$"&SR&":$C$"&ER
với Name SR =MATCH(Total!$A9,Detail!$D$11:$D$60000,0)+10
và Name ER =COUNTIF(Detail!$D$11:$D$60000,Total!$A9)+SR-1
Từ AD9 và AE9 kéo fill xuống đến dòng 39
Tại cell C9 tạo công thức:
Mã:
C9 =IF(ISNA($AD9),0,SUMIF(INDIRECT($AD9),C$8,INDIRECT($AE9)))
Công thức áp dụng cho mãng C9:Y39
Riêng cột Other, từ Z9 đến Z39 ta lập công thức khác:
Mã:
Z9 =IF(ISNA($AE9),0,SUM(INDIRECT($AE9))-SUM($C9:$Y9))
Tóm lại, qua thử nghiệm thấy tốc độ xử lý rất nhanh... Mặt khác khi nhập liệu ko gặp tình trạng Calculating.. lý do là nó đã dc tính toán sẳn tại các cột AD và AE, và bảng tính chỉ tính toán lại khi có sự thay đỗi tại ComboBox...
Bên sheet Detail hoàn toàn có thể bỏ tất cả các cột phụ... riêng Define Name giờ chỉ còn 2 name duy nhất là SR và ER (cải tiến này giảm dung lượng dc 3MB).. Với dử liệu 60.000 dòng + công thức, ra dc 1 file 5MB là có thể chấp nhận dc
Có bạn nào có thể cải tiến thêm nữa ko?
ANH TUẤN
 

File đính kèm

Lần chỉnh sửa cuối:
Các bạn cho hỏi: Tại sao cũng với công thức tại cột phụ như trong file trên, nhưng nếu tôi bỏ cột phụ này đi và đặt nó thành name thì tốc độ tính toán lại chậm kinh khủng... Có gì khác nhau nhỉ ???... Nếu lôi cổ 2 name còn lại ra ngoài luôn thì càng tăng tốc thêm nữa... Lạ thật!
ANH TUẤN
 
Mình cũng có vấn đề nhờ các anh trong GPE chỉ giúp !
Nhân tiện cho mình hỏi luôn ( Không phải lập Đề tài mới ít tốn dung lượng của GPE).
Nội dung trong file đính kèm nhé !
Nội dung cũng là thay thế cột phụ bằng name động hoặc không dùng cột phụ và name động
Chân thành cảm ơn !
 

File đính kèm

Lần chỉnh sửa cuối:
mình cũng có vấn đề nhờ các anh trong gpe chỉ giúp !
Nhân tiện cho mình hỏi luôn ( không phải lập đề tài mới ít tốn dung lượng của gpe).
Nội dung trong file đính kèm nhé !
Nội dung cũng là thay thế cột phụ bằng name động hoặc không dùng cột phụ và name động
chân thành cảm ơn !
=sumproduct((mmult(--(c4:e8>=8),{1;1;1})>=2)*f4:f8)/sumproduct((mmult(--(c4:e8>=8),{1;1;1})>=2)*1)
hoặc
=AVERAGE(IF(MMULT(--(C4:E8>=8),{1;1;1})>=2,F4:F8))
 
Lần chỉnh sửa cuối:
Thử công thức mảng:

=AVERAGE(IF(COUNTIF(OFFSET($C$3:$E$3,ROW($1:$5),),">=8")>1,$F$4:$F$8,""))
 
=sumproduct((mmult(--(c4:e8>=8),{1;1;1})>=2)*f4:f8)/sumproduct((mmult(--(c4:e8>=8),{1;1;1})>=2)*1)
hoặc
=AVERAGE(IF(MMULT(--(C4:E8>=8),{1;1;1})>=2,F4:F8))
=Mmult(C4:E4),{1;1;1}) thì mình hiểu, còn công thức Mmult(--(C4:E4>=8),{1;1;1}) mình vẫn không hiểu cách thức hoạt động của hàm này thế nào, sao kết quả lại là {1;2;1;2;3}.
Theo mình hiểu thì lấy các phần tử thỏa điều kiện trong ma trận (C4:C8) rồi nhân với ma trận {1;1;1} có đúng không ?.Nhưng không hiểu tại sao lại ra ma trận {1;2;1;2;3}. Mong các bạn trong GPE giải thích giúp.
Chân thành cảm ơn !
 
(c4:e8>=8) trả về kết quả true, fale
--
(c4:e8>=8) trả về kết quả 1, 0
MMULT(--(C4:E8>=8),{1;1;1}) là lấy 2 ma trận nhân nhau[TABLE="width: 130"]
[TR]
[TD="align: right"]0[/TD]
[TD="align: right"]1[/TD]
[TD="align: right"]0[/TD]
[TD="align: right"]1[/TD]
[TD="align: right"]1[/TD]
[/TR]
[TR]
[TD="align: right"]1[/TD]
[TD="align: right"]1[/TD]
[TD="align: right"]1[/TD]
[TD="align: right"]1[/TD]
[TD="align: right"]1[/TD]
[/TR]
[TR]
[TD="align: right"]0[/TD]
[TD="align: right"]0[/TD]
[TD="align: right"]0[/TD]
[TD="align: right"]0[/TD]
[TD="align: right"]1[/TD]
[/TR]
[/TABLE]

*{1;1;1}
ra ma trận chỉ có 1 dòng là tổng của các cột của ma trận thứ nhất
 
Thì ra --(c4:e8>=8) trả về kết quả true,fale ( 1, 0) chứ không phải trả về KQ các phần tử thỏa ĐK. Mình đã hiểu rồi. Cảm ơn bạn rất nhiều !
 

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

Back
Top Bottom