có cách nào kết hợp lọc để tính tổng có thể copy nhanh không ạh? (1 người xem)

Liên hệ QC

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

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
327
Thưa các sư phụ, em thấy có vấn đề hàng ngày em rất hay phải làm nếu bình thường nó rất đơn giản vì đơn thuần là phép tính cộng (sum). Nhưng chương trình của em hay bị lỗi để cẩn thận em hay phải sum lại cho chắc ăn.
Ví dụ tháng 1 lương của em gồm có 3 người, tháng 2 gồm 2 người, tháng 3 có 4 người (như ví dụ em đính kèm),
Thông thường để tính từng tháng em phải dùng cộng (hàm sum) cho từng tháng, nếu thực tế bảng tính có khoảng 2000 dòng thì số lần sum thủ công rất lâu. Vậy em muốn xin các sư phụ chỉ giáo có cách nào mà mình lọc kết hợp kiểu gì để tính cho tháng 1, các tháng kia mình chỉ cần copy (rê chuột) là được không ạh?
Xin các sư phụ chỉ giáo.
 

File đính kèm

Thưa các sư phụ, em thấy có vấn đề hàng ngày em rất hay phải làm nếu bình thường nó rất đơn giản vì đơn thuần là phép tính cộng (sum). Nhưng chương trình của em hay bị lỗi để cẩn thận em hay phải sum lại cho chắc ăn.
Ví dụ tháng 1 lương của em gồm có 3 người, tháng 2 gồm 2 người, tháng 3 có 4 người (như ví dụ em đính kèm),
Thông thường để tính từng tháng em phải dùng cộng (hàm sum) cho từng tháng, nếu thực tế bảng tính có khoảng 2000 dòng thì số lần sum thủ công rất lâu. Vậy em muốn xin các sư phụ chỉ giáo có cách nào mà mình lọc kết hợp kiểu gì để tính cho tháng 1, các tháng kia mình chỉ cần copy (rê chuột) là được không ạh?
Xin các sư phụ chỉ giáo.

Bạn thử nghiên cứu Pivot Table xem sao? Bạn tải về tham khảo xem nha!
 
Bạn thử nghiên cứu Pivot Table xem sao? Bạn tải về tham khảo xem nha!
Em chưa thạo về cái này lắm nhưng nhược điểm của Pivot Table là không dùng in được như một bản chính thống, em đang nghĩ đến phương án dùng cột phụ để làm sao cho máy hiểu được cái gì là thành phần của 1, cái gì là thành phần của 2. Sau đó dùng Sumif cộng vào, ý tưởng lọc Auto filter làm sao để cộng nhanh em mới nghĩ ra thôi nhưng hơi khó vì mỗi ô tính tổng có số hàng khác nhau.
 
Thưa các sư phụ, em thấy có vấn đề hàng ngày em rất hay phải làm nếu bình thường nó rất đơn giản vì đơn thuần là phép tính cộng (sum). Nhưng chương trình của em hay bị lỗi để cẩn thận em hay phải sum lại cho chắc ăn.
Ví dụ tháng 1 lương của em gồm có 3 người, tháng 2 gồm 2 người, tháng 3 có 4 người (như ví dụ em đính kèm),
Thông thường để tính từng tháng em phải dùng cộng (hàm sum) cho từng tháng, nếu thực tế bảng tính có khoảng 2000 dòng thì số lần sum thủ công rất lâu. Vậy em muốn xin các sư phụ chỉ giáo có cách nào mà mình lọc kết hợp kiểu gì để tính cho tháng 1, các tháng kia mình chỉ cần copy (rê chuột) là được không ạh?
Xin các sư phụ chỉ giáo.
Bạn làm như sau:
- Giả sử lúc đầu tại cột C chưa có công thức nào, tức những cell bạn chuẩn bị điền công thức là đang rổng ---> Vậy hãy AutoFilter cột C theo điều kiện Blanks
- Quét chọn toàn bộ các cell ở cột C
- Gõ vào thanh Formula công thức:
PHP:
=SUM($C3:$C$10000)-2*SUMIF($A3:$A$10000,"<>",$C3:$C$10000)
- Bấm tổ hợp phím Ctrl + Enter
---------------
Dạng bài này đã nói trên diễn đàn ít nhất chục lần rồi ---> Nếu bạn tìm thì đã thấy
 
Bạn làm như sau:
- Giả sử lúc đầu tại cột C chưa có công thức nào, tức những cell bạn chuẩn bị điền công thức là đang rổng ---> Vậy hãy AutoFilter cột C theo điều kiện Blanks
- Quét chọn toàn bộ các cell ở cột C
- Gõ vào thanh Formula công thức:
PHP:
=SUM($C3:$C$10000)-2*SUMIF($A3:$A$10000,"<>",$C3:$C$10000)
- Bấm tổ hợp phím Ctrl + Enter
---------------
Dạng bài này đã nói trên diễn đàn ít nhất chục lần rồi ---> Nếu bạn tìm thì đã thấy
Thày ơi, sao đệ tử thực hành mà không được ah.
 
Bạn cứ tìm kiếm cộng theo số thứ tự trên diễn đàn sẽ có nhiều giải pháp

Thày ơi, sao đệ tử thực hành mà không được ah.
Mình thấy cái tính tổng này theo số thứ tự cũng nhiều. Tặng bạn cái này, mình học được của thày ndu96081631 đấy. Bạn xem tham khảo nhé
 
Xin các thày bày giúp cho em các dùng VBA (Funtion) trong TH này

Thưa các sư phụ, em thấy có vấn đề hàng ngày em rất hay phải làm nếu bình thường nó rất đơn giản vì đơn thuần là phép tính cộng (sum). Nhưng chương trình của em hay bị lỗi để cẩn thận em hay phải sum lại cho chắc ăn.
Ví dụ tháng 1 lương của em gồm có 3 người, tháng 2 gồm 2 người, tháng 3 có 4 người (như ví dụ em đính kèm),
Thông thường để tính từng tháng em phải dùng cộng (hàm sum) cho từng tháng, nếu thực tế bảng tính có khoảng 2000 dòng thì số lần sum thủ công rất lâu. Vậy em muốn xin các sư phụ chỉ giáo có cách nào mà mình lọc kết hợp kiểu gì để tính cho tháng 1, các tháng kia mình chỉ cần copy (rê chuột) là được không ạh?
Xin các sư phụ chỉ giáo.
Về cách dùng công thức em cũng đã nắm sơ qua được, nhưng có vẻ như cách nhìn trực quan (để kiểm tra) nhìn hơi phức tạp, em chưa làm được cách làm dùng VBA (Funtion) tức là công thức nó cũng hiện ra giống hệt như mình cộng thủ công vậy, kết quả đầu ra có link với dữ liệu đầu vào (không dùng Sub vì như vậy khi chỉnh sửa nó không update được ah). Xin các thày bày giúp em với vì bọn em đi làm thầu XD cho những gói thầu to (in ra khoảng hàng ngàn trang), em đã biết làm công thức cho nhanh. Tuy vậy, em vẫn muốn học thêm VBA để có thẻ để người thứ 3 (sếp em) dễ kiểm soát không sếp ngồi bên cạnh lại bảo sao em không dùng Sum thông thường mà dùng công thức phức tạp thế này anh không hiểu được.
 
Lần chỉnh sửa cuối:

Thưa thày nếu số thứ tự do Paslink từ Sheet khác hoặc lý do gì chẳng hạn có thêm số 0 (nhưng số 0 ở chế độ ở ẩn) thì công thức SUM($C3:$C$10000)-2*SUMIF($A3:$A$10000,"<>",$C3:$C$10000) phần đỏ phải sửa thành thế nào ạh?
 
Thưa thày nếu số thứ tự do Paslink từ Sheet khác hoặc lý do gì chẳng hạn có thêm số 0 (nhưng số 0 ở chế độ ở ẩn) thì công thức SUM($C3:$C$10000)-2*SUMIF($A3:$A$10000,"<>",$C3:$C$10000) phần đỏ phải sửa thành thế nào ạh?
Bạn cứ đưa file lên đi, tôi làm cho
Nói chung là bạn phải tìm cho được 1 cột nào đó mà có sự khác nhau giữa các cell tương ứng với cell rổng ở cột C so với các cell khác, như vậy là có thể thiết lập công thức được rồi
Không thì dùng SUBTOTAL như bài #6 ấy ---> Vô vàn cách
 
Lần chỉnh sửa cuối:
Bạn cứ đưa file lên đi, tôi làm cho
Nói chung là bạn phải tìm cho được 1 cột nào đó mà có sự khác nhau giữa các cell tương ứng với cell rổng ở cột C so với các cell khác, như vậy là có thể thiết lập công thức được rồi
Không thì dùng SUBTOTAL như bài #6 ấy ---> Vô vàn cách
Dạ, Em lấy luôn bài của thày nhưng có thêm số 0 vào giữa, tuy nhiên khi tính tổng theo số thứ tự chỉ coi số 0 như ký tự trắng
 

File đính kèm

Dạ, Em lấy luôn bài của thày nhưng có thêm số 0 vào giữa, tuy nhiên khi tính tổng theo số thứ tự chỉ coi số 0 như ký tự trắng
Trường hợp của bạn chỉ cần sửa "<>" thành ">0" là được rồi
PHP:
=SUM($C3:$C$10000)-2*SUMIF($A3:$A$10000,">0",$C3:$C$10000)
hoặc dùng SUBTOTAL
PHP:
=2*SUBTOTAL(109,$C3:$C$10000)-SUM($C3:$C$10000)
 
Lần chỉnh sửa cuối:
Trường hợp của bạn chỉ cần sửa "<>" thành ">0" là được rồi
PHP:
=SUM($C3:$C$10000)-2*SUMIF($A3:$A$10000,">0",$C3:$C$10000)
hoặc dùng SUBTOTAL
PHP:
=2*SUBTOTAL(109,$C3:$C$10000)-SUM($C3:$C$10000)
Hôm nọ em cũng nhớ cũng thử một bài toán nhưng em nhớ hình như là ô trống thì nó không hiểu là bao nhiêu để so sánh vơi 0 thày ạh ? Để em về em thử có gì em xin hỏi thày sau.
 
Em muốn làm dạng hàm mà KQ hiện trên màn hình như làm thủ công vậy

Em đã xem rồi, nhưng những ví dụ trong đó đều là dạng Sub, ý em là làm VBA theo kiểu hàm Funtion, qua đó nhân dịp nghỉ Tết em sẽ thay đổi đầu bài để ôn luyện cho kỹ, thời gian sau em sẽ đi vào từng đối tượng như tạo nút bottom sau, em thấy các file trong ví dụ bác chỉ phần lớn đều ghi một số Marco hình như chỉ liên quan đến định dạng (em muốn những cái trang trí hình thức Font thì em sẽ học sau), em muốn bắt chước các thày đi nghiên cứu chuyên sâu chuyển thuật toán sang Fution để chạy bác ạh, tức là gần như bài toán về VBA sum VL, NC, MTC đính kèm theo chữ ký của bác, nhưng VD đó hơi phức tạp, em muốn đi từ cái đơn giản trước đã. Xin mọi người bớt chút thời gian hộ em
 
Lần chỉnh sửa cuối:
Em đã xem rồi, nhưng những ví dụ trong đó đều là dạng Sub, ý em là làm VBA theo kiểu hàm Funtion, qua đó nhân dịp nghỉ Tết em sẽ thay đổi đầu bài để ôn luyện cho kỹ, thời gian sau em sẽ đi vào từng đối tượng như tạo nút bottom sau, em thấy các file trong ví dụ bác chỉ phần lớn đều ghi một số Marco hình như chỉ liên quan đến định dạng (em muốn những cái trang trí hình thức Font thì em sẽ học sau), em muốn bắt chước các thày đi nghiên cứu chuyên sâu chuyển thuật toán sang Fution để chạy bác ạh, tức là gần như bài toán về VBA sum VL, NC, MTC đính kèm theo chữ ký của bác, nhưng VD đó hơi phức tạp, em muốn đi từ cái đơn giản trước đã. Xin mọi người bớt chút thời gian hộ em
ô hay, thế bác xem file em gửi đây file đính kèm (Tong _Funtion_VBA) chẳng là hàm thì là gì? công thức tại ô D6 như sau: TC(A7:$A$21;B7:$B$21) tức tên hàm là TC còn gì nữa.
Ah, hay là ý bác làm thế nào mà vẫn như làm thủ công cho sếp bác dễ quan sát (dùng sum bình thường cho trực quan) chứ không dùng đến hàm xây dựng định nghĩa TC chứ gì, kiểu như khi bôi toàn bộ cột C chẳng hạn thì những ô cần cộng thủ cộng sẽ tự điền vào như thủ công đúng không? (ý như file 02 đính kèm chăng)? Nếu đúng thế, Cái này về thuật toán em hình dung ra được nhưng làm chưa xong có gì mai em thử làm lại xem (Kiểu áp dụng chạy Macros Alt + F8?)
 

File đính kèm

Lần chỉnh sửa cuối:
Đây là một tiện ích nhỏ rất cần thiết đối với dân kỹ thuật

Đặc biệt là những người làm dự toán XD, việc xây dựng mẫu kiểu này sẽ giúp cho việc làm rất nhanh, đặc biệt là số dòng rất lớn, hay phải cộng tổng nhiều phân đoạn nhỏ. Em có ý tưởng thế này mong các sư phụ giúp vì em làm mãi chẳng được:
1) Viết một Macro sao cho khi tính ta quét chọn 2 cột A và D chẳng hạn, theo nguyên tắc số dòng quét 2 cột A và D là phải bằng nhau tựa như hàm sumif vậy (A là cột đánh số thứ tự có vai trò chia phân đoạn cần tính tổng, D là cột cần tính tổng theo từng phân đoạn) sau đó khi chạy Alt+F8 thì chương trình cứ nhìn tên số thứ tự của cột A mà tự động tham chiếu điền công thức sum vào cột D.
2) Để sử dụng cho các file ta có thể xuất Macro này ra dưới dạng Add-Ins thêm vào Menu (vì qua sử dụng em thấy nếu chuyển đổi sang Add-Ins chương trình Bkav home không quét virut Macro_rất hay trong việc sử dụng).
Như vậy bất cứ khi nào cần tính tổng cho mọi công việc hàng ngày có tính chất như bài này; bất kỳ lúc nào ta cũng thực hiện được nhanh, chóng mà vẫn đảm bảo được trực quan như làm thủ công(công thức thì thể hiện như sum bình thường giống file 02 em vừa gửi lên ngay trên ở cùng chủ đề này ah).
Em bắt chước cách làm của anh Phương hướng dẫn bài VBA sum VL, NC, MTC theo chủ đề đính với chữ ký của em ở bên dưới mà không sao làm được.
Tối nay em tập trung giải quyết 02 vấn đề là bài toán này và vụ Portable mà chẳng thu được kết quả gì; em, bạn nguyenmanhnam đều là dân KTXD cả đều rất cần các bài toán nhỏ này. Nhờ các sư phụ giúp em với.
 
Lần chỉnh sửa cuối:
Vấn đề là biến ý tưởng thành hiện thực thôi.

Đặc biệt là những người làm dự toán XD, việc xây dựng mẫu kiểu này sẽ giúp cho việc làm rất nhanh, đặc biệt là số dòng rất lớn, hay phải cộng tổng nhiều phân đoạn nhỏ. Em có ý tưởng thế này mong các sư phụ giúp vì em làm mãi chẳng được:
1) Viết một Macro sao cho khi tính ta quét chọn 2 cột A và D chẳng hạn, theo nguyên tắc số dòng quét 2 cột A và D là phải bằng nhau tựa như hàm sumif vậy (A là cột đánh số thứ tự có vai trò chia phân đoạn cần tính tổng, D là cột cần tính tổng theo từng phân đoạn) sau đó khi chạy Alt+F8 thì chương trình cứ nhìn tên số thứ tự của cột A mà tự động tham chiếu điền công thức sum vào cột D.
2) Để sử dụng cho các file ta có thể xuất Macro này ra dưới dạng Add-Ins thêm vào Menu (vì qua sử dụng em thấy nếu chuyển đổi sang Add-Ins chương trình Bkav home không quét virut Macro_rất hay trong việc sử dụng).
Như vậy bất cứ khi nào cần tính tổng cho mọi công việc hàng ngày có tính chất như bài này; bất kỳ lúc nào ta cũng thực hiện được nhanh, chóng mà vẫn đảm bảo được trực quan như làm thủ công(công thức thì thể hiện như sum bình thường giống file 02 em vừa gửi lên ngay trên ở cùng chủ đề này ah).
Em bắt chước cách làm của anh Phương hướng dẫn bài VBA sum VL, NC, MTC theo chủ đề đính với chữ ký của em ở bên dưới mà không sao làm được.
Tối nay em tập trung giải quyết 02 vấn đề là bài toán này và vụ Portable mà chẳng thu được kết quả gì; em, bạn nguyenmanhnam đều là dân KTXD cả đều rất cần các bài toán nhỏ này. Nhờ các sư phụ giúp em với.
Thực ra từ trước đến nay em mới nghĩ ra được cách dùng cột phụ & hàm sumif thôi, qua các bài các anh chị gửi em có thêm một số giải pháp hay quá, nhưng xây dựng được cách làm bác Phanhanhdai đề cập em nghĩ rằng nó sẽ là giải pháp tốt nhất bởi chỉ cần lựa chọn 2 cột bất kỳ do người làm muốn lấy tiêu chí nào cũng được, tư duy như thế em hình dung như sau có phải không ah:
- Đầu tiên khi chọn lệnh chương trình thông báo 1: Hãy lựa chọn vùng phân chia số đoạn (có một nút sổ xuống cho mình lựa chọn như khi dùng Con&ditional Formatting) ý. Khai báo xong nhấn Enter.
- Chương trình thông báo lựa chọn vùng cần điền giá trị (cột D) chẳng hạn. Tương tự như vậy.
Sau đó OK là chương trình sẽ tự động điền cho cột D trên cơ sở tham chiếu từ cột A sang.
Không biết em nghĩ thế có phức tạp không nhỉ. Vì em có thấy ở diễn đàn từng có bài toán nào làm thế rồi (tất nhiền bài toán có khác)
 

File đính kèm

Nếu giải quyết được bài toán này thì sẽ giải quyết được rất nhiều KL công việc

Em đã dồn hết tâm huyết ý tưởng vào bài này (tạo menu tính tổng các phân đoạn chỉ việc chọn 2 cột thôi), nếu làm được như vậy thì em có thể sáng tạo ra rất nhiều trong công việc, ví dụ như khi phân tích đơn giá tổng hợp khi cộng chi phí cho riêng VL, NC, MTC của từng công việc trước kia hết sức mệt thì nay em chỉ việc tạo cột phụ (có vai trò như cột A sau đó đánh số thứ tự cho cột phụ đó là OK ngay) sau đó em xoá cột phụ đi vẫn giữ được công thức và rất nhiều cái em có thể tận dụng nó.
Cả đêm hôm qua em hầu như không ngủ để nghĩ về nó, tuy nhiên trình VBA của em vẫn chưa đáp ứng được. Em thật sự muốn sự giúp đỡ của các thày, nếu các thày giúp em được thì coi như không có gì vui hơn đối với em đón Tết nữa.
 
Xin hãy đổi cho em từ Sub về Funtion với

Em có tìm được bài viết của bác Anhtuan1066, đúng là ý tưởng mà em đã nghĩ, em rất thích kiểu làm này. Xin hãy chỉ cho em cách chuyển Sub về Fution với ạh (để em biến nó thành Add_Ins).
 

File đính kèm

Viết thử 1 Function SubSum đơn giản, bạn thử test xem, có điều khi filter chưa vừa ý lắm.
PHP:
Function SubSum(CriteriaRng As Range, SumRng As Range)
   Application.Volatile (True)
   EndR = CriteriaRng.End(xlDown).Row - 1
   FirstR = SumRng.Row
   SumCol = SumRng.Column
   SubSum = Application.Sum(Range(Cells(FirstR, SumCol), Cells(EndR, SumCol)))
End Function
Mượn file bài trên: Có 2 sheet, 1 sheet có chừa dòng tổng con trong cột và 1 sheet không chừa dòng, phải sum ở cột khác.
Cách dùng đơn giản ở chỗ:
- Chỉ có 2 tham số
- Tham số thứ nhất là ô điều kiện (ngày, số phiếu)
- Tham số thứ 2 là vùng tính tổng, ô đầu là ô đầu tiên chứa số cần tính tổng trở xuống, ô cuối là ô cuối cùng của cả bảng, hoặc dư ra cũng được. Và chỉ chọn 1 ô đầu thôi, cũng được nốt!
- Có thể copy paste

Tất nhiên đơn giản, dễ dùng thì cũng có hạn chế là cấu trúc bảng phải đồng nhất và theo mẫu (đã có 2 mẫu). Nếu bạn nào có mẫu khác thì gởi lên để mình cải tiến lại cho tổng quát
 

File đính kèm

Lần chỉnh sửa cuối:
...được:
1) Viết một Macro sao cho khi tính ta quét chọn 2 cột A và D chẳng hạn, theo nguyên tắc số dòng quét 2 cột A và D là phải bằng nhau tựa như hàm sumif vậy (A là cột đánh số thứ tự có vai trò chia phân đoạn cần tính tổng, D là cột cần tính tổng theo từng phân đoạn) sau đó khi chạy Alt+F8 thì chương trình cứ nhìn tên số thứ tự của cột A mà tự động tham chiếu điền công thức sum vào cột D.
2) Để sử dụng cho các file ta có thể xuất Macro này ra dưới dạng Add-Ins thêm vào Menu (vì qua sử dụng em thấy nếu chuyển đổi sang Add-Ins chương trình Bkav home không quét virut Macro_rất hay trong việc sử dụng).
Như vậy bất cứ khi nào cần tính tổng cho mọi công việc hàng ngày có tính chất như bài này; bất kỳ lúc nào ta cũng thực hiện được nhanh, chóng mà vẫn đảm bảo được trực quan như làm thủ công(công thức thì thể hiện như sum bình thường giống file 02 em vừa gửi lên ngay trên ở cùng chủ đề này ah).
Cái này làm cũng được, lấy dữ liệu bài đầu, ta chọn cột B cho hợp lý (không cần chọn 2 cột)
Mã:
Public Sub YeuCauNgoWa()
    Dim Vung, iDau, iCuoi, J
    Set Vung = Application.InputBox("Nhap dia chi", "Vùng chon", Type:=8)
    With Range([c2], [c10000].End(xlUp))
        .Font.ColorIndex = 0
        .Interior.ColorIndex = xlNone
    End With
        For J = Vung.Rows.Count To 1 Step -1
            If J = Vung.Rows.Count Then
                iCuoi = J + 1
            ElseIf Vung(J).Offset(, -1) = "" And Vung(J + 1).Offset(, -1) <> "" Then
                iCuoi = J + 1
            End If
                If Vung(J).Offset(, -1) = "" And Vung(J - 1).Offset(, -1) <> "" Then iDau = J + 1
                    If Vung(J).Offset(, -1) <> "" Then
                        With Vung(J).Offset(, 1)
                            .Formula = "=SUM(" & Cells(iDau, 3).Address & ":" & Cells(iCuoi, 3).Address & ")"
                            .Font.ColorIndex = 3
                            .Interior.ColorIndex = 6
                        End With
                    End If
        Next
End Sub
Cách làm:
Bấm Ctrl + M ==> chọn vùng dữ liệu ở cột B cho hộp Input (trong bài là B2:B21) ==> Ok ==> nó sẽ gán công thức như mình làm thủ công vậy
(Bấm Ctrl + Shilf + M ==> chọn vùng dữ liệu ở cột B (trong bài là B2:B21) ==> Ok ==> nó công luôn, không gán công thức)
Theo mình nghĩ, dạng bài thế này, dữ liệu của TA, code của TA thì cần "đếch" gì hộp thoại, ta cứ khai báo trong code, nó chạy cái "vèo" là xong, có thêm, bớt, sửa ta cũng chỉ bấm Ctrl + M cái "vèo" là...xong (nhanh gấp mấy lần xài công thức ý)
Híc, đây là ý kiến riêng của mình thôi nhé
 

File đính kèm

Xin đa tạ các thày đã chỉ bảo, Excel em đã biết làm kha khá. Giờ này được mọi người giúp đỡ, chắc dịp nghỉ này em có dịp nghiên cứu nâng cao tay nghề VBA rùi. Em sẽ cố gắng trong thời gian ngắn sắp tới tới sẽ tự mình làm được một số công việc (không trình độ A, B, C) lắm lúc mệt thật. Chúc mọi người trên diễn đàn GPE sang năm mới mọi sự an khang, thịnh vượng.
 
Cái này làm cũng được, lấy dữ liệu bài đầu, ta chọn cột B cho hợp lý (không cần chọn 2 cột)
Mã:
Public Sub YeuCauNgoWa()
Dim Vung, iDau, iCuoi, J
Set Vung = Application.InputBox("Nhap dia chi", "Vùng chon", Type:=8)
With Range([c2], [c10000].End(xlUp))
.Font.ColorIndex = 0
.Interior.ColorIndex = xlNone
End With
For J = Vung.Rows.Count To 1 Step -1
If J = Vung.Rows.Count Then
iCuoi = J + 1
ElseIf Vung(J).Offset(, -1) = "" And Vung(J + 1).Offset(, -1) <> "" Then
iCuoi = J + 1
End If
If Vung(J).Offset(, -1) = "" And Vung(J - 1).Offset(, -1) <> "" Then iDau = J + 1
If Vung(J).Offset(, -1) <> "" Then
With Vung(J).Offset(, 1)
.Formula = "=SUM(" & Cells(iDau, 3).Address & ":" & Cells(iCuoi, 3).Address & ")"
.Font.ColorIndex = 3
.Interior.ColorIndex = 6
End With
End If
Next
End Sub
Cách làm:
Bấm Ctrl + M ==> chọn vùng dữ liệu ở cột B cho hộp Input (trong bài là B2:B21) ==> Ok ==> nó sẽ gán công thức như mình làm thủ công vậy
(Bấm Ctrl + Shilf + M ==> chọn vùng dữ liệu ở cột B (trong bài là B2:B21) ==> Ok ==> nó công luôn, không gán công thức)
Theo mình nghĩ, dạng bài thế này, dữ liệu của TA, code của TA thì cần "đếch" gì hộp thoại, ta cứ khai báo trong code, nó chạy cái "vèo" là xong, có thêm, bớt, sửa ta cũng chỉ bấm Ctrl + M cái "vèo" là...xong (nhanh gấp mấy lần xài công thức ý)
Híc, đây là ý kiến riêng của mình thôi nhé
Vâng, đối với thày thì nó quá đơn giản, nhưng nó rất có ý nghĩa với em thày ạh. Nó là cơ sở em tiếp cận VBA từng bước 1. Cám ơn thày nhiều.
 
Cái này làm cũng được, lấy dữ liệu bài đầu, ta chọn cột B cho hợp lý (không cần chọn 2 cột)
Mã:
Public Sub YeuCauNgoWa()
Dim Vung, iDau, iCuoi, J
Set Vung = Application.InputBox("Nhap dia chi", "Vùng chon", Type:=8)
With Range([c2], [c10000].End(xlUp))
.Font.ColorIndex = 0
.Interior.ColorIndex = xlNone
End With
For J = Vung.Rows.Count To 1 Step -1
If J = Vung.Rows.Count Then
iCuoi = J + 1
ElseIf Vung(J).Offset(, -1) = "" And Vung(J + 1).Offset(, -1) <> "" Then
iCuoi = J + 1
End If
If Vung(J).Offset(, -1) = "" And Vung(J - 1).Offset(, -1) <> "" Then iDau = J + 1
If Vung(J).Offset(, -1) <> "" Then
With Vung(J).Offset(, 1)
.Formula = "=SUM(" & Cells(iDau, 3).Address & ":" & Cells(iCuoi, 3).Address & ")"
.Font.ColorIndex = 3
.Interior.ColorIndex = 6
End With
End If
Next
End Sub
Cách làm:
Bấm Ctrl + M ==> chọn vùng dữ liệu ở cột B cho hộp Input (trong bài là B2:B21) ==> Ok ==> nó sẽ gán công thức như mình làm thủ công vậy
(Bấm Ctrl + Shilf + M ==> chọn vùng dữ liệu ở cột B (trong bài là B2:B21) ==> Ok ==> nó công luôn, không gán công thức)
Theo mình nghĩ, dạng bài thế này, dữ liệu của TA, code của TA thì cần "đếch" gì hộp thoại, ta cứ khai báo trong code, nó chạy cái "vèo" là xong, có thêm, bớt, sửa ta cũng chỉ bấm Ctrl + M cái "vèo" là...xong (nhanh gấp mấy lần xài công thức ý)
Híc, đây là ý kiến riêng của mình thôi nhé
Đúng kiểu em cần rồi, nếu thày chữa kiểu gì mà vùng dữ liệu cần nhập là cột A và cột C thì tốt quá (bỏ qua vai trò cột B). Vì mục đích của em là nghiên cứu để phát triển áp dụng trong thực tế thày ạh.
Của thày có ưu điểm lựa chọn nhanh (do chỉ cần 1 cột) nhưng có nhược điểm hơi cứng do 3 cột A, B, C liền nhau thì chương trình mới hiểu. Em muốn khi sử dụng em có thể dùng 2 cột cách nhau như cột E và H chẳng hạn (trong đó cột H sẽ do em tạo ra bằng cách dùng hàm Excel đơn thuần để tự đánh số thứ tự đáp ứng đầu bài thực tế có vai trò như cột A trong ví dụ đính kèm của thày, cột E có vai trò như cột C trong ví dụ đính kèm của thày).
 
Lần chỉnh sửa cuối:
Viết thử 1 Function SubSum đơn giản, bạn thử test xem, có điều khi filter chưa vừa ý lắm.
PHP:
Function SubSum(CriteriaRng As Range, SumRng As Range)
Application.Volatile (True)
EndR = CriteriaRng.End(xlDown).Row - 1
FirstR = SumRng.Row
SumCol = SumRng.Column
SubSum = Application.Sum(Range(Cells(FirstR, SumCol), Cells(EndR, SumCol)))
End Function
Mượn file bài trên: Có 2 sheet, 1 sheet có chừa dòng tổng con trong cột và 1 sheet không chừa dòng, phải sum ở cột khác.
Cách dùng đơn giản ở chỗ:
- Chỉ có 2 tham số
- Tham số thứ nhất là ô điều kiện (ngày, số phiếu)
- Tham số thứ 2 là vùng tính tổng, ô đầu là ô đầu tiên chứa số cần tính tổng trở xuống, ô cuối là ô cuối cùng của cả bảng, hoặc dư ra cũng được. Và chỉ chọn 1 ô đầu thôi, cũng được nốt!
- Có thể copy paste

Tất nhiên đơn giản, dễ dùng thì cũng có hạn chế là cấu trúc bảng phải đồng nhất và theo mẫu (đã có 2 mẫu). Nếu bạn nào có mẫu khác thì gởi lên để mình cải tiến lại cho tổng quát
Ý em là thày làm sao mà như kết quả hiện công thức như làm thủ công đơn thuần tức là gần giống của thày concogia ấy (sum chứ không phải là Subsum thày ạh), như vây nó đảm bảo được tính trực quan vì mục đích chỉ là làm nhanh nhưng để cho những người mới biết Excel cũng hiểu được, chứ họ nhìn vào hàm Subsum họ chẳng hiểu gì. Ví dụ em đưa ra đơn giản thôi lựa chọn 2 cột A và B (trong thực tế khi ứng dụng vào công việc thật em có thể lựa chọn 2 cột khác có thể cách nhau cũng được). Cụ thể ở ví dụn này nếu A2 có số liệu thì kết quả sẽ điền vào ô B2 (nếu B2 đã có dữ liệu rồi thì xoá đi thay giá trị khác).
Ví dụ của các thày em tự nghiên cứu đã quá tốt rồi, nếu thày có thể hãy giúp em vào file em đính kèm nhé.
 

File đính kèm

Đúng kiểu em cần rồi, nếu thày chữa kiểu gì mà vùng dữ liệu cần nhập là cột A và cột C thì tốt quá (bỏ qua vai trò cột B). Vì mục đích của em là nghiên cứu để phát triển áp dụng trong thực tế thày ạh.
Của thày có ưu điểm lựa chọn nhanh (do chỉ cần 1 cột) nhưng có nhược điểm hơi cứng do 3 cột A, B, C liền nhau thì chương trình mới hiểu. Em muốn khi sử dụng em có thể dùng 2 cột cách nhau như cột E và H chẳng hạn (trong đó cột H sẽ do em tạo ra bằng cách dùng hàm Excel đơn thuần để tự đánh số thứ tự đáp ứng đầu bài thực tế có vai trò như cột A trong ví dụ đính kèm của thày, cột E có vai trò như cột C trong ví dụ đính kèm của thày).
Hihi, thấy topic này "zui" quá nên tham gia thôi, chữa như ý bạn cũng không khó, bi giờ bạn chép code này thế cái cũ thử xem nhé
Mã:
Public Sub YeuCauNgoWa()
    Dim VungDk, VungKq, iDau, iCuoi, J, kK, mM
    Set VungDk = Application.InputBox("Nhap dia chi", "Vùng Dieu Kien", Type:=8)
    Set VungKq = Application.InputBox("Nhap dia chi", "Vùng Ket Qua", Type:=8)
    With VungKq
        .Font.ColorIndex = 0
        .Interior.ColorIndex = xlNone
    End With
        For J = VungDk.Rows.Count To 1 Step -1
        kK = VungDk(J).Row: mM = VungKq(J).Column
            If J = VungDk.Rows.Count Then
                iCuoi = kK
            ElseIf VungDk(J) = "" And VungDk(J + 1) <> "" Then
                iCuoi = kK
            End If
                If VungDk(J) = "" And VungDk(J - 1) <> "" Then iDau = kK
                    If VungDk(J) <> "" Then
                        With VungKq(J)
                            .Formula = "=SUM(" & Cells(iDau, mM).Address & ":" & Cells(iCuoi, mM).Address & ")"
                            .Font.ColorIndex = 3
                            .Interior.ColorIndex = 6
                        End With
                    End If
        Next
End Sub
Khi chạy code sẽ ra 2 hộp:
- Hộp thứ nhất bạn chọn vùng nào tương đương như cột A trong bài trước
- Hộp thứ hai bạn chọn vùng tương đương với cột C trong bài trước nhé
Cột nào cũng được, tùy theo sự sắp xếp dữ liệu của bạn, không nhất thiết phải là E và H đâu nhé
"Xí quên", mình chưa viết đoạn kiểm tra xem 2 vùng bạn chọn có tương đương nhau không? Bạn cứ thử "em" này. có gì nói tiếp, Tết cũng buồn, nhậu hoài mệt quá, cho cái đầu làm việc tí cũng tốt
Thân
 
Lần chỉnh sửa cuối:
Ý em là thày làm sao mà như kết quả hiện công thức như làm thủ công đơn thuần tức là gần giống của thày concogia ấy (sum chứ không phải là Subsum thày ạh), như vây nó đảm bảo được tính trực quan vì mục đích chỉ là làm nhanh nhưng để cho những người mới biết Excel cũng hiểu được, chứ họ nhìn vào hàm Subsum họ chẳng hiểu gì. Ví dụ em đưa ra đơn giản thôi lựa chọn 2 cột A và B (trong thực tế khi ứng dụng vào công việc thật em có thể lựa chọn 2 cột khác có thể cách nhau cũng được). Cụ thể ở ví dụn này nếu A2 có số liệu thì kết quả sẽ điền vào ô B2 (nếu B2 đã có dữ liệu rồi thì xoá đi thay giá trị khác).
Ví dụ của các thày em tự nghiên cứu đã quá tốt rồi, nếu thày có thể hãy giúp em vào file em đính kèm nhé.

Bài viết thành hàm là đáp ứng yêu cầu của chủ topic Dauthivan và nguyenmanhnam.
Nhưng sao bây giờ thấy rối quá, nguyenmanhnam lúc trước yêu cầu function:
Em đã xem rồi, nhưng những ví dụ trong đó đều là dạng Sub, ý em là làm VBA theo kiểu hàm Funtion, qua đó nhân dịp nghỉ Tết em sẽ thay đổi đầu bài để ôn luyện cho kỹ,

Bây giờ lại khen Cò già: (Cò già dùng Sub)
Vâng, đối với thày thì nó quá đơn giản, nhưng nó rất có ý nghĩa với em thày ạh. Nó là cơ sở em tiếp cận VBA từng bước 1. Cám ơn thày nhiều.

Chắc khuynh hướng Sub phát triển mạnh hơn rồi. Vậy dùng Sub của Cò và của ndu đi, xài cũng được mà?
 
Bài viết thành hàm là đáp ứng yêu cầu của chủ topic Dauthivan và nguyenmanhnam.
Nhưng sao bây giờ thấy rối quá, nguyenmanhnam lúc trước yêu cầu function:


Bây giờ lại khen Cò già: (Cò già dùng Sub)


Chắc khuynh hướng Sub phát triển mạnh hơn rồi. Vậy dùng Sub của Cò và của ndu đi, xài cũng được mà?
Ý bạn nguyenmanhnam diễn đạt chưa toát có lẽ do bọn em đều là mới tiếp cận VBA nên cách viết chưa được, mục đích của nó là:
- Kết quả đầu ra sẽ liên kết với đầu vào để lỡ đầu vào thay đổi thì kết quả lại thay đổi chứ không phải là kết quả bằng Value (ý nghĩa Funtion là thế thày ah).
- Còn Fution này thực chất chỉ là hàm sum thông thường được điền tự động thôi (khi chạy Macro), mục đích là khi copy ra máy khác không có VBA thì khi không liên kết được đoạn Code thì nó vẫn dùng hàm Excel thông thường (hàm sum).
- Em hiểu như vậy chứ không phải là hàm Subsum tự tạo bởi nếu mang sang máy khác ở cơ quan Office không cho chạy VBA thì file báo lỗi.
Bạn ý nhầm vì nhận thức rằng Sub chỉ tạo ra Value, còn Fution là tạo ra hàm sum đó thày.
Em cảm ơn thày nhiều, chắc chắn các bài phức tạp em phải nhờ học đến kiểu tạo hàm mới (như là hàm Subsum của thày rồi, khi đó nếu có gì vướng mắc gì thày chỉ giúp em với) vì bài này thực chất là hàm sum đơn giản nhưng KL bọn em sử lý mấy ngàn dòng sợ thao tác bằng tay nhầm). Chúc thày đón năm mới tràn ngập niềm vui.
 
Lần chỉnh sửa cuối:
Bài viết thành hàm là đáp ứng yêu cầu của chủ topic Dauthivan và nguyenmanhnam.
Nhưng sao bây giờ thấy rối quá, nguyenmanhnam lúc trước yêu cầu function:


Bây giờ lại khen Cò già: (Cò già dùng Sub)


Chắc khuynh hướng Sub phát triển mạnh hơn rồi. Vậy dùng Sub của Cò và của ndu đi, xài cũng được mà?
Bác Phanhanhdai nói đúng đó thày, do em chưa biết cách biểu đạt. Có lẽ tiêu đề chắc phải là Dùng Sub để tự động điền công thức phải không ạh? Do em mới trình độ ở lớp vỡ lòng nên chắc thày không hình dung được tuy ban đầu chỉ có bài toán đơn giản này có được các thày giúp đỡ thành công, qua đó em có thể học hỏi, tiếp cận những bài mở đầu làm em thấy rất vui, em đã bắt đầu thích học VBA rồi. Từ những khởi điểm các thày chỉ bảo em có thể nghiên cứu thành công để có thể truyền đạt cho mọi người đi sau. Em tin lúc đó em có thể nói ăn GPE, ngủ GPE như các thày nhỉ? Chúc các thày luôn hạnh phúc, năm mới ngập tràn niềm vui
 
Lần chỉnh sửa cuối:
Code Con Cò già bài 28 đã đạt yêu cầu rồi mà: Chọn vùng điều kiện, chọn vùng cần tính tổng, ra kết quả công thức SUM(...)
Có lẽ tiêu đề chắc phải là Dùng Sub để tự động điền công thức phải không ạh?
Chính xác là dùng Sub gán công thức, chứ không phải dùng Sub gán Function, hay dùng Function.
Còn tiêu đề là của DauThiVan, yêu cầu là dùng công thức hoặc hàm tự tạo có thể copy được. Những bài có yêu cầu không giống vậy là ăn theo đấy, không sửa tiêu đề được.
 
Code của thày Concogia

PHP:
Public Sub YeuCauNgoWa()
    Dim VungDk, VungKq, iDau, iCuoi, J, kK, mM
    Set VungDk = Application.InputBox("Nhap dia chi", "Vùng Dieu Kien", Type:=8)
    Set VungKq = Application.InputBox("Nhap dia chi", "Vùng Ket Qua", Type:=8)
    With VungKq
        .Font.ColorIndex = 0
        .Interior.ColorIndex = xlNone
    End With
        For J = VungDk.Rows.Count To 1 Step -1
        kK = VungDk(J).Row: mM = VungKq(J).Column
            If J = VungDk.Rows.Count Then
                iCuoi = kK
            ElseIf VungDk(J) = "" And VungDk(J + 1) <> "" Then
                iCuoi = kK
            End If
                If VungDk(J) = "" And VungDk(J - 1) <> "" Then iDau = kK
                    If VungDk(J) <> "" Then
                        With VungKq(J)
                            .Formula = "=SUM(" & Cells(iDau, mM).Address & ":" & Cells(iCuoi, mM).Address & ")"
                            .Font.ColorIndex = 3
                            .Interior.ColorIndex = 6
                        End With
                    End If
        Next
End Sub

Trường hợp dữ liệu bắt đầu chọn từ dòng 1 thì sẽ bị lỗi (J-1=0) nên sẽ không thể thực hiện được VungDk(J - 1), tuy nhiên trường hợp này ít xảy ra vì thông thường dòng trên cùng thường là dòng tiêu đề

Cách này sẽ cho tốc độ chậm hơn là dùng biến tạm cho vào mảng rồi xuất hiện kết quả ra màn hình dưới dạng Value, tuy nhiên trường hợp gửi báo cáo cho đối tác kiểm tra thì lại là rất cần thiết

Bài Tham khảo http://www.giaiphapexcel.com/forum/showthread.php?60101-Hỏi-giải-pháp-sao-cho-Code-trở-thành-Code-động-có-tính-co-dãn-cùng-bảng-tính/page2do thày Ndu giải.
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom