thepdaoson
Thành viên thường trực
- Tham gia
- 29/4/11
- Bài viết
- 230
- Được thích
- 114
hic... khó quá hổng biết mần dc không nữa ah...@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 !!! =))
Nếu hàng tháng số điện thoại không trùng có thể dùng cách này: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.
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,)))))
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),)))
Mình có làm bằng VBA ...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.
Các anh GPE ơi...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...
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
Nghĩ tới nghĩ lui em chỉ làm được thế này thôi....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.
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
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ả.
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,"_")))),"")
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.
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, lúc trước là mình copy và file của mình. Để bình check lại.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 nhé. Well done!Ctrl+Shift+EnterMã: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,"_")))),"")
Cảm ơn bạn. Well done!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
hahaha... lúc đó lạ dùng hàm "GPE" tiếp thôi!Xài đã, đến cuối năm 2020 lúc so với 2021 mới biết ổn hay không?
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"....
Cảm ơn bạn. Well done!
Bắt rồi bẻ ... vào đi...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".
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.Bắt rồi bẻ ... vào đi...
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.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".