Nhờ anh chị giúp Dictionary thay hàm Sumif (2 người xem)

Liên hệ QC

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

VBA thì có người làm giùm chứ PQry phải tự học, tự làm. Chả dại --=0
Nói chứ VBA giờ không nên đầu tư nhiều biết cũng tốt chứ Power Query, SQL, Python nó đơn giản và dễ viết hơn nhiều. VBA đã tồn tại quá lâu nên mọi người thần thánh quá cái gì cũng lôi vào thôi.
 
Maika8008 đã viết:
VBA thì có người làm giùm chứ PQry phải tự học, tự làm. Chả dại

Nói chứ VBA giờ không nên đầu tư nhiều biết cũng tốt chứ Power Query, SQL, Python nó đơn giản và dễ viết hơn nhiều. VBA đã tồn tại quá lâu nên mọi người thần thánh quá cái gì cũng lôi vào thôi.
Có hiểu người ta nói gì hôn?
Gợi ý: đọc dòng cuối bài #15
 
Mấy cái thống kê này Dir điếc gì cho nó rắc rối chứ SQL với Power Query cho nó nhàn đầu update lên ACE à. Sau biết thêm SQL vs Power Query VBA lâu lâu ms động đến
Bạn nói vậy thì cũng hơi quá, mỗi cái nó có 1 nhiệm vụ riêng, nếu biết áp dụng và áp dụng đúng chỗ thì bạn sẽ thấy nó ổn, còn không thì cho dù nó hay như thế nào đi nữa thì bạn cũng chả thấy nó ổn, SQL là ngôn ngữ có cấu trúc mà nó cũng được những người code VBA áp dụng thông qua ADO rồi đó, còn học lập trình thì ngôn ngữ nào cũng như ngôn ngữ nào, chỉ cần bạn hiểu rõ kỹ thuật lập trình thì chuyện ngôn ngữ chỉ tầm vài tiếng là ra ngay. Nếu dữ liệu không ngay hàng thẳng lối thì bạn dùng những công cụ như bạn kể có đáp ứng được yêu cầu không? Quan trọng là mình dùng nó áp dụng cho cái gì, chứ đừng đánh đồng VBA chả là gì. Nếu VBA chả ra gì thì tại sao nó vẫn phát triển cho tới ngày này người ta vẫn sử dụng, điển hình là VBNet. Còn đã xác định học lập trình rồi thì ta cứ thử mọi thứ, thử rồi mới biến kiến thức hay dở như thế nào, không ai ngay từ đầu làm được cái hoàn hảo đâu. cũng phải học từ cái dở nhất và có thể không áp dụng, cho dù nó không áp dụng thì nó cũng giúp bạn tiến xa hơn 1 tí nữa về cách tư duy.
 
... . . .
(tự xóa phần đàu này vì người hỏi cũng tự xóa bài mình, câu trả ời trở nên rắn mất đầu.)

Nhưng tôi khong khuyến khích cái mớ STT:
- Thứ nhất, tại sao một bảng tổng hợp lại có số thứ tự? Số ấy dùng để làm gì? Cahr thấy lô gic nào cả.
- SQL là ngôn ngữ chú trọng lô gic, và chuyên trên CSDL LH. CSDL LH chân chính không có khái niệm số dòng. Và vì vvaayjphair đi vòng vo tam quốc để lập số dòng.
- Tôi tôn trọng bảng chuẩn hơn bảng hoa lá cành. Chuẩn thì không có STT.

Chú thích:
Thèm STT quá thì thêm dòng code này vào VBA
Ví dụ bắt đầu từ ô Cells(dngBD, cotSTT), và kết thúc ở ô Cells(dngKT, cotSTT)
Range(Cells(dngbd, cotSTT), Cells(dngkt, cotSTT)).Value = _
Evaluate("ROW(" & dngbd & ":" & dngkt & ") - " & (dngbd - 1))
 
... . . .
(tự xóa phần đàu này vì người hỏi cũng tự xóa bài mình, câu trả ời trở nên rắn mất đầu.)

Nhưng tôi khong khuyến khích cái mớ STT:
- Thứ nhất, tại sao một bảng tổng hợp lại có số thứ tự? Số ấy dùng để làm gì? Cahr thấy lô gic nào cả.
- SQL là ngôn ngữ chú trọng lô gic, và chuyên trên CSDL LH. CSDL LH chân chính không có khái niệm số dòng. Và vì vvaayjphair đi vòng vo tam quốc để lập số dòng.
- Tôi tôn trọng bảng chuẩn hơn bảng hoa lá cành. Chuẩn thì không có STT.

Chú thích:
Thèm STT quá thì thêm dòng code này vào VBA
Ví dụ bắt đầu từ ô Cells(dngBD, cotSTT), và kết thúc ở ô Cells(dngKT, cotSTT)
Range(Cells(dngbd, cotSTT), Cells(dngkt, cotSTT)).Value = _
Evaluate("ROW(" & dngbd & ":" & dngkt & ") - " & (dngbd - 1))
Cảm ơn bác đã chỉ dẫn.
Đúng vậy nghĩ lại cũng thấy STT không quan trọng nên không hỏi nữa nên mới xoá bài ạ, nếu cần thì có thể xử lý bằng vba cho đỡ rắc rối ạ.
 
Bạn nói vậy thì cũng hơi quá, mỗi cái nó có 1 nhiệm vụ riêng, nếu biết áp dụng và áp dụng đúng chỗ thì bạn sẽ thấy nó ổn, còn không thì cho dù nó hay như thế nào đi nữa thì bạn cũng chả thấy nó ổn,
Người mà bạn nói kia ý chỉ muốn khoe trình độ của mình thôi. Nếu càn mách cho các thành viên khác thì bạn chỉ cần điểm thẳng vào chỗ cẩu thả sai bấy của y:
Điểm tầm bậy là Code thớt này chả liên quan gì đến Dir [sic]

.... Nếu VBA chả ra gì thì tại sao nó vẫn phát triển cho tới ngày này người ta vẫn sử dụng, điển hình là VBNet. ...
Chỗ này thì bạn lầm.
1. Ngày xưa, nhiều nền tảng dùng ngôn ngữ BASIC để làm JCL (Job Command Language)
. Bạn nào ngày xưa có chơi cái Commodore hay giaudf hơn, có cái Apple II thì biết.
2. BASIC là sở thích của lão Bill Gates. Trước khi bán ddowcj DOS cho IBM lão ta vẫn thường vọc với Basic. Hòi còn là sinh viên cũng vậy.
3. VBA được ra để hổ trợ sự giới hạn của Access. Sau đó nhập vào Excel và các ứng dụng Office khác. VBA chỉ được MS tiêm thuốc si-te-roi khi bên phát triển cho nó khả năng nói với các API, các OLE khác trong hệ thống.
4. VB.NET chỉ có thuật ngữ giống VBA thôi. Trên căn bản lập trình VB.NET là loại ngôn ngữ Hướng Đối Tượng. VBA hoàn toàn thụt vòi khi đụng vào HĐT.
5. Sau bao nhiêu năm cố gắng bảo vệ ngôn ngữ con đẻ (có bản quyền) là VBA, cuối cùng thì MS cũng không thể chống lại áp lực thị trường. Hiện nay họ đã bắt đầu cho chạy Office Script la ngôn ngữ khá giống JavaScript. (Google Script cũng căn bản là JavaScript).
 
Minh xin lỗi các bạn. thực sực mình chỉ xem video về dictionary đồng thời mình áp dụng vào bài toàn của mình. mình chỉ thiếu và không biết về thuật toán của dictionary về thời gian. nếu mình dùng sumif và chấp nhận mối lúc khi thay đổi dữ liệu của data mình phải cập nhật. nhưng mình thấy mỗi lầm như vậy bản thân mình sẽ có lẽ thiếu sót. vì data sẽ thay đỗi liên tục.
Mình chân thành cảm ơn anh chị đã hỗ trợ, giúp mình rất nhiều.
1. Về thuật toán về dictionary.
2. về ADO.
Ngoài ra thực sự mình mông muốn trên diễn đàn này thực sự đoàn kết, chân thành gắn bó.
Thực sự do mình đặt câu hỏi chưa đúng mình suy nghĩ có bảng kế bên,
Lần nữa chân thành cám ơn anh chị đã giúp các thuật toán giúp mình đạt kết quả đúng nhất.
 
Thèm STT quá thì thêm dòng code này vào VBA
Ví dụ bắt đầu từ ô Cells(dngBD, cotSTT), và kết thúc ở ô Cells(dngKT, cotSTT)
Range(Cells(dngbd, cotSTT), Cells(dngkt, cotSTT)).Value = _
Evaluate("ROW(" & dngbd & ":" & dngkt & ") - " & (dngbd - 1))

Range(Cells(dngbd, cotSTT), Cells(dngkt, cotSTT)).Value = evaluate("row(R:R)")

là được rồi anh.
 
Range(Cells(dngbd, cotSTT), Cells(dngkt, cotSTT)).Value = evaluate("row(R:R)")

là được rồi anh.
Viết vầy có lẽ nhanh hơn một tẹo.
Mã:
Range(Cells(dngbd, cotSTT), Cells(dngkt, cotSTT)).Value = Evaluate("row(A1:A" & CStr(dngkt - dngbd + 1) & ")")
 
Xin chào tất cả mọi người,
Vậy trong trường hợp dữ liệu tại cột B có dòng trống xen kẽ như dạng ảnh kèm,
OT muốn đánh STT theo cột B nếu có dòng trống thì sẽ bắt đầu lại từ 1.
Thì với cách sử dụng "Evaluate" công thức sẽ như thế nào ạ?

1683684482670.png
 

File đính kèm

Xin chào tất cả mọi người,
Vậy trong trường hợp dữ liệu tại cột B có dòng trống xen kẽ như dạng ảnh kèm,
OT muốn đánh STT theo cột B nếu có dòng trống thì sẽ bắt đầu lại từ 1.
Thì với cách sử dụng "Evaluate" công thức sẽ như thế nào ạ?

View attachment 289937
Không biết đúng ý chị không?
Công thức tại A2:
Mã:
=IF(B2="","",IF(ISNUMBER(A1),A1+1,1))
 
Cảm ơn bạn @THÓC SAMA rất nhiều.
Nếu dùng công thức hay vòng lặp OT làm được nhưng OT đang hỏi cách sử dụng "Evaluate" như các bài trên theo cách mà bác @VetMini đã chỉ ấy ạ.
Đã nghe lời bác ấy thì phải nghe cho trót: "tại sao một bảng tổng hợp lại có số thứ tự? Số ấy dùng để làm gì? Chả thấy lô gic nào cả."
Tuy nhiên nếu không phải bảng tổng hợp (là 1 báo cáo hoàn chỉnh để in), và quá yêu cái valuate, thì evaluate chính cái công thức excel.
 
Đã nghe lời bác ấy thì phải nghe cho trót: "tại sao một bảng tổng hợp lại có số thứ tự? Số ấy dùng để làm gì? Chả thấy lô gic nào cả."
Tuy nhiên nếu không phải bảng tổng hợp (là 1 báo cáo hoàn chỉnh để in), và quá yêu cái valuate, thì evaluate chính cái công thức excel.
Chào chú Mỹ,
Ở trên con cũng có đồng ý là STT không quan trọng rồi mà.
Nhưng đã lỡ hỏi rồi thì con hỏi luôn tham khảo để mở mang thêm mà chú.
 
Tôi viết code theo trường phái "việc nào tách riêng việc nấy". Trái với phần lớn dân ở đây theo trường phái "gom lại một chỗ càng tốt".

Vì lý luận rằng cái phần số thứ tự là công việc hoa lá cảnh cho nên tôi tách nó riêng ra. Và ở trường hợp này, hàm Evaluate rất hiệu quả.

Chú thích: hàm Evaluate vốn nằm trong nhóm "nguy hiểm". Vì vậy MS không để cho nó nổi bật lắm, phải mò từ Excel đời từ Macro 4. Khi sử dụng phải thử trước xem có đúng ý.
Hàm này dùng để tính một biểu thức ở dạng chuỗi. Vì nó có thể tính dọc (hoặc ngang) tùy theo bên cần gán cho nên dùng nó để tính các biểu thức đơn giản trên bảng tính thì rất nhanh.
Chú thích 2:
Tính chất của Evaluate là nhận tham số theo dạng chuỗi chi nên ta có thể tạo chuỗi với đầy đủ thông số. Khác với dạng viết tắt của nó là cặp ngoặc vuông ([...]). Tất cả thông số bên trong cặp này thì phải viết in hệt như trên bảng tính, không có biến gì cả.
Ví dụ:
arr = [A1:B5] : copy value ở range từ A1 đến B5
arr = Evaluate("A1:B5"), cũng như trên nhưng tham số là chuỗi cho nên nếu:
a = "A"
b = "B"
thì ta có thể viết
arr = Evaluate(a & "1" & ":" & b & "5")
Lưu ý: đây tôi chỉ dùng ví dụ giản dị. Trên thực tế với ví dụ này thì dùng thẳng thuộc tính Range nhanh hơn nhiều.
 
Lần chỉnh sửa cuối:
Chào chú Mỹ,
Ở trên con cũng có đồng ý là STT không quan trọng rồi mà.
Nhưng đã lỡ hỏi rồi thì con hỏi luôn tham khảo để mở mang thêm mà chú.
Yêu thì nhận là yêu chứ gì mà ngại. Với công thức của bạn Thóc_Sama =IF(B2="","",IF(ISNUMBER(A1),A1+1,1)), không dùng evaluate:
Mã:
[A2:A10] = ("=IF(RC[1]="""","""",if(isnumber(R[-1]C),R[-1]C + 1,1))")
[A2:A10]=[A2:A10].value
 
Xin chào tất cả mọi người,
Vậy trong trường hợp dữ liệu tại cột B có dòng trống xen kẽ như dạng ảnh kèm,
OT muốn đánh STT theo cột B nếu có dòng trống thì sẽ bắt đầu lại từ 1.
Thì với cách sử dụng "Evaluate" công thức sẽ như thế nào ạ?

View attachment 289937
Tại sao không dùng vòng lặp For Next cho đơn giản??? Tại sao cứ phải Evaluate???
 
Web KT

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

Back
Top Bottom