Name động & Name tĩnh

  • Thread starter Thread starter BNTT
  • Ngày gửi Ngày gửi
Liên hệ QC

BNTT

Bùi Nguyễn Triệu Tường
Thành viên danh dự
Tham gia
3/7/07
Bài viết
4,946
Được thích
23,208
Nghề nghiệp
Dạy đàn piano
Các bác cho tôi hỏi chút.
Khi truy xuất dữ liệu (có sử dụng cả VBA và công thức), mình đặt tên cho khối cell bằng name động (dùng OFFSET) và name tĩnh (dùng Define name) thì cách nào chạy nhanh hơn? Có phải dùng name tĩnh thì sẽ nhanh hơn không?
Tôi hỏi cho những file có Database lớn (khoảng vài ngàn dòng trở lên) ?

Cụ thể hơn như sau:

Tôi có một bảng tính gồm 1795 dòng (không tính hàng trên cùng (hàng A) dùng làm tiêu đề và hàng dưới cùng (1796) làm hàng SubTotal) và 35 cột; ô đầu tiên (A1 được Define name = START)

Tôi dùng name động như sau (gõ trong ô Refers to)
* Tổng số cột của Database
SumColumn: =COUNTA(Sheet1!$1:$1)
* Tổng số hàng của Database
SumRow: =COUNTA(Sheet1!$A:$A)-1
* Khối cell chứa mã số (ở cột A), là chủ đạo để tính toán hay tìm kiếm:
SumRecord: =OFFSET(START,1,0,SumRow,1)
* Khối cell chứa các Header (hàng trên cùng), tôi đặt tên để dùng làm bảng dò cho việc đặt tên các cột, đề phòng chuyện dời cột hoặc chèn thêm cột:
BangDo: =OFFSET(START,0,0,1,SumColumn)
Bây giờ tôi mới hỏi như sau:
Giả sử tôi muốn đặt tên cho cột Số Lượng và Thành Tiền, có header là SOLUONG và THANHTIEN, địa chỉ tuyệt đối là ($E2:$E1795) và ($F2:$F1795), thì giữa 2 cách:
Dùng name động:
SLG: =OFFSET(SumRecord,0,MATCH("SOLUONG",BangDo,0)-1)
TTIEN: =OFFSET(SumRecord,0,MATCH("THANHTIEN",BangDo,0)-1)
Và dùng name tĩnh:
SLG: =Sheet1!$E2:$E1795
TTIEN: =Sheet1!$F2:$F1795
Thì cách nào sẽ truy xuất dữ liệu nhanh hơn? (Tôi sẽ đặt tên cho khoảng 30 cột, tương ứng với 30 loại dữ liệu cần truy xuất, và số hàng của Database sẽ càng ngày càng nhiều hơn 1795 hàng)
 
Lần chỉnh sửa cuối:
PHP:
Khi truy xuất dữ liệu (có sử dụng cả VBA và công thức),
 mình đặt tên cho khối cell bằng name động (dùng OFFSET) và name tĩnh (dùng Define name)
 thì cách nào chạy nhanh hơn? Có phải dùng name tĩnh thì sẽ nhanh hơn không?
Tôi hỏi cho những file có Database lớn (khoảng vài ngàn dòng trở lên) ?
bạn có làm thử chưa nếu chưa thì làm thử xem rồi cho kết quả, chứa mình thấy name động hay tĩnh gì thì cũng cho kết quả như ý muốn mà
 
BNTT đã viết:
Các bác cho tôi hỏi chút.
Khi truy xuất dữ liệu (có sử dụng cả VBA và công thức), mình đặt tên cho khối cell bằng name động (dùng OFFSET) và name tĩnh (dùng Define name) thì cách nào chạy nhanh hơn? Có phải dùng name tĩnh thì sẽ nhanh hơn không?
Tôi hỏi cho những file có Database lớn (khoảng vài ngàn dòng trở lên) ?

Cụ thể hơn như sau:

Tôi có một bảng tính gồm 1795 dòng (không tính hàng trên cùng (hàng A) dùng làm tiêu đề và hàng dưới cùng (1796) làm hàng SubTotal) và 35 cột; ô đầu tiên (A1 được Define name = START)

Tôi dùng name động như sau (gõ trong ô Refers to)
* Tổng số cột của Database
SumColumn: =COUNTA(Sheet1!$1:$1)
* Tổng số hàng của Database
SumRow: =COUNTA(Sheet1!$A:$A)-1
* Khối cell chứa mã số (ở cột A), là chủ đạo để tính toán hay tìm kiếm:
SumRecord: =OFFSET(START,1,0,SumRow,1)
* Khối cell chứa các Header (hàng trên cùng), tôi đặt tên để dùng làm bảng dò cho việc đặt tên các cột, đề phòng chuyện dời cột hoặc chèn thêm cột:
BangDo: =OFFSET(START,0,0,1,SumColumn)
Bây giờ tôi mới hỏi như sau:
Giả sử tôi muốn đặt tên cho cột Số Lượng và Thành Tiền, có header là SOLUONG và THANHTIEN, địa chỉ tuyệt đối là ($E2:$E1795) và ($F2:$F1795), thì giữa 2 cách:
Dùng name động:
SLG: =OFFSET(SumRecord,0,MATCH("SOLUONG",BangDo,0)-1)
TTIEN: =OFFSET(SumRecord,0,MATCH("THANHTIEN",BangDo,0)-1)
Và dùng name tĩnh:
SLG: =Sheet1!$E2:$E1795
TTIEN: =Sheet1!$F2:$F1795
Thì cách nào sẽ truy xuất dữ liệu nhanh hơn? (Tôi sẽ đặt tên cho khoảng 30 cột, tương ứng với 30 loại dữ liệu cần truy xuất, và số hàng của Database sẽ càng ngày càng nhiều hơn 1795 hàng)

1.750 hàng vẫn là ít, 10.000 hàng vẫn là ít. Khi nào là khoảng > 20.000 thì mới bắt đầu phải lo bác ạ.

Bác nên dùng name động, tính toán sẽ nhanh hơn (về tổng thể). Bác nên post File lên, mọi người sẽ tối ưu cho bác. Nên nhớ rằng Data phải :
  1. Không thừa
  2. Không thiếu
  3. Chính xác
  4. Phù hợp
Đây là những tiêu chí đặt ra cho 1 DATA của Excel bình thường.

Thân!
 
Thì bạn cứ tính đi, nếu dử liệu có 1795 dòng cố định thì cần gì đến Name động, đúng ko?
Bởi vậy nên tùy trường hợp... Tôi lấy ví dụ cột A tôi ghi ngày tháng năm từ 1/1/2007 đến cuối năm 31/12/2007... vậy thì khi tôi truy xuất dử liệu trong 1 tháng nào đó cụ thể thì dùng name động trong trướng hợp này là hoàn toàn hợp lý... Vì nếu dùng name tĩnh thì Excel phải quét hết toàn bộ 1795 dòng, trong khi nếu tôi dùng name động đễ truy ra dử liệu nằm trong 1 tháng thì nó chỉ quét nhiều lằm vài chục dòng, tất nhiên sẽ nhanh hơn...
Bạn xem lại dử liệu của mình rồi nhẳm tính cũng biết dc nên dùng cách nào rồi... Nhanh hay chậm là tùy vào số lượng phép tính cần có trong 1 giây, đại khái là như thế!
ANH TUẤN
 
Mr Okebab đã viết:
Bác nên post File lên, mọi người sẽ tối ưu cho bác.

Thú thật ý tôi muốn nói về cái file KIM-NGUYEN đã post lên bên mục Excel và Kế toán hôm kia. Chắc bác đã xem qua. Bác coi dùm.
Trong đó, như ý bác Anh Tuấn nói,
Tôi lấy ví dụ cột A tôi ghi ngày tháng năm từ 1/1/2007 đến cuối năm 31/12/2007... vậy thì khi tôi truy xuất dử liệu trong 1 tháng nào đó cụ thể thì dùng name động trong trướng hợp này là hoàn toàn hợp lý...
tôi có dùng name động cho những thứ cần tính về ngày tháng, còn lại toàn là name tĩnh. Sáng nay hơi rãnh tôi thử thay mấy cái name tĩnh bằng name động thì hình như chương trình nhập liệu chậm hẳn đi. Nên tôi mới lên diễn đàn hỏi đây.
 
Bạn thử thế thì đúng rồi... Nếu nó chạy chậm lại thì có nghĩa là name động mới cho vào ko hợp lý... Thế thôi.. Đối với phần truy xuất ngày tháng thì name động tính cực nhanh.. lúc trước tôi cũng gặp trường hợp tương tự thế này rồi..
 
Vậy sẵn đây em hỏi luôn nghe bác Tuấn Anh, cái file của em bác mở được chưa? còn báo lỗi lung tung không? Cho em vài cái góp ý đi...
 
Hi.. hi... nói thật bạn đừng cười.. Tôi có biết gì về mấy món macro đó đâu mà mở... Dù có mở lên cũng như người mù mà thôi... Món này bạn phải hỏi Soibien hoặc Bắp...
Ah... đang có Soibien trên mạng ấy, bạn hỏi bạn ấy đi
 
BNTT đã viết:
Thú thật ý tôi muốn nói về cái file KIM-NGUYEN đã post lên bên mục Excel và Kế toán hôm kia. Chắc bác đã xem qua. Bác coi dùm.
Trong đó, như ý bác Anh Tuấn nói,
Tôi lấy ví dụ cột A tôi ghi ngày tháng năm từ 1/1/2007 đến cuối năm 31/12/2007... vậy thì khi tôi truy xuất dử liệu trong 1 tháng nào đó cụ thể thì dùng name động trong trướng hợp này là hoàn toàn hợp lý...
tôi có dùng name động cho những thứ cần tính về ngày tháng, còn lại toàn là name tĩnh. Sáng nay hơi rãnh tôi thử thay mấy cái name tĩnh bằng name động thì hình như chương trình nhập liệu chậm hẳn đi. Nên tôi mới lên diễn đàn hỏi đây.
Bây giờ mới xem File của bác.
Quả thật đầu tư vào nó cũng khá nhiều công sức phải không???

Em chưa xem hết, chỉ góp ý như sau :
  • Bác nên xem lại cách bố trí File của mình. Định danh rõ các Sheet :
  1. Danh Mục : Chứa các loại danh mục : Tài khoản, khách hàng, hàng hóa, vật tư, chứng từ . .. . .
  2. Data : Chứa tất cả những thông tin nhập vào, nhưng không thừa không thiếu. Những thôg tin có thể lấy bên Danh mục thì không cần cho vào
  3. Temp : Chứa những tính toán trung gian cần phải có để ra các báo cáo, để nhập liệu vào Data
  4. BaoCao : Các mẫu biểu báo cáo cần có
  • Không nên để các công thức "sống" như vậy, khi tính toán xong ta nên copy dán giá trị thôi (hoặc tính trực tiếp trong VBA càng tốt). Đặc biệt DATA không được để công thức, nó chỉ hoàn toàn là giá trị thôi, và không nên lạm dụng cột phụ, name.
  • Các báo cáo không nên dùng Auto Filter, chí ít là dùng Advance Filter hoặc nếu bạn muốn chuyên nghiệp hơn thì dùng vòng lặp của VBA, và còn có thể dùng SQL
  • File phải luôn đặt trong tình trạng Calculation = Manual. Khi chạy một tính toán nào đó và muốn tính toán vùng nào sheet nào thì mới cho vùng đó , sheet đó tính toán. Vì bác cho Calculation = Automatic nên chỉ một thay đổi của File là nó lại tính toán lại toàn bộ các công thức. Như thế chậm là phải.
  • Cái thông tin DN, ta chỉ nhập 1 lần. Không nên phí mất cả 1 Form đâu. Làm các chương trình ta phải tiết kiệm từng tý một, như vậy mới hiệu quả được.
  • ...............
Thân!
 
Cảm ơn rất nhiều những góp ý của bác. Tôi cũng hy vọng sẽ nhận được góp ý hơn từ diễn đàn để tối ưu "sản phẩm" của mình.
- Về Hàm Sumproduct để làm CDPS, tôi chưa giỏi lắm, nhưng vô tình nhặt được trên diễn đàn này bài của bác ThuNghi, bàn về xử lý CDPS bằng SumIf và dùng cột phụ, thấy hay quá nên tôi áp dụng vào đây. Sẽ cố gắng nghiên cứu thêm về Sumproduct, vì tôi cũng biết đây là 1 hàm rất mạnh cho SQL.

Nhân đây cho hỏi bác, thấy mấy hôm bà con nói nhiều về chuyện bản quyền, vậy những code mà tôi cóp nhặt từ diễn đàn này, sử dụng trong Kim-Nguyên, có vi phạm không vậy? Cũng hơi lo lắng nên tôi có làm phần SAYONARA, nhưng không biết như vậy đã đủ chưa?
 
BNTT đã viết:
Nhân đây cho hỏi bác, thấy mấy hôm bà con nói nhiều về chuyện bản quyền, vậy những code mà tôi cóp nhặt từ diễn đàn này, sử dụng trong Kim-Nguyên, có vi phạm không vậy? Cũng hơi lo lắng nên tôi có làm phần SAYONARA, nhưng không biết như vậy đã đủ chưa?

Không nghiêm trọng đâu bác ạ.
Chỉ cần bác đề 1 câu đại ý nói rằng " Cảm ơn GPE . . . " hoặc " Một số ý tưởng và Code được tham khảo trực tiếp từ GPE . . . " . . . .
Như thế là được rồi. Không bắt buộc tại mỗi sub hoặc mỗi dòng code phải nhớ tên tác giả của nó đâu, những dòng cảm ơn để ở 1 cái tổng thể cũng được rồi.

Thân!
 
Web KT

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

Back
Top Bottom