Giúp công thức cộng tổng cột SỐ lượng theo cột STT nếu trùng lấy dòng nằm trên

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Văn Toàn 1996

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
5/6/23
Bài viết
71
Được thích
15
Chào tất cả mọi người GPE !
Mình cần công thức, hoặc Hàm VBA để cộng tổng cột số lượng theo cột STT, nếu trùng STT thì lấy dòng trên cùng ( dòng tô màu đỏ ) . Xin cảm ơn
1713012979081.png
 

File đính kèm

  • sum stt.xlsx
    11.8 KB · Đọc: 16
Lần chỉnh sửa cuối:
Chào tất cả mọi người GPE !
Mình cần công thức, hoặc Hàm VBA để cộng tổng cột số lượng theo cột STT, nếu trùng STT thì lấy dòng trên cùng ( dòng tô màu đỏ ) . Xin cảm ơn

Công thức này chưa test kỹ:

=SUM(IF(C4:C12<>C3:C11,D4 : D12,0))

Excel đời cổ, cần kết thúc bằng Ctrl+Shift+Enter.

.
 
Lần chỉnh sửa cuối:
Công thức này chưa test kỹ:

=SUM(IF(C4:C12<>C3:C11,D4 : D12,0))

Excel đời cổ, cần kết thúc bằng Ctrl+Shift+Enter.

.
Cảm ơn bạn. Có thế nào dùng công thức bình thường, hoặc hàm VBA không ? Vì mình không muốn sử dụng công thức mãng nó làm chậm bảng tính
 
= SUMPRODUCT(--( C4:C12 <> C3:C11 ) ,D4: D12 )
cảm ơn bạn, Sau khi test 1 ngày 1 đêm thì công thức bạn vẫn không chính xác. Ví dụ
1713116532879.png
Nếu mã 1 có rồi mà nó lặp lại 1 lần nữa thì Trật lất luôn
Mình xin góp Vui mã VBA này đúng theo yêu cầu
Mã:
Sub congdon()
On Error Resume Next
Dim I As Long, K As Long, t As Long
Dim sArr(), tong As Double
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = Range("C4:D12").Value
ReDim dArr(1 To UBound(sArr), 1 To 2)
For I = 1 To UBound(sArr)
    If Not Dic.exists(sArr(I, 1)) Then
        K = K + 1
        Dic(sArr(I, 1)) = K
        tong = tong + sArr(I, 2)
    End If
Next
Range("F4") = tong
Set Dic = Nothing
End Sub
 
Mình xin góp Vui mã VBA này đúng theo yêu cầu
Cái này chuyển thành hàm UDF thì tiện và đúng theo yêu cầu "hàm VBA" hơn là để chạy code thế này, mỗi lần dùng code này lại phải bấm một phát. Không tiện bằng hàm UDF, nhập dữ liệu đến đâu hiện kết quả đến đó.
 
Cái này chuyển thành hàm UDF thì tiện và đúng theo yêu cầu "hàm VBA" hơn là để chạy code thế này, mỗi lần dùng code này lại phải bấm một phát. Không tiện bằng hàm UDF, nhập dữ liệu đến đâu hiện kết quả đến đó.
Gửi bạn 1 nốt nhạc . Công thức trên Excel ví dụ = congdon(C5 : 700) enter là lụm
Mã:
Function CongDon(rngData As Range) As Double
Dim i As Long, k As Long
Dim sArr() As Variant
Dim Dic As Object
Dim tong As Double
Set Dic = CreateObject("Scripting.dictionary")
sArr = rngData.Value
For i = 1 To UBound(sArr)
    If Not Dic.exists(sArr(i, 1)) Then
        k = k + 1
        Dic(sArr(i, 1)) = k
        tong = tong + sArr(i, 2)
    End If
Next i
CongDon = tong
Set Dic = Nothing
End Function
 
Không ổn nhé, file thiếu giả định mà.
Mà công thức trên hay quá trời, quan sát và tư duy toán học bá đạo, có thể ứng dụng thực tế được.

Còn hàm của bạn thì có thể cho tình huống cụ thể ứng dụng được không?
 
Không ổn nhé, file thiếu giả định mà.
Mà công thức trên hay quá trời, quan sát và tư duy toán học bá đạo, có thể ứng dụng thực tế được.

Còn hàm của bạn thì có thể cho tình huống cụ thể ứng dụng được không?
Có đọc câu hỏi "nếu trùng lấy dòng nằm trên" chưa vậy ? Công thức hay nhưng trật lất yêu cầu câu hỏi mà cũng bay vào tung hô
 
Gửi bạn 1 nốt nhạc . Công thức trên Excel ví dụ = congdon(C5 : 700) enter là lụm
Mã:
Function CongDon(rngData As Range) As Double
Dim i As Long, k As Long
Dim sArr() As Variant
Dim Dic As Object
Dim tong As Double
Set Dic = CreateObject("Scripting.dictionary")
sArr = rngData.Value
For i = 1 To UBound(sArr)
    If Not Dic.exists(sArr(i, 1)) Then
        k = k + 1
        Dic(sArr(i, 1)) = k
        tong = tong + sArr(i, 2)
    End If
Next i
CongDon = tong
Set Dic = Nothing
End Function
Nếu Cột mã Arr(i,1) và cột số lượng cần cộng (arr(i,2) không nằm gần nhau thì .....


A
1​
A
2​
B
3​
C
4​
D
5​
B
6​
A
7​
E
8​
C
9​
D
10​
G
11​
 
Nếu Cột mã Arr(i,1) và cột số lượng cần cộng (arr(i,2) không nằm gần nhau thì .....


A
1​
A
2​
B
3​
C
4​
D
5​
B
6​
A
7​
E
8​
C
9​
D
10​
G
11​
1 nốt nhạc em trai
Mã:
Function congdoncachxa(inputRange As Range) As Long
Dim i As Long, k As Long, tong As Double
Dim sArr(), dArr()
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
sArr = inputRange.Value
ReDim dArr(1 To UBound(sArr), 1 To 3)
For i = 1 To UBound(sArr)
If Not Dic.exists(sArr(i, 1)) Then
k = k + 1
Dic(sArr(i, 1)) = k
tong = tong + sArr(i, 3)
End If
Next i
congdoncachxa = tong
Set Dic = Nothing
End Function
 
1 nốt nhạc em trai

tong = tong + sArr(i, 3)
Thế nếu cột số lượng cần cộng (arr(i,3)) không phải là cột 3 trong mảng Arr mà là 1 số nào đó (4,10,50,....) thì làm sao?Cứ mỗi lần mở rộng mảng Arr (tức là số cột cần cộng dồn có thể không cố định ) lại phải vào VBE để sửa lại số cột arr(i,3) thành Arr(i,....) cho đúng ý định thì có còn gọi là "một nốt nhạc" không?
A
1​
A
2​
B
3​
C
4​
A
5​
E
6​
C
7​
G
8​
D
9​
E
10​
G
11​
Hoặc:
A
1​
A
2​
B
3​
C
4​
A
5​
E
6​
C
7​
G
8​
D
9​
E
10​
G
11​
 
Anh bố thí cúng dường code cho mầy nha Nhóc con. Mầy nên thách đố các người khác , đừng nến thách đố GIáo Sư Nhé
View attachment 300253

Mã:
Function congdoncachxa(inputRange As Range) As Long
Dim i As Long, k As Long, tong As Double
Dim sArr(), dArr()
Dim Dic As Object
Set Dic = CreateObject("Scripting.dictionary")
congdoncachxa = inputRange.Columns.Count
sArr = inputRange.Value
ReDim dArr(1 To UBound(sArr), 1 To congdoncachxa)
For i = 1 To UBound(sArr)
If Not Dic.exists(sArr(i, 1)) Then
k = k + 1
Dic(sArr(i, 1)) = k
tong = tong + sArr(i, congdoncachxa)
End If
Next i
congdoncachxa = tong
Set Dic = Nothing
End Function
Hàm này dùng 1 lần thì set object 1 lần + "xóa" object 1 lần. Nếu dùng cho 1 triệu dòng thì có nặng không vậy
 
Bạn xem thử , chắc là đúng ý rồi đó (Dùng VBA)
1713162516452.png
 

File đính kèm

  • sum stt.xlsm
    19.4 KB · Đọc: 6
Thử hàm như sau:
TINHTONG1:=SUMX (
SELECTCOLUMNS (
VALUES ( Table1[STT] ),
"STT", Table1[STT],
"First_Số Lượng", CALCULATE ( FIRSTNONBLANK ( Table1[Số Lượng], 1 ) )),
[First_Số Lượng])
 
Web KT
Back
Top Bottom