Sử dụng VBA để Xử lý 20.000Data Thay INDEX(Match)

Liên hệ QC

Đô Huỳnh

Thành viên mới
Tham gia
29/12/20
Bài viết
15
Được thích
6
Chào Anh/Chị và các bạn,

Em đang gặp vấn đề khi xử lý 20.000 Data.

Cụ thể: Em cần tìm giá trị theo 2 điều kiện

- Cách cũ: Em đã dùng
1. AGGREGATE(14,6,(<Condition 1>)*(<Condition 2>)*(<Kết quả>),1)
=> Máy chạy không nổi
2. {VLOOKUP(<Criteria 1> & <Criteria 2> ,CHOOSE({1,2},<Criteria_range 1>&<Criteria_range 2>, <Kết quả>),2,0)}
=> 5p cho 1.000 Data
3. INDEX kết hợp MATCH
INDEX(<Kết quả> , MATCH( 1 , INDEX((<Condition 1>)*(<Condition 2>),0),0)
=> 3p cho 1.000 Data
INDEX(<Kết quả> , MATCH( 1 , (<Condition 1>)*(<Condition 2>),0))
=> 2p cho 1.000 Data
=> 43p cho 20.000 Data

Vấn đề: File khá nặng và mỗi lần mở / Hide / Filter thì nó chạy tính toán mất thời gian.

- Cách mới của cũ: Em dùng VBA để Paste Value cho nhẹ.
=> 1h12p Cho 20.000 Data

Vấn đề: Data em nối bằng Query để khi cập nhật thì nó có dữ liệu cho Sheet thống kê.

Đoạn code và file đính kèm như sau:

Dim i As Integer
Dim j As Integer
i = 2
j = 2

'Check ID
Do While Sheets("STATISTIC").Cells(i, j).Value <> ""

'Chen Cong thuc vao O C2
Sheets("STATISTIC").Cells(i, j + 1).FormulaArray = _
"=IFNA(INDEX(Revenue[Revenue],MATCH(1,(Revenue[ID]=RC2)*(Revenue[CK]=R1C),0)),""-"")"

'Copy C2
Cells(i, j + 1).Copy

'Paste
Range("D" & i & ":" & "W" & i).Select
'Range("W" & i).Activate
ActiveSheet.Paste

'Paste Value
Range("C" & i & ":" & "W" & i) = Range("C" & i & ":" & "W" & i).Value

i = i + 1
Loop

Application.CutCopyMode = False
Cells(1, 1).Select
MsgBox "Done"

End Sub

[File đính kèm là Excel 3 sheet: Statistic (Chứa Form) , Data (Tham chiếu), 20000Data]

Mong mọi người chỉ điểm, Thanks All !!!!!
 

File đính kèm

  • VBA-20000_Data.xlsm
    2.3 MB · Đọc: 29
Lần chỉnh sửa cuối:
Chào Anh/Chị và các bạn,

Em đang gặp vấn đề khi xử lý 20.000 Data.

Cụ thể: Em cần tìm giá trị theo 2 điều kiện

- Cách cũ: Em đã dùng
1. AGGREGATE(14,6,(<Condition 1>)*(<Condition 2>)*(<Kết quả>),1)
=> Máy chạy không nổi
2. {VLOOKUP(<Criteria 1> & <Criteria 2> ,CHOOSE({1,2},<Criteria_range 1>&<Criteria_range 2>, <Kết quả>),2,0)}
=> 5p cho 1.000 Data
3. INDEX kết hợp MATCH
INDEX(<Kết quả> , MATCH( 1 , INDEX((<Condition 1>)*(<Condition 2>),0),0)
=> 3p cho 1.000 Data
INDEX(<Kết quả> , MATCH( 1 , (<Condition 1>)*(<Condition 2>),0))
=> 2p cho 1.000 Data
=> 43p cho 20.000 Data

Vấn đề: File khá nặng và mỗi lần mở / Hide / Filter thì nó chạy tính toán mất thời gian.

- Cách mới của cũ: Em dùng VBA để Paste Value cho nhẹ. (Em mới học VBA qua Youtube 3 ngày)
=> 1h12p Cho 20.000 Data

Vấn đề: Data em nối bằng Query để khi cập nhật thì nó có dữ liệu cho Sheet thống kê.

Đoạn code và file đính kèm như sau:

Dim i As Integer
Dim j As Integer
i = 2
j = 2

'Check ID
Do While Sheets("STATISTIC").Cells(i, j).Value <> ""

'Chen Cong thuc vao O C2
Sheets("STATISTIC").Cells(i, j + 1).FormulaArray = _
"=IFNA(INDEX(Revenue[Revenue],MATCH(1,(Revenue[ID]=RC2)*(Revenue[CK]=R1C),0)),""-"")"

'Copy C2
Cells(i, j + 1).Copy

'Paste
Range("D" & i & ":" & "W" & i).Select
'Range("W" & i).Activate
ActiveSheet.Paste

'Paste Value
Range("C" & i & ":" & "W" & i) = Range("C" & i & ":" & "W" & i).Value

i = i + 1
Loop

Application.CutCopyMode = False
Cells(1, 1).Select
MsgBox "Done"

End Sub

[File đính kèm là Excel 3 sheet: Statistic (Chứa Form) , Data (Tham chiếu), 20000Data]

Mong mọi người chỉ điểm, Thanks All !!!!!
20.000 data hay data 20.000 dòng?
 
Upvote 0
Bạn nêu kết quả mong muốn của bạn là gì? logic lấy kết quả là gì? , biết đâu sẽ có giải pháp khác nhanh hơn giải pháp bạn đã làm.
Kết quả kỳ vọng là cải thiện thời gian xử lý và nhẹ file. (Do Sheet Data còn cập nhật nên em muốn dữ liệu chạy nhanh).

Logic:
Tại Statistic!C:W, tham chiếu giá trị revenue theo hai điều kiện: Statistic[ID]=Data[ID], Data[CK] = CK tại mỗi ô C1:W1.

True: in giá trị của cột Data[Revenue].
False: in "-" (dấu gạch ngang).

Công thức em đang dùng: (ô C2)
=IFNA(INDEX(Data[Revenue],MATCH(1,(Data[ID]=$B2)*(Data[CK]=C$1),0),"-")

Thanks
 
Upvote 0
Bạn tự test kỹ và tìm hiểu. Tôi chú thích từng dòng code cho bạn, không thể hơn thế nữa.

Dữ liệu đầu vào chỉ là cột B, cột A bạn tự đánh số. Sau khi nhập cột B thì chạy code.

Nhớ báo cáo thời gian chạy nhé. Làm thế này
Mã:
Sub CT()
Dim lastRow As Long, r As Long, c As Long, k As Long, col As Long, ck_count As Long, id As String, dulieu(), kq(), idArr(), ckArr(), dic As Object, t
t = Timer

... toan bo code o duoi

MsgBox Timer - t
End Sub

Code trong Module
Mã:
Sub CT()
Dim lastRow As Long, r As Long, c As Long, k As Long, col As Long, ck_count As Long, id As String, dulieu(), kq(), idArr(), ckArr(), dic As Object
    With ThisWorkbook.Worksheets("STATISTIC")
        .Range("C2:W100000").ClearContents  ' xoa ket qua cu
        lastRow = .Cells(Rows.Count, "B").End(xlUp).Row '   dong cuoi cung co du lieu trong cot B
        If lastRow = 1 Then Exit Sub    ' khong co du lieu thi don do choi
        idArr = .Range("B2:B" & lastRow + 1).Value  ' cho cac id vao mang idArr
        ckArr = .Range("C1:W1").Value   ' cho cac CK o dong 1 vao mang ckArr
    End With
    dulieu = Range("Revenue").Value ' lay du lieu cua Revenue vao mang dulieu
    ReDim kq(1 To UBound(idArr, 1) - 1, 1 To UBound(ckArr, 2))  ' mang ket qua kq co so dong bang so dong du lieu trong cot B, va co so cot bang so cot tu C den W
    Set dic = CreateObject("Scripting.Dictionary")  ' tu dien cac ck khac nhau tu C1:W1
    For c = 1 To UBound(ckArr, 2)
        If Not dic.exists(ckArr(1, c)) Then dic.Add ckArr(1, c), c  ' cho cac ck tu C1:W1 vao tu dien dic, ung voi key = ck thi item = chi so cot tren sheet STATISTIC tinh tu 1 - cot C -> 1
    Next c
    For r = 1 To UBound(idArr, 1) - 1   ' xet tung dong mang id
        id = idArr(r, 1)    ' id hien hanh dang xet - id trong cot B cua sheet STATISTIC
        ck_count = 0
        For k = 1 To UBound(dulieu, 1)  ' xet tung dong cua mang dulieu - Revenue
            If dulieu(k, 2) = id Then   ' neu id hien hanh cua mang dulieu = id hien hanh dang xet
                col = dic.Item(dulieu(k, 3))    ' doc ra chi so cot ung voi CK
                If col > 0 And IsEmpty(kq(r, col)) Then ' neu cot > 0 va o kq(r, col) van chua lan nao duoc nhap gia tri - de phong truong hop co 2 dong cung ID va CK trong Revenue thi chi lay lan dau
                    kq(r, col) = dulieu(k, 4)   ' lay Revenue vao mang kq vao dong hien hanh r vao cot col ma o do o dong 1 cua STATICSTIC co CK
                    ck_count = ck_count + 1 ' tang so luong Revenue da nhap vao mang ket qua kq
                    If ck_count > dic.Count Then Exit For   ' ung voi moi ID chi co nhieu nhat la dic.Count gia tri CK (doc tu C1:W1) khac nhau tung doi mot. Neu ck_count da vuot qua gioi han thi khong xet tiep cac dong tiep theo cua mang dulieu - Revenue.
                End If
            End If
        Next k
    Next r
    ThisWorkbook.Worksheets("STATISTIC").Range("C2").Resize(UBound(kq, 1), UBound(kq, 2)).Value = kq
    
    MsgBox "Done"
End Sub
 
Upvote 0
Bạn tự test kỹ và tìm hiểu. Tôi chú thích từng dòng code cho bạn, không thể hơn thế nữa.

Dữ liệu đầu vào chỉ là cột B, cột A bạn tự đánh số. Sau khi nhập cột B thì chạy code.

Nhớ báo cáo thời gian chạy nhé. Làm thế này
Mã:
Sub CT()
Dim lastRow As Long, r As Long, c As Long, k As Long, col As Long, ck_count As Long, id As String, dulieu(), kq(), idArr(), ckArr(), dic As Object, t
t = Timer

... toan bo code o duoi

MsgBox Timer - t
End Sub

Code trong Module
Mã:
Sub CT()
Dim lastRow As Long, r As Long, c As Long, k As Long, col As Long, ck_count As Long, id As String, dulieu(), kq(), idArr(), ckArr(), dic As Object
    With ThisWorkbook.Worksheets("STATISTIC")
        .Range("C2:W100000").ClearContents  ' xoa ket qua cu
        lastRow = .Cells(Rows.Count, "B").End(xlUp).Row '   dong cuoi cung co du lieu trong cot B
        If lastRow = 1 Then Exit Sub    ' khong co du lieu thi don do choi
        idArr = .Range("B2:B" & lastRow + 1).Value  ' cho cac id vao mang idArr
        ckArr = .Range("C1:W1").Value   ' cho cac CK o dong 1 vao mang ckArr
    End With
    dulieu = Range("Revenue").Value ' lay du lieu cua Revenue vao mang dulieu
    ReDim kq(1 To UBound(idArr, 1) - 1, 1 To UBound(ckArr, 2))  ' mang ket qua kq co so dong bang so dong du lieu trong cot B, va co so cot bang so cot tu C den W
    Set dic = CreateObject("Scripting.Dictionary")  ' tu dien cac ck khac nhau tu C1:W1
    For c = 1 To UBound(ckArr, 2)
        If Not dic.exists(ckArr(1, c)) Then dic.Add ckArr(1, c), c  ' cho cac ck tu C1:W1 vao tu dien dic, ung voi key = ck thi item = chi so cot tren sheet STATISTIC tinh tu 1 - cot C -> 1
    Next c
    For r = 1 To UBound(idArr, 1) - 1   ' xet tung dong mang id
        id = idArr(r, 1)    ' id hien hanh dang xet - id trong cot B cua sheet STATISTIC
        ck_count = 0
        For k = 1 To UBound(dulieu, 1)  ' xet tung dong cua mang dulieu - Revenue
            If dulieu(k, 2) = id Then   ' neu id hien hanh cua mang dulieu = id hien hanh dang xet
                col = dic.Item(dulieu(k, 3))    ' doc ra chi so cot ung voi CK
                If col > 0 And IsEmpty(kq(r, col)) Then ' neu cot > 0 va o kq(r, col) van chua lan nao duoc nhap gia tri - de phong truong hop co 2 dong cung ID va CK trong Revenue thi chi lay lan dau
                    kq(r, col) = dulieu(k, 4)   ' lay Revenue vao mang kq vao dong hien hanh r vao cot col ma o do o dong 1 cua STATICSTIC co CK
                    ck_count = ck_count + 1 ' tang so luong Revenue da nhap vao mang ket qua kq
                    If ck_count > dic.Count Then Exit For   ' ung voi moi ID chi co nhieu nhat la dic.Count gia tri CK (doc tu C1:W1) khac nhau tung doi mot. Neu ck_count da vuot qua gioi han thi khong xet tiep cac dong tiep theo cua mang dulieu - Revenue.
                End If
            End If
        Next k
    Next r
    ThisWorkbook.Worksheets("STATISTIC").Range("C2").Resize(UBound(kq, 1), UBound(kq, 2)).Value = kq
 
    MsgBox "Done"
End Sub
Thanks @batman1 rất nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Chào Anh/Chị và các bạn,

Em đang gặp vấn đề khi xử lý 20.000 Data.

Cụ thể: Em cần tìm giá trị theo 2 điều kiện

- Cách cũ: Em đã dùng
1. AGGREGATE(14,6,(<Condition 1>)*(<Condition 2>)*(<Kết quả>),1)
=> Máy chạy không nổi
2. {VLOOKUP(<Criteria 1> & <Criteria 2> ,CHOOSE({1,2},<Criteria_range 1>&<Criteria_range 2>, <Kết quả>),2,0)}
=> 5p cho 1.000 Data
3. INDEX kết hợp MATCH
INDEX(<Kết quả> , MATCH( 1 , INDEX((<Condition 1>)*(<Condition 2>),0),0)
=> 3p cho 1.000 Data
INDEX(<Kết quả> , MATCH( 1 , (<Condition 1>)*(<Condition 2>),0))
=> 2p cho 1.000 Data
=> 43p cho 20.000 Data

Vấn đề: File khá nặng và mỗi lần mở / Hide / Filter thì nó chạy tính toán mất thời gian.

- Cách mới của cũ: Em dùng VBA để Paste Value cho nhẹ. (Em mới học VBA qua Youtube 3 ngày)
=> 1h12p Cho 20.000 Data

Vấn đề: Data em nối bằng Query để khi cập nhật thì nó có dữ liệu cho Sheet thống kê.

Đoạn code và file đính kèm như sau:

Dim i As Integer
Dim j As Integer
i = 2
j = 2

'Check ID
Do While Sheets("STATISTIC").Cells(i, j).Value <> ""

'Chen Cong thuc vao O C2
Sheets("STATISTIC").Cells(i, j + 1).FormulaArray = _
"=IFNA(INDEX(Revenue[Revenue],MATCH(1,(Revenue[ID]=RC2)*(Revenue[CK]=R1C),0)),""-"")"

'Copy C2
Cells(i, j + 1).Copy

'Paste
Range("D" & i & ":" & "W" & i).Select
'Range("W" & i).Activate
ActiveSheet.Paste

'Paste Value
Range("C" & i & ":" & "W" & i) = Range("C" & i & ":" & "W" & i).Value

i = i + 1
Loop

Application.CutCopyMode = False
Cells(1, 1).Select
MsgBox "Done"

End Sub

[File đính kèm là Excel 3 sheet: Statistic (Chứa Form) , Data (Tham chiếu), 20000Data]

Mong mọi người chỉ điểm, Thanks All !!!!!
Chạy thử code
Mã:
Sub ABC()
  Dim aData(), aID(), aCK(), Res() As Double, Dic As Object
  Dim eRow&, i&, j&, iR&, jC&, sRow&, sCol&, sRow2&

  With Sheets("Data")
    aData = .Range("B2", .Range("D" & Rows.Count).End(xlUp)).Value
  End With
  With Sheets("STATISTIC")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow = 1 Then Exit Sub
    aID = .Range("B2:B" & eRow).Value
    aCK = .Range("C1:W1").Value
  End With

  Set Dic = CreateObject("Scripting.Dictionary")
  sRow = UBound(aID, 1): sCol = UBound(aCK, 2)
  ReDim Res(1 To sRow, 1 To sCol + 1)
  For i = 1 To sRow
     Dic.Item(aID(i, 1)) = i
  Next i
  For j = 1 To sCol
     Dic.Item(aCK(1, j)) = j
  Next j
 
  sRow2 = UBound(aData, 1)
  For i = 1 To sRow2
    iR = Dic.Item(aData(i, 1))
    If iR > 0 Then
      jC = Dic.Item(aData(i, 2))
      If jC > 0 Then
        Res(iR, jC) = Res(iR, jC) + aData(i, 3)
        Res(iR, sCol + 1) = Res(iR, sCol + 1) + aData(i, 3)
      End If
    End If
  Next i
  Sheets("STATISTIC").Range("C2").Resize(sRow, sCol + 1).Value = Res
  MsgBox "Xong Roi!"
End Sub
 
Upvote 0
Chạy thử code
Mã:
Sub ABC()
  Dim aData(), aID(), aCK(), Res() As Double, Dic As Object
  Dim eRow&, i&, j&, iR&, jC&, sRow&, sCol&, sRow2&

  With Sheets("Data")
    aData = .Range("B2", .Range("D" & Rows.Count).End(xlUp)).Value
  End With
  With Sheets("STATISTIC")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow = 1 Then Exit Sub
    aID = .Range("B2:B" & eRow).Value
    aCK = .Range("C1:W1").Value
  End With

  Set Dic = CreateObject("Scripting.Dictionary")
  sRow = UBound(aID, 1): sCol = UBound(aCK, 2)
  ReDim Res(1 To sRow, 1 To sCol + 1)
  For i = 1 To sRow
     Dic.Item(aID(i, 1)) = i
  Next i
  For j = 1 To sCol
     Dic.Item(aCK(1, j)) = j
  Next j

  sRow2 = UBound(aData, 1)
  For i = 1 To sRow2
    iR = Dic.Item(aData(i, 1))
    If iR > 0 Then
      jC = Dic.Item(aData(i, 2))
      If jC > 0 Then
        Res(iR, jC) = Res(iR, jC) + aData(i, 3)
        Res(iR, sCol + 1) = Res(iR, sCol + 1) + aData(i, 3)
      End If
    End If
  Next i
  Sheets("STATISTIC").Range("C2").Resize(sRow, sCol + 1).Value = Res
  MsgBox "Xong Roi!"
End Sub
Thanks @HieuCD !
 
Upvote 0
@HieuCD
Chạy thử code
Mã:
Sub ABC()
  Dim aData(), aID(), aCK(), Res() As Double, Dic As Object
  Dim eRow&, i&, j&, iR&, jC&, sRow&, sCol&, sRow2&

  With Sheets("Data")
    aData = .Range("B2", .Range("D" & Rows.Count).End(xlUp)).Value
  End With
  With Sheets("STATISTIC")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow = 1 Then Exit Sub
    aID = .Range("B2:B" & eRow).Value
    aCK = .Range("C1:W1").Value
  End With

  Set Dic = CreateObject("Scripting.Dictionary")
  sRow = UBound(aID, 1): sCol = UBound(aCK, 2)
  ReDim Res(1 To sRow, 1 To sCol + 1)
  For i = 1 To sRow
     Dic.Item(aID(i, 1)) = i
  Next i
  For j = 1 To sCol
     Dic.Item(aCK(1, j)) = j
  Next j

  sRow2 = UBound(aData, 1)
  For i = 1 To sRow2
    iR = Dic.Item(aData(i, 1))
    If iR > 0 Then
      jC = Dic.Item(aData(i, 2))
      If jC > 0 Then
        Res(iR, jC) = Res(iR, jC) + aData(i, 3)
        Res(iR, sCol + 1) = Res(iR, sCol + 1) + aData(i, 3)
      End If
    End If
  Next i
  Sheets("STATISTIC").Range("C2").Resize(sRow, sCol + 1).Value = Res
  MsgBox "Xong Roi!"
End Sub
Em Chạy thử nhưng sao chỉ ra giá trị 0 ạ
 
Upvote 0
Chào Anh/Chị và các bạn,

Em đang gặp vấn đề khi xử lý 20.000 Data.

Cụ thể: Em cần tìm giá trị theo 2 điều kiện

- Cách cũ: Em đã dùng
1. AGGREGATE(14,6,(<Condition 1>)*(<Condition 2>)*(<Kết quả>),1)
=> Máy chạy không nổi
2. {VLOOKUP(<Criteria 1> & <Criteria 2> ,CHOOSE({1,2},<Criteria_range 1>&<Criteria_range 2>, <Kết quả>),2,0)}
=> 5p cho 1.000 Data
3. INDEX kết hợp MATCH
INDEX(<Kết quả> , MATCH( 1 , INDEX((<Condition 1>)*(<Condition 2>),0),0)
=> 3p cho 1.000 Data
INDEX(<Kết quả> , MATCH( 1 , (<Condition 1>)*(<Condition 2>),0))
=> 2p cho 1.000 Data
=> 43p cho 20.000 Data

Vấn đề: File khá nặng và mỗi lần mở / Hide / Filter thì nó chạy tính toán mất thời gian.

- Cách mới của cũ: Em dùng VBA để Paste Value cho nhẹ.
=> 1h12p Cho 20.000 Data

Vấn đề: Data em nối bằng Query để khi cập nhật thì nó có dữ liệu cho Sheet thống kê.

Đoạn code và file đính kèm như sau:

Dim i As Integer
Dim j As Integer
i = 2
j = 2

'Check ID
Do While Sheets("STATISTIC").Cells(i, j).Value <> ""

'Chen Cong thuc vao O C2
Sheets("STATISTIC").Cells(i, j + 1).FormulaArray = _
"=IFNA(INDEX(Revenue[Revenue],MATCH(1,(Revenue[ID]=RC2)*(Revenue[CK]=R1C),0)),""-"")"

'Copy C2
Cells(i, j + 1).Copy

'Paste
Range("D" & i & ":" & "W" & i).Select
'Range("W" & i).Activate
ActiveSheet.Paste

'Paste Value
Range("C" & i & ":" & "W" & i) = Range("C" & i & ":" & "W" & i).Value

i = i + 1
Loop

Application.CutCopyMode = False
Cells(1, 1).Select
MsgBox "Done"

End Sub

[File đính kèm là Excel 3 sheet: Statistic (Chứa Form) , Data (Tham chiếu), 20000Data]

Mong mọi người chỉ điểm, Thanks All !!!!!
Thử dùng PowerQuery và PivotTable, 20,000 dòng mình thấy kết quả chạy cũng nhanh
 

File đính kèm

  • PowerQuery+PivotTabel-20000_Data.xlsb
    3.5 MB · Đọc: 26
Upvote 0
Thanks, @hocexcel_1991 làm sau Pivot Sheet 20000Data với Sheet Data thế?

Mà em còn có 1 vài tính toán sau khi xử lý 20.000 dòng này.

Mình Pivot rồi sợ bị lệch hàng lệch cột ạ!
Bạn có thể xử lí xử liệu trong PowerQuery trước sau đó dùng PivotTable hoặc hơn nữa có thể dùng dùng PowerPivot
 
Upvote 0
Bạn có thể xử lí xử liệu trong PowerQuery trước sau đó dùng PivotTable hoặc hơn nữa có thể dùng dùng PowerPivot
Người ta đã nói "sợ lệch hàng lệch cột".
Với những người này thì không bao giờ nói chuyện công cụ có sẵn của Excel được. Đầu óc của họ đã dính cứng vào cái mẫu mã mà họ nghĩ ra từ đầu.
 
Upvote 0
Bạn có thể xử lí xử liệu trong PowerQuery trước sau đó dùng PivotTable hoặc hơn nữa có thể dùng dùng PowerPivot
Thanks @hocexcel_1991 nhiều!
Bài đã được tự động gộp:

Người ta đã nói "sợ lệch hàng lệch cột".
Với những người này thì không bao giờ nói chuyện công cụ có sẵn của Excel được. Đầu óc của họ đã dính cứng vào cái mẫu mã mà họ nghĩ ra từ đầu.
Em còn ít kinh nghiệm về Excel nên chưa hiểu hết, @VetMini thông cảm!
 
Upvote 0
Thử dùng PowerQuery và PivotTable, 20,000 dòng mình thấy kết quả chạy cũng nhanh
Tôi kiểm tra qua thì thấy:
- Của chủ thớt. Với ID = YLEN1Y75LK7101974 thì kết quả cho CK = 80 000 là 348 500 (J75 sheet STATISTIC). Trong sheet Data thì ứng với ID = YLEN1Y75LK7101974 và CK = 80 000 cũng là 348 500.

- Trong lời giải bài #14 thì với ID = YLEN1Y75LK7101974 thì kết quả cho CK = 80 000 lại là 697000 (J14 sheet KetQua)

Nếu tôi không lầm thì các kết quả sau cũng sai: H15, H16, H17, D293, F293, D345, H376, J444, F543, D690, D842, F842, D1381, H2920, F3209, D3670, D3692, F3758, D4177, F4225, D4245, D4277, C4471, và 130 ô khác cũng sai.

Có thể tôi nhầm lẫn với các ô tô xanh nhưng chắc chắn sai ở J14, H15, H16 và H17 (đã kiểm tra). Bạn thử kiểm tra lại xem cho chắc chắn.
 
Upvote 0
Web KT

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

Back
Top Bottom