Đếm số xuất hiện lại

Liên hệ QC

thepdaoson

Thành viên thường trực
Tham gia
29/4/11
Bài viết
230
Được thích
114
Nhờ anh / chị lập công thức tính số lượng của một tập số của tháng này xuất hiện lại trong các tháng tiếp theo. Chi tiết trong file kèm theo.
Cảm ơn các anh / chị trước.
 

File đính kèm

  • Book1.xlsx
    9.6 KB · Đọc: 34
Lần chỉnh sửa cuối:
@thnghiachau , @Hoàng Tuấn 868 : mấy anh vô giúp mấy bài này nè ! Còn mấy bài dễ hơn để em. Nghĩ sao mấy bài dễ mà cũng tranh nữa !!! =))
 
Nhờ anh / chị lập công thức tính số lượng của một tập số của tháng này xuất hiện lại trong các tháng tiếp theo. Chi tiết trong file kèm theo.
Cảm ơn các anh / chị trước.
Nếu hàng tháng số điện thoại không trùng có thể dùng cách này:
Mã:
G2=IF($F2<=G$1,"",COUNT(MODE.MULT(IF(MONTH($B$2:$B$37)=--CHOOSE({1,2},RIGHT($F2),RIGHT(G$1)),MATCH($C$2:$C$37,$C$2:$C$37,)))))
Nếu có trùng:
Mã:
G2=IF($F2<=G$1,"",COUNT(MATCH(IF(MONTH($B$2:$B$37)=--RIGHT($F2),$C$2:$C$37,),IF(MONTH($B$2:$B$37)=--RIGHT(G$1),$C$2:$C$37),)))
 
Minh không có thời gian - nhưng mách bạn kiểu đại loại như vầy - bạn sẽ tìm ra hướng giải quyết.
 

File đính kèm

  • Book1.xlsm
    12.3 KB · Đọc: 13
=SUMPRODUCT(COUNTIF(OFFSET(INDEX($B$2:$B$37,MATCH($F3,MONTH($B$2:$B$37),0)),0,1,SUM(1*(MONTH($B$2:$B$37)=$F3))),OFFSET(INDEX($B$2:$B$37,MATCH(G$1,MONTH($B$2:$B$37),0)),0,1,SUM(1*(MONTH($B$2:$B$37)=G$1)))))
 
Nhờ anh / chị lập công thức tính số lượng của một tập số của tháng này xuất hiện lại trong các tháng tiếp theo. Chi tiết trong file kèm theo.
Cảm ơn các anh / chị trước.
Mình có làm bằng VBA ...
nhưng ... bác @VetMini ơi... đừng la em trong khu vực "hàm và công thức Excel" mà bày đặt viết VBA nha... tại em hổng có rành hàm và công thức nên em viết bằng VBA ah...
 

File đính kèm

  • Book1-GPE.xlsm
    32 KB · Đọc: 12
Mình có làm bằng VBA ...
nhưng ... bác @VetMini ơi... đừng la em trong khu vực "hàm và công thức Excel" mà bày đặt viết VBA nha... tại em hổng có rành hàm và công thức nên em viết bằng VBA ah...
Các anh GPE ơi...
Code của em làm cho bạn @thepdaoson :
Mã:
Option Explicit

Sub AAA()
Dim iLastRow As Long, i As Integer, j As Long
Dim iMonth As Integer, iThisMonth As Integer
Dim rngFind As Range
Dim strFirst As String, strFind As String
Dim Dic As Object, dicKey
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    iLastRow = .Range("C" & .Rows.Count).End(xlUp).Row
    For i = .Range("C" & .Rows.Count).End(xlUp).Row To 3 Step -1
        If .Range("B" & i).Value = "" Then GoTo NextItem
        iThisMonth = Month(CDate(.Range("B" & i).Value))
        strFind = .Range("C" & i).Value
        With .Range("C2:C" & i - 1)
            Set rngFind = .Find(What:=strFind, LookIn:=xlValues, LookAt:=xlWhole)
            If Not rngFind Is Nothing Then
                strFirst = rngFind.Address
                Do
                    iMonth = Month(CDate(rngFind.Offset(, -1).Value))
                    If iMonth <> iThisMonth Then
                        If Dic.Exists(iMonth) Then
                            Dic(iMonth) = Dic(iMonth) + 1
                        Else
                            Dic.Add iMonth, 1
                        End If
                    End If
                    Set rngFind = .FindNext(rngFind)
                Loop While Not rngFind Is Nothing And rngFind.Address <> strFirst
            End If
        End With
        'GHI DU LIEU
        If Month(CDate(.Range("B" & i).Value)) <> Month(CDate(.Range("B" & i - 1).Value)) Or i = 3 Then
            For Each dicKey In Dic.Keys
                .Range(strColResult(dicKey) & iRowResult(iThisMonth)).Value = Dic(dicKey)
            Next dicKey
            Set Dic = Nothing
            Set Dic = CreateObject("Scripting.Dictionary")
        End If
NextItem:
    Next i
End With
Set Dic = Nothing
End Sub

Function iRowResult(ByVal iThisMonth As Integer) As Integer
    Select Case iThisMonth
        Case 7: iRowResult = 3
        Case 8: iRowResult = 4
        Case 9: iRowResult = 5
    End Select
End Function

Function strColResult(ByVal iMonth As Integer) As String
    Select Case iMonth
        Case 6: strColResult = "G"
        Case 7: strColResult = "H"
        Case 8: strColResult = "I"
    End Select
End Function

cái phần 'GHI DU LIEU, các bạn GPE có thể giúp mình làm sao cho "tổng quát" không ah?
vì cái này em set trong 2 function iRowResult và Function strColResult không được tổng quát ah...
Cám ơn GPE a.
 
Cảm ơn các Bác. Mình thử theo các gợi ý của các bác nhưng chưa cái nào thành công cả.
 
Cái phần 'GHI DU LIEU, các bạn GPE có thể giúp mình làm sao cho "tổng quát" không ah?
vì cái này em set trong 2 function iRowResult và Function strColResult không được tổng quát ah...
Cám ơn GPE a.
Nghĩ tới nghĩ lui em chỉ làm được thế này thôi....

Mã:
Option Explicit

Sub AAA()
Dim iLastRow As Long, i As Integer
Dim iMonth As Integer, iThisMonth As Integer
Dim rngFind As Range
Dim strFirst As String, strFind As String
Dim arrMonth(1 To 12, 1 To 12)
With Sheet1
    iLastRow = .Range("C" & .Rows.Count).End(xlUp).Row
    For i = .Range("C" & .Rows.Count).End(xlUp).Row To 3 Step -1
        If .Range("B" & i).Value = "" Then GoTo NextItem
        iThisMonth = Month(CDate(.Range("B" & i).Value))
        strFind = .Range("C" & i).Value
        With .Range("C2:C" & i - 1)
            Set rngFind = .Find(What:=strFind, LookIn:=xlValues, LookAt:=xlWhole)
            If Not rngFind Is Nothing Then
                strFirst = rngFind.Address
                Do
                    iMonth = Month(CDate(rngFind.Offset(, -1).Value))
                    If iMonth <> iThisMonth Then
                        arrMonth(iThisMonth, iMonth) = arrMonth(iThisMonth, iMonth) + 1
                    End If
                    Set rngFind = .FindNext(rngFind)
                Loop While Not rngFind Is Nothing And rngFind.Address <> strFirst
            End If
        End With
NextItem:
    Next i
    .Range("G2").Resize(12, 12) = arrMonth
End With
End Sub

Mình không sử dụng biến Dictionary luôn... mà dùng biến Array (arrMonth) thế nên Khu vực kết quả là 12 tháng dọc và 12 tháng ngang luôn ....

1596886771423.png

hic.. không có nghĩ thêm được gì nữa cho hay hơn rồi....
Bài đã được tự động gộp:

Bạn @thepdaoson chạy trực tiếp trên file mình gởi (bài #15) hay là copy code vào file khác của bạn mà chạy vậy????
Vì mình đã chạy kiểm tra OK file mà mình gởi rùi nhá!!!
 

File đính kèm

  • Book1-GPE(2).xlsm
    31.3 KB · Đọc: 3
Lần chỉnh sửa cuối:
Cảm ơn các Bác. Mình thử theo các gợi ý của các bác nhưng chưa cái nào thành công cả.
Mã:
G2 =IF($F2>G$1,SUM(--(IF(--MID(G$1,7,2)=MONTH($B$2:$B$37),$C$2:$C$37,"|")=TRANSPOSE(IF(--MID($F2,7,2)=MONTH($B$2:$B$37),$C$2:$C$37,"_")))),"")
Ctrl+Shift+Enter
 

File đính kèm

  • Book1 (10).xlsx
    9.9 KB · Đọc: 19
Nhờ anh / chị lập công thức tính số lượng của một tập số của tháng này xuất hiện lại trong các tháng tiếp theo. Chi tiết trong file kèm theo.
Cảm ơn các anh / chị trước.
Nhờ anh / chị lập công thức tính số lượng của một tập số của tháng này xuất hiện lại trong các tháng tiếp theo. Chi tiết trong file kèm theo.
Cảm ơn các anh / chị trước.
 

File đính kèm

  • tinh lap lai.xlsx
    10.7 KB · Đọc: 10
Dùng code VBA
Mã:
Sub XYZ()
  Dim sArr(), tArr(), Res(), Dic As Object
  Dim sR&, i&, k&, th&, j&

  Set Dic = CreateObject("Scripting.Dictionary")
  sArr = Range("B2:C" & Range("B" & Rows.Count).End(xlUp).Row + 1).Value
  ReDim tArr(1 To 12)
  ReDim Res(0 To 11, 0 To 12)
  sR = UBound(sArr) - 1
  For i = 1 To sR
    If sArr(i, 1) <> Empty Then
      If th <> Month(sArr(i, 1)) Then
        th = Month(sArr(i, 1))
        k = k + 1
        tArr(k) = th
        Res(k, 0) = "Tháng " & th
      ElseIf th <> Month(sArr(i + 1, 1)) Then
        If i <> sR Then Res(0, k) = "Tháng " & th
      End If
      Dic.Item(th & "#" & sArr(i, 2)) = ""
      For j = 1 To k - 1
        If Dic.exists(tArr(j) & "#" & sArr(i, 2)) Then Res(k, j) = Res(k, j) + 1
      Next j
    End If
  Next i
  Range("F10").Resize(k + 2, k + 1) = Res
End Sub
 
Nghĩ tới nghĩ lui em chỉ làm được thế này thôi....

Mã:
Option Explicit

Sub AAA()
Dim iLastRow As Long, i As Integer
Dim iMonth As Integer, iThisMonth As Integer
Dim rngFind As Range
Dim strFirst As String, strFind As String
Dim arrMonth(1 To 12, 1 To 12)
With Sheet1
    iLastRow = .Range("C" & .Rows.Count).End(xlUp).Row
    For i = .Range("C" & .Rows.Count).End(xlUp).Row To 3 Step -1
        If .Range("B" & i).Value = "" Then GoTo NextItem
        iThisMonth = Month(CDate(.Range("B" & i).Value))
        strFind = .Range("C" & i).Value
        With .Range("C2:C" & i - 1)
            Set rngFind = .Find(What:=strFind, LookIn:=xlValues, LookAt:=xlWhole)
            If Not rngFind Is Nothing Then
                strFirst = rngFind.Address
                Do
                    iMonth = Month(CDate(rngFind.Offset(, -1).Value))
                    If iMonth <> iThisMonth Then
                        arrMonth(iThisMonth, iMonth) = arrMonth(iThisMonth, iMonth) + 1
                    End If
                    Set rngFind = .FindNext(rngFind)
                Loop While Not rngFind Is Nothing And rngFind.Address <> strFirst
            End If
        End With
NextItem:
    Next i
    .Range("G2").Resize(12, 12) = arrMonth
End With
End Sub

Mình không sử dụng biến Dictionary luôn... mà dùng biến Array (arrMonth) thế nên Khu vực kết quả là 12 tháng dọc và 12 tháng ngang luôn ....

View attachment 242707

hic.. không có nghĩ thêm được gì nữa cho hay hơn rồi....
Bài đã được tự động gộp:

Bạn @thepdaoson chạy trực tiếp trên file mình gởi (bài #15) hay là copy code vào file khác của bạn mà chạy vậy????
Vì mình đã chạy kiểm tra OK file mà mình gởi rùi nhá!!!
Cảm ơn bạn, lúc trước là mình copy và file của mình. Để bình check lại.
Bài đã được tự động gộp:

Mã:
G2 =IF($F2>G$1,SUM(--(IF(--MID(G$1,7,2)=MONTH($B$2:$B$37),$C$2:$C$37,"|")=TRANSPOSE(IF(--MID($F2,7,2)=MONTH($B$2:$B$37),$C$2:$C$37,"_")))),"")
Ctrl+Shift+Enter
Cảm ơn bạn nhé. Well done!
Bài đã được tự động gộp:

Cảm ơn bạn!
Bài đã được tự động gộp:

Dùng code VBA
Mã:
Sub XYZ()
  Dim sArr(), tArr(), Res(), Dic As Object
  Dim sR&, i&, k&, th&, j&

  Set Dic = CreateObject("Scripting.Dictionary")
  sArr = Range("B2:C" & Range("B" & Rows.Count).End(xlUp).Row + 1).Value
  ReDim tArr(1 To 12)
  ReDim Res(0 To 11, 0 To 12)
  sR = UBound(sArr) - 1
  For i = 1 To sR
    If sArr(i, 1) <> Empty Then
      If th <> Month(sArr(i, 1)) Then
        th = Month(sArr(i, 1))
        k = k + 1
        tArr(k) = th
        Res(k, 0) = "Tháng " & th
      ElseIf th <> Month(sArr(i + 1, 1)) Then
        If i <> sR Then Res(0, k) = "Tháng " & th
      End If
      Dic.Item(th & "#" & sArr(i, 2)) = ""
      For j = 1 To k - 1
        If Dic.exists(tArr(j) & "#" & sArr(i, 2)) Then Res(k, j) = Res(k, j) + 1
      Next j
    End If
  Next i
  Range("F10").Resize(k + 2, k + 1) = Res
End Sub
Cảm ơn bạn. Well done!
 
Xài đã, đến cuối năm 2020 lúc so với 2021 mới biết ổn hay không?
 
Bắt rồi bẻ ... vào đi...
Tôi vốn chuyên Văn. Tại bạn ít tiếp xúc với người chuyên Văn thôi.
Đối với dân chuyên Toán, cái họ để ý là con số. Nếu thớt nào đưa ra con số tính toán sai là sẽ chỉnh liền.
Đối với dân chuyên Văn, cái họ để ý là từ cú. Nếu thớt nào từ cú bậy bạ thì sẽ bắt bẻ.
Tôi thấy có gì khác nhau đâu?
 
Lần chỉnh sửa cuối:
In English, "We
Người ta giúp bạn chứ không có nhiệm vụ làm cho bạn. "Well done" ở đây là không nên. Nó tương đương với "khá lắm".
Thanks for your comment. However, in English "Well done" is used as a way of praising someone and saying that a person is pleased about something the other has done. It does not like a word by word translation.
 
Web KT
Back
Top Bottom