Làm sao để đếm trong vùng có bao nhiêu ô khác nhau?

Liên hệ QC

hocsinhmoi

Thành viên mới
Tham gia
5/3/11
Bài viết
11
Được thích
2
Em đang làm bài tập, muốn đếm trong vùng phân công công tác có các tên người để đếm xem có bao nhiêu người tham gia trong vùng đó. Vì có người có thể vừa làm việc này vừa làm việc kia.

Xin hỏi các cao nhân làm thế nào để đếm trong vùng trên có bao nhiêu người tham gia thì có giải pháp nào.

Ví dụ: Vùng B2 đến E12 kín hết dữ liệu nhưng tên người lung tung trong đó, có thể một tên ở nhiều ô. Vậy phải dùng hàm nào, hoặc giải pháp nào cho bài toán dạng này bằng lập trình VB.

Thanks trước các cao nhân.
 
minh nghỉ các cao nhân không hiểu ý ban muốn làm gì đâu, Tốt hơn hết bạn đưa file lên mà các cao nhân giúp bạn mới được.
 
Em đang làm bài tập, muốn đếm trong vùng phân công công tác có các tên người để đếm xem có bao nhiêu người tham gia trong vùng đó. Vì có người có thể vừa làm việc này vừa làm việc kia.

Xin hỏi các cao nhân làm thế nào để đếm trong vùng trên có bao nhiêu người tham gia thì có giải pháp nào.

Ví dụ: Vùng B2 đến E12 kín hết dữ liệu nhưng tên người lung tung trong đó, có thể một tên ở nhiều ô. Vậy phải dùng hàm nào, hoặc giải pháp nào cho bài toán dạng này bằng lập trình VB.

Thanks trước các cao nhân.
Theo nội dung trên tôi gởi bạn cách dùng hàm COUNTIF(RANGE,CRITERIA)
Xem thêm file đính kèm nhé.--=0--=0
 

File đính kèm

Tìm số người tham gia thực hiện nhiệm vụ trong 1 tuần bất kỳ

Tôi gửi một sheet Lịch để phân hàng ngày, và bài toán ở đây là cần đưa ra được:
- Tổng số trong 1 tuần có bao nhiêu người trực (có thể theo khoảng thời gian bất kỳ)
- Điền tự động danh sách người trực.
- Thống kê số lượt trực theo từng nhiệm vụ...

Thanks.
 

File đính kèm

Theo nội dung trên tôi gởi bạn cách dùng hàm COUNTIF(RANGE,CRITERIA)
Xem thêm file đính kèm nhé.--=0--=0
Thanks. Nhưng thưa bạn ở đây không phải là đếm một người đã biết, mà là đếm người khác nhau trong vùng. Nếu đã biết rõ tên thì quá đơn giản vì tôi cũng đã học đếm bằng hàm đó trên diễn đàn rồi. Đây là bài mẫu, mà cơ quan tôi có tới hàng trăm người, chẳng lẽ viết hơn 100 cái công thức kia vào 1 ô nối tiếp nhau? Xin xem file gửi kèm.
 
Cũng muốn thử sức mình, nhưng chịu vì chưa hiểu hết các vấn đề

(|) Hình như bạn muốn đếm số người trực & làm các công việc trong tuần;
Nhưng đếm xong bỏ vô đâu vậy? Ở cái trang tính thứ 2 thì không thể thoả rồi
Hay bạn thử tính rợ & đưa lên diễn đàn 1 tuần nào đó đi

(Gọi í: dùng chức năng [Table ]. . [/Table] có trên diễn đàn mà mô fỏng nhanh dùm cái nha & cảm ơn!)

Bạn có thể nhập ngày khác nhau vô ô [I1] sau đó nhấn tổ hợp {CTRL}+{SHIFT}+D để macro điền số liệu vô bảng - Cũng là cầu âu thôi; trật thì làm lại cái khác cho bạn!
 

File đính kèm

Lần chỉnh sửa cuối:
Tôi gửi một sheet Lịch để phân hàng ngày, và bài toán ở đây là cần đưa ra được:
- Tổng số trong 1 tuần có bao nhiêu người trực (có thể theo khoảng thời gian bất kỳ)
- Điền tự động danh sách người trực.
- Thống kê số lượt trực theo từng nhiệm vụ...

Thanks.
Câu 1: không khó... có thể dùng hàm SUMPRODUCT(1/COUNTIF(Vùng, Vùng)) ---> Vậy việc còn lại là xác định vùng dựa vào ngày nhập (quá dễ: Dùng hàm MATCH và OFFSET)
Có điều trong file bạn nói rằng:
Nhập ngày vào, sẽ thống kê tuần kế tiếp từ thứ 6 tuần này đến thứ 6 tuần kế tiếp
Từ thứ 6 tuần này đến thứ 6 tuần kế tiếp là 8 ngày hả bạn? ---> Xác định lại lần nữa: 8 ngày hay 7 ngày?
Câu 2: Cũng dễ: Dùng hàm INDEX (với kết quả có được từ câu 1)
Câu 3: Thống kê là như thế nào? Điền kết quả vào đâu?
----------------
Lý ra bạn nên điền sẳn kết quả nào đó vào file để mọi người tiện theo dỏi chứ
 
Làm rõ các câu hỏi về tìm

Tôi vô cùng cảm kích vì các bạn đã quan tâm đến bài toán của tôi. Ở đây tôi đưa ra một sheet mẫu, mục đích là làm thế nào để điền tự động vào sheet này như mẫu tôi đưa ra. Bài toán này đặc thù ở chỗ là tôi dùng công thức mảng để tính thì được, nhưng không thể thu Macro để nó điền vào bảng được (Excel thông báo không thể sử dụng Macro cho các công thức mảng lớn). Do sự trùng lặp số người và phải làm bằng tay).

Cách thống kê và cách điền như mẫu gửi kèm.

Tôi cũng đã học hỏi được nhièu đièu từ diễn đàn, có lẽ tôi chưa trình bày rõ ràng nên các bạn hiểu bài toán quá đơn giản. Nhưng ở đây bài toán khác biệt hơn nhiều.

1. Đếm được số người, đưa vào biến.
2. Chèn đủ số hàng và điền tự động từng người vào bản báo cáo.
3. Điền các tham số vào bảng.

Tôi có một file cũng đã làm tương tự như các bạn hướng dẫn, để tôi tìm rồi sẽ chia sẻ. (Ở đó, người dùng chỉ nhập dữ liệu vào 1 ô, tất cả bản báo cáo tự động lấy từ bảng nhập và bắn vào báo cáo này).

Thanks.
 

File đính kèm

(|) Hình như bạn muốn đếm số người trực & làm các công việc trong tuần;
Nhưng đếm xong bỏ vô đâu vậy? Ở cái trang tính thứ 2 thì không thể thoả rồi
Hay bạn thử tính rợ & đưa lên diễn đàn 1 tuần nào đó đi

(Gọi í: dùng chức năng [Table ]. . [/Table] có trên diễn đàn mà mô fỏng nhanh dùm cái nha & cảm ơn!)

Bạn có thể nhập ngày khác nhau vô ô [I1] sau đó nhấn tổ hợp {CTRL}+{SHIFT}+D để macro điền số liệu vô bảng - Cũng là cầu âu thôi; trật thì làm lại cái khác cho bạn!

Cảm ơn bạn, nhưng ý của câu hỏi không phải là copy ra nhiều dòng như vậy. Mỗi người chỉ 1 dòng. Chứ không phải phát tiền nhiều lần cho một người :D
 
Tôi có một file cũng đã làm tương tự như các bạn hướng dẫn, để tôi tìm rồi sẽ chia sẻ. (Ở đó, người dùng chỉ nhập dữ liệu vào 1 ô, tất cả bản báo cáo tự động lấy từ bảng nhập và bắn vào báo cáo này).
.
Vậy tóm lại ý bạn là dùng code xuất ra kết quả giống y chang file vừa đưa lên, đúng không? ---> thế mà tiêu đề bài viết lại bảo là ĐẾM... Hic...
Mô tả 1 hồi, càng lúc càng khó hiểu (trong khi tôi áng chừng bài này chẳng khó tí nào)
 
Tôi có hỏi ý kiến của thầy giáo tôi, thấy ổng nói đây là dạng toán "đảo ma trận" đặc biệt, một dạng toán khó nếu như không nắm chắc về nó thì cũng rất khó khăn để giải quyết. Ngay như Pivot Table cũng làm kiểu này nhưng cũng không triệt tiêu được việc lặp lại bản ghi giống nhau (ở đây mỗi người phải chiếm 1 hàng, chứ không phải cũng người đó lại phân nhiều hàng như copy) Vì tối đa 24 ô (6x4), tức là tối đa chỉ có 24 hàng. Thấy ổng nói, nếu bí thì thêm 1 sheet, làm Macro=VBA, tự động đọc và copy từng người vào danh sách mới trong sheet này, sắp xếp lại mới có cơ sở để xoá các dòng trùng nhau, sau đó mới copy dán vào sheet kết quả.
Thực hiện đếm lại số dòng, dán phần văn bản footer ở sheet khác vào để được văn bản hoàn chỉnh.

Nói chung, tôi vẫn muốn các bạn đưa ra giải pháp khác phù hợp và tăng tốc cho bàn toán này. Tôi vẫn hi vọng có ý tưởng và giải thuật khác hay hơn, chẳng lẽ diễn đàn mình có nhiều bài hay như thế mà lại không ai đưa ra được cách giải cho bài toán này?
 
Nói chung, tôi vẫn muốn các bạn đưa ra giải pháp khác phù hợp và tăng tốc cho bàn toán này. Tôi vẫn hi vọng có ý tưởng và giải thuật khác hay hơn, chẳng lẽ diễn đàn mình có nhiều bài hay như thế mà lại không ai đưa ra được cách giải cho bài toán này?
Thật ra dạng bài này tôi đã từng làm nhiều lần rồi... Giải pháp tăng tốc là dùng Dictionary Object kết hợp với Array ---> Có điều bạn phải trả lời câu hỏi của tôi ở bài 10 trước đã
Tôi áng chừng bài của bạn gần giống file đính kèm của tôi đây
 

File đính kèm

Lần chỉnh sửa cuối:
Câu 1: không khó... có thể dùng hàm SUMPRODUCT(1/COUNTIF(Vùng, Vùng)) ---> Vậy việc còn lại là xác định vùng dựa vào ngày nhập (quá dễ: Dùng hàm MATCH và OFFSET)
Có điều trong file bạn nói rằng:

Từ thứ 6 tuần này đến thứ 6 tuần kế tiếp là 8 ngày hả bạn? ---> Xác định lại lần nữa: 8 ngày hay 7 ngày?
Câu 2: Cũng dễ: Dùng hàm INDEX (với kết quả có được từ câu 1)
Câu 3: Thống kê là như thế nào? Điền kết quả vào đâu?
----------------
Lý ra bạn nên điền sẳn kết quả nào đó vào file để mọi người tiện theo dỏi chứ

- Xin lỗi, tôi đã gửi file lên, chủ yếu học về cách thức xử lý, nên tôi quên không nói rõ, 7 ngày như file mẫu. (Có thể bỏ 1 cọc thứ 6).
- Điền giống hệt như file mẫu.

Tôi đã xem file của bạn ở đây bài toán đã đảo vai trò từ giá trị chuyển thành tiêu đề, nên khác hoàn toàn code của bạn.

Bây giờ tôi viết cụ thể CSDL chỉ có như vầy:

-----------------Nhiệm vụ 1;-------------Nhiệm vụ 2;-----------------Nhiệm vụ 3;--------------;Nhiệm vụ 4
Thứ 6:.........Tên người 11......;............Tên người 21.........;....................Tên người 31........;............Tên người 41.........
Thứ 7:.........Tên người 12......;............Tên người 22.........;....................Tên người 32........;............Tên người 42.........
Chủ nhật:....Tên người 13......;............Tên người 23.........;....................Tên người 33........;............Tên người 43.........
Thứ 2:.........Tên người 14......;............Tên người 24.........;....................Tên người 34........;............Tên người 44.........
Thứ 3:.........Tên người 15......;............Tên người 25.........;....................Tên người 35........;............Tên người 45.........
Thứ 4:.........Tên người 16......;............Tên người 26.........;....................Tên người 36........;............Tên người 46.........
Thứ 5:.........Tên người 17......;............Tên người 27.........;....................Tên người 37........;............Tên người 47.........

Viết code để đọc và ghi ra như vầy (chỉ cần tới thứ 5 cho dễ làm):

--------------------Thứ 6;-------- Thứ bảy;-------CN;--------;Thứ hai;------ Thứ ba;-------Thứ tư; ---------Thứ năm
Tên người A............NV1
Tên người B
.................................NV1................NV2................NV4

Ở đây không phải là liệt kê copy đủ mà phải hợp nhất được nhiệm vụ nào của người nào.

Ở đây, mảng đã xoay đảo và chuyển tên người từ dữ liệu thành tiêu đề, chuyển Nhiệm vụ từ tiêu đề thành dữ liệu, đặc biệt là hợp nhất dữ liệu trùng tên để không đảm bảo không ghi trùng. Nên nếu 1 cột thì rất đơn giản, nếu 4 cột thì không hề đơn giản mà mảng 1 chiều khó có thể giải quyết được. Ở đây bài toán đòi hỏi phải trình độ cao mới giải quyết được. Còn trình độ chưa ngấm đủ độ thường thì họ sẽ chạy mất dép.
 
Bạn kiểm tra xem nha

Đúng là bạn mô tả công việc chưa rành rọt lắm đó nha!
 

File đính kèm

Ở đây, mảng đã xoay đảo và chuyển tên người từ dữ liệu thành tiêu đề, chuyển Nhiệm vụ từ tiêu đề thành dữ liệu, đặc biệt là hợp nhất dữ liệu trùng tên để không đảm bảo không ghi trùng. Nên nếu 1 cột thì rất đơn giản, nếu 4 cột thì không hề đơn giản mà mảng 1 chiều khó có thể giải quyết được. Ở đây bài toán đòi hỏi phải trình độ cao mới giải quyết được. Còn trình độ chưa ngấm đủ độ thường thì họ sẽ chạy mất dép.
Hỏi lại lần nữa: Lở như nhập liệu nhầm lẫn, trong cùng 1 ngày mà 1 người lại nhận 2 nhiệm vụ thì xử lý sao?
Ẹc... Ẹc... Tại bạn không search trên diễn đàn thôi... dạng bài này làm hoài... nói chung thuật toán gần giống như file tôi đã đưa lên, tức dùng mảng 2 chiều và có kết hợp với việc dùng Dictionary Object
 
- Xin lỗi, tôi đã gửi file lên, chủ yếu học về cách thức xử lý, nên tôi quên không nói rõ, 7 ngày như file mẫu. (Có thể bỏ 1 cọc thứ 6).
- Điền giống hệt như file mẫu.


Viết code để đọc và ghi ra như vầy (chỉ cần tới thứ 5 cho dễ làm):


Ở đây không phải là liệt kê copy đủ mà phải hợp nhất được nhiệm vụ nào của người nào.

Ở đây, mảng đã xoay đảo và chuyển tên người từ dữ liệu thành tiêu đề, chuyển Nhiệm vụ từ tiêu đề thành dữ liệu, đặc biệt là hợp nhất dữ liệu trùng tên để không đảm bảo không ghi trùng. Nên nếu 1 cột thì rất đơn giản, nếu 4 cột thì không hề đơn giản mà mảng 1 chiều khó có thể giải quyết được. Ở đây bài toán đòi hỏi phải trình độ cao mới giải quyết được. Còn trình độ chưa ngấm đủ độ thường thì họ sẽ chạy mất dép.
Thật ra bài này không khó ( vì mình trình độ không cao nhưng vẫn làm được), chỉ khó ở cái chỗ các anh em không hiểu được yêu cầu của bạn thôi
Chứ hiểu đề bài rồi thì OK thôi
Bạn nhập vào cell I1 ==> xem kết quả
Thân
 

File đính kèm

Thật ra bài này không khó ( vì mình trình độ không cao nhưng vẫn làm được), chỉ khó ở cái chỗ các anh em không hiểu được yêu cầu của bạn thôi
Chứ hiểu đề bài rồi thì OK thôi
Bạn nhập vào cell I1 ==> xem kết quả
Thân
Hình như anh xác định sai ngày thì phải
Theo em hiểu thì dữ liệu xuất luôn nằm trong phạm vi từ thứ 6 tuần này đên thứ 5 tuần sau ---> Vậy, nếu người ta nhập ngày 24/1/2011 (thứ 2) thì dữ liệu xuất phải nằm trong khoảng từ 21/1/2011 (thứ 6) đến 27/1/2011 (thứ 5)
----------------------------------------
Làm sơ qua bài này (chưa tính đến việc xóa dòng và chèn dòng)
1> Trong Module
PHP:
Option Base 1
Public n As Long
Sub Transfer(sRng As Range, Target As Range)
  Dim sArr, tArr, tVal, tmp, i As Long, j As Long
  tVal = Array("NV1", "NV2", "NV3", "NV4")
  sArr = sRng.Value
  n = 0
  ReDim tArr(1 To sRng.Count + 1, 1 To sRng.Rows.Count + 2)
  With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(sArr, 1)
      For j = 1 To UBound(sArr, 2)
        If sArr(i, j) <> "" Then
          If Not .Exists(sArr(i, j)) Then
            n = n + 1
            .Add sArr(i, j), n
            tArr(n, 1) = n
            tArr(n, 2) = sArr(i, j)
            tArr(n, i + 2) = IIf(tArr(n, i + 2) = "", tVal(j), tArr(n, i + 2) & ", " & tVal(j))
          Else
            tmp = tArr(.Item(sArr(i, j)), i + 2)
            tArr(.Item(sArr(i, j)), i + 2) = IIf(tmp = "", tVal(j), tmp & ", " & tVal(j))
          End If
        End If
      Next
    Next
  End With
  If n Then Target.Resize(n, UBound(sArr, 1) + 2).Value = tArr
End Sub
2> Trong sheet DanhSachTheoTuan
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$I$1" Then
    Dim iDat As Long, sRng As Range
    On Error Resume Next
    iDat = Target.Value
    With Sheet2.Range("A3:F10000")
      Set sRng = .Offset(iDat - Weekday(iDat, 6) + 1 - .Cells(1, 1), 2).Resize(7, 4)
    End With
    With Range("A5")
      .Resize(24, 11).ClearContents
      Transfer sRng, .Cells
    End With
  End If
End Sub
Code có đề phòng luôn trường hợp trong 1 ngày mà 1 người nhận 2 nhiệm vụ thì sẽ xuất ra luôn ---> Ví dụ:
- Ngày 1/3/2011, anh Lê Đình vừa nhận NV1 vừa nhận NV2
- Kết quả xuất ra sẽ có dạng: NV1, NV2
----------------
Việc còn lại là chèn dòng gì gì đó tác giả tự làm nhé (dựa vào biến n đã khai báo dạng Public)
 

File đính kèm

Hình như anh xác định sai ngày thì phải
Theo em hiểu thì dữ liệu xuất luôn nằm trong phạm vi từ thứ 6 tuần này đên thứ 5 tuần sau ---> Vậy, nếu người ta nhập ngày 24/1/2011 (thứ 2) thì dữ liệu xuất phải nằm trong khoảng từ 21/1/2011 (thứ 6) đến 27/1/2011 (thứ 5)
ndu
Trong bài chủ topic có câu:
Nhập ngày vào (I1), sẽ thống kê tuần kế tiếp từ thứ 6 tuần này...
Và trong ví dụ cho ra kết quả
Nhập ngày 9 tháng 2 ( thứ 4) sẽ ra kết quả tuần từ thứ 6 ngày 11 tháng 2 đến thứ 6 ngày 18 tháng 2
Híc, cũng khó hiểu thật, chẳng biết trúng trật ra sao nữa
Mà thôi, Thầy ndu ạ, chạy được là Ok rồi, còn xác định tuần nào là chuyện nhỏ, không thành vấn đề
 
Chân thành cảm ơn các bạn đã tham gia giả quyết giúp tôi bài toán trên. Cách làm của các bạn quả là sáng tạo và đáng được học tập. Đọc code, hiểu được code và học được rất nhiều ở các bạn phương pháp lập luận, phương pháp tư duy và phương pháp viết code... Tôi mong rằng các bạn sẽ luôn trở thành những người bạn tin cậy cho dân lập trình a ma tơ chúng tôi học tập.
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom