Dùng Mảng để cộng tổng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

keke355992

Thành viên thường trực
Tham gia
19/1/08
Bài viết
310
Được thích
20
Nghề nghiệp
KẾ TOÁN THUẾ, TƯ VẪN THUẾ
- Xin chào các Anh chị trong diễn đàn.
- E đang học về mảng. E có 1 ví dụ sau: Tại cột G là dữ liệu mặc định ban đầu, e muốn kết quả : mỗi khi 1 mặt hàng của cột G, được tìm thấy tại cột B, thì cột B có bao nhiu dòng phát sinh mặt hàng đó, cộng hết lại ứng với Số lượng tại cột D. Nó chính là hàm Sumif tại cột H ( E k bit diễn đạt kiểu nào ). E mún dùng Mảng để giải quyết bài tập này ạ. e xin cảm ơn !
 

File đính kèm

- Xin chào các Anh chị trong diễn đàn.
- E đang học về mảng. E có 1 ví dụ sau: Tại cột G là dữ liệu mặc định ban đầu, e muốn kết quả : mỗi khi 1 mặt hàng của cột G, được tìm thấy tại cột B, thì cột B có bao nhiu dòng phát sinh mặt hàng đó, cộng hết lại ứng với Số lượng tại cột D. Nó chính là hàm Sumif tại cột H ( E k bit diễn đạt kiểu nào ). E mún dùng Mảng để giải quyết bài tập này ạ. e xin cảm ơn !
Bạn chon vùng I4:I2436 sau đó nhập CT này:
Mã:
=SUMIF($B$4:$B$3481,$G$4:$G$2436,$C$4:$C$3481)
Bấm Ctrl+Shift+Enter!!!
 
Upvote 0
E mún dùng Mảng để giải quyết bài tập này ạ. e xin cảm ơn !

Lý do tại sao muốn dùng mảng? Bạn (hoặc GV ra bài) nghĩ dùng mảng trong trường hợp này thì học được gì?

Chú: từ e trong tiếng Việt có nghĩa là ngại. Hỏi bài nên cố tránh những từ ngữ có thể gây hiểu lầm. Sự hiểu lầm chỉ làm cho bài được giải chậm hơn, thiệt cho bạn mà thôi.
 
Upvote 0
Lý do tại sao muốn dùng mảng? Bạn (hoặc GV ra bài) nghĩ dùng mảng trong trường hợp này thì học được gì?

Chú: từ e trong tiếng Việt có nghĩa là ngại. Hỏi bài nên cố tránh những từ ngữ có thể gây hiểu lầm. Sự hiểu lầm chỉ làm cho bài được giải chậm hơn, thiệt cho bạn mà thôi.

Dạ e hỉu rùi. Nhg mà còn ít tuổi, không biết dùng từ nào để thay thế ạ. Trong bài này, ý em là dùng Mảng trong VBA để giải quyết ạ, chứ k pải là Ctrl Shirt Enter. Cái cột dùng hàm Sumif là để thể hiện kết quả thui ạ. Hiện tại e toàn dùng sumif nên bảng tính nặng qá, e nghĩ là cái này dùng mảng đc. E mới đag tìm hiểu, nhg công việc cần gấp nên lên diễn đàn nhờ sự trợ giúp
 
Lần chỉnh sửa cuối:
Upvote 0
Ý mình là dùng mảng trong VBA bạn ơi

Dùng mảng trong VBA thì dùng luôn 1 Sub, Lọc duy nhất và tính tổng luôn cho rồi.
PHP:
Sub Mang()
Dim sArr(), dArr(), I As Long, K As Long, Tem As String
sArr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
ReDim dArr(1 To UBound(sArr), 1 To 2)
With CreateObject("Scripting.Dictionary")
For I = 1 To UBound(sArr)
    Tem = Trim(sArr(I, 1))
    If Not .Exists(Tem) Then
        K = K + 1
        .Add Tem, K
        dArr(K, 1) = Tem: dArr(K, 2) = sArr(I, 2)
    Else
        dArr(.Item(Tem), 2) = dArr(.Item(Tem), 2) + sArr(I, 2)
    End If
Next I
End With
Range("D4").Resize(K, 2) = dArr
Range("D4").Resize(K, 2).Sort Key1:=Range("D4"), Order1:=xlAscending
End Sub
 
Upvote 0
Dùng mảng trong VBA thì dùng luôn 1 Sub, Lọc duy nhất và tính tổng luôn cho rồi.

Sub Mang()
Dim sArr(), dArr(), I As Long, K As Long, Tem As String
sArr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
ReDim dArr(1 To UBound(sArr), 1 To 2)
With CreateObject("Scripting.Dictionary")
For I = 1 To UBound(sArr)
Tem = Trim(sArr(I, 1))
If Not .Exists(Tem) Then
K = K + 1
.Add Tem, K
dArr(K, 1) = Tem: dArr(K, 2) = sArr(I, 2)
Else
dArr(.Item(Tem), 2) = dArr(.Item(Tem), 2) + sArr(I, 2)
End If
Next I
End With
Range("D4").Resize(K, 2) = dArr
Range("D4").Resize(K, 2).Sort Key1:=Range("D4"), Order1:=xlAscending
End Sub

E làm được rùi, thật tuyệt. cảm ơn a rất nhìu
 
Lần chỉnh sửa cuối:
Upvote 0
- Xin chào các Anh chị trong diễn đàn.
- E đang học về mảng. E có 1 ví dụ sau: Tại cột G là dữ liệu mặc định ban đầu, e muốn kết quả : mỗi khi 1 mặt hàng của cột G, được tìm thấy tại cột B, thì cột B có bao nhiu dòng phát sinh mặt hàng đó, cộng hết lại ứng với Số lượng tại cột D. Nó chính là hàm Sumif tại cột H ( E k bit diễn đạt kiểu nào ). E mún dùng Mảng để giải quyết bài tập này ạ. e xin cảm ơn !

Với dữ liệu của bạn, dùng PivotTable mới là lựa chọn hợp lý nhất. Nói về tốc độ thì.. khỏi bàn. Vậy sao bạn không dùng?
 
Upvote 0
Với dữ liệu của bạn, dùng PivotTable mới là lựa chọn hợp lý nhất. Nói về tốc độ thì.. khỏi bàn. Vậy sao bạn không dùng?

E làm thử bằng Pivot ra kết quả cũng như của a Ba Tê vậy. nhưng mục đích làm của e không pải là để báo cáo nên sợ Pivot không linh động bằng cách dùng mảng thầy ạ. Tại e cũng đang nghiên cứu về mảng nữa /-*+/
 
Upvote 0
- Xin chào các Anh chị trong diễn đàn.
- E đang học về mảng. E có 1 ví dụ sau: Tại cột G là dữ liệu mặc định ban đầu, e muốn kết quả : mỗi khi 1 mặt hàng của cột G, được tìm thấy tại cột B, thì cột B có bao nhiu dòng phát sinh mặt hàng đó, cộng hết lại ứng với Số lượng tại cột D. Nó chính là hàm Sumif tại cột H ( E k bit diễn đạt kiểu nào ). E mún dùng Mảng để giải quyết bài tập này ạ. e xin cảm ơn !

A Ba Tê hoặc ai có thể giúp e dùng mảng theo đúng mong mún trong bài này được ko ạ, vì cột G dữ liệu được tổng hợp từ nhiều hơn 1 nguồn ạ. E chỉ cần dữ liệu tổng cộng cho cột I thôi !
 
Upvote 0
- Xin chào các Anh chị trong diễn đàn.
- E đang học về mảng. E có 1 ví dụ sau: Tại cột G là dữ liệu mặc định ban đầu, e muốn kết quả : mỗi khi 1 mặt hàng của cột G, được tìm thấy tại cột B, thì cột B có bao nhiu dòng phát sinh mặt hàng đó, cộng hết lại ứng với Số lượng tại cột D. Nó chính là hàm Sumif tại cột H ( E k bit diễn đạt kiểu nào ). E mún dùng Mảng để giải quyết bài tập này ạ. e xin cảm ơn !
bạn thử code
Mã:
Sub Mang()
Dim Sarr(), Darr(), Arr(), i As Long, Tmp As String
Darr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
Sarr = Range("G4", Range("G4").End(xlDown)).Value
ReDim Arr(1 To UBound(Sarr), 1 To 1)
With CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(Darr)
    Tmp = Trim(Darr(i, 1))
    If Not .Exists(Tmp) Then
        .Add Tmp, Darr(i, 2)
    Else
        .Item(Tmp) = .Item(Tmp) + Darr(i, 2)
    End If
  Next i
  For i = 1 To UBound(Sarr)
    Tmp = Trim(Sarr(i, 1))
    If .Exists(Tmp) Then Arr(i, 1) = .Item(Tmp)
  Next i
End With
Range("I4").Resize(UBound(Sarr), 1) = Arr
End Sub
 
Upvote 0
A Ba Tê hoặc ai có thể giúp e dùng mảng theo đúng mong mún trong bài này được ko ạ, vì cột G dữ liệu được tổng hợp từ nhiều hơn 1 nguồn ạ. E chỉ cần dữ liệu tổng cộng cho cột I thôi !

Nếu vậy thì bạn thay Sub trên bằng cái này thử xem.
PHP:
Sub Mang()
Dim sArr(), dArr(), I As Long, Tem As String
    sArr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
With CreateObject("Scripting.Dictionary")
    For I = 1 To UBound(sArr)
        Tem = Trim(sArr(I, 1)): .Item(Tem) = .Item(Tem) + sArr(I, 2)
    Next I
        sArr = Range("G4", Range("G4").End(xlDown)).Value
        ReDim dArr(1 To UBound(sArr), 1 To 1)
    For I = 1 To UBound(sArr)
        Tem = Trim(sArr(I, 1)): dArr(I, 1) = .Item(Tem)
    Next I
End With
    Range("I4").Resize(I - 1) = dArr
End Sub
Chú ý: Công thức trong cột H của bạn chưa chuẩn!
 
Lần chỉnh sửa cuối:
Upvote 0
bạn xem cách dùng 1 mảng Darr
Mã:
Sub Mang()
Dim Darr(), i As Long
Darr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
sArr = Range("G4", Range("G4").End(xlDown)).Value
With CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(Darr)
    .Item(Darr(i, 1)) = .Item(Darr(i, 1)) + Darr(i, 2)
  Next i
  Darr = Range("F4", Range("G4").End(xlDown)).Value
  For i = 1 To UBound(Darr)
    Darr(i, 1) = .Item(Darr(i, 2))
  Next i
End With
Range("I4").Resize(UBound(Darr), 1) = Darr
End Sub
 
Upvote 0
bạn thử code
Mã:
Sub Mang()
Dim Sarr(), Darr(), Arr(), i As Long, Tmp As String
Darr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
Sarr = Range("G4", Range("G4").End(xlDown)).Value
ReDim Arr(1 To UBound(Sarr), 1 To 1)
With CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(Darr)
    Tmp = Trim(Darr(i, 1))
    If Not .Exists(Tmp) Then
        .Add Tmp, Darr(i, 2)
    Else
        .Item(Tmp) = .Item(Tmp) + Darr(i, 2)
    End If
  Next i
  For i = 1 To UBound(Sarr)
    Tmp = Trim(Sarr(i, 1))
    If .Exists(Tmp) Then Arr(i, 1) = .Item(Tmp)
  Next i
End With
Range("I4").Resize(UBound(Sarr), 1) = Arr
End Sub

Nếu vậy thì bạn thay Sub trên bằng cái này thử xem.
PHP:
Sub Mang()
Dim sArr(), dArr(), I As Long, Tem As String
    sArr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
With CreateObject("Scripting.Dictionary")
    For I = 1 To UBound(sArr)
        Tem = Trim(sArr(I, 1)): .Item(Tem) = .Item(Tem) + sArr(I, 2)
    Next I
        sArr = Range("G4", Range("G4").End(xlDown)).Value
        ReDim dArr(1 To UBound(sArr), 1 To 1)
    For I = 1 To UBound(sArr)
        Tem = Trim(sArr(I, 1)): dArr(I, 1) = .Item(Tem)
    Next I
End With
    Range("I4").Resize(I - 1) = dArr
End Sub
Chú ý: Công thức trong cột H của bạn chưa chuẩn!

bạn xem cách dùng 1 mảng Darr
Mã:
Sub Mang()
Dim Darr(), i As Long
Darr = Range("B4", Range("B4").End(xlDown)).Resize(, 2).Value
sArr = Range("G4", Range("G4").End(xlDown)).Value
With CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(Darr)
    .Item(Darr(i, 1)) = .Item(Darr(i, 1)) + Darr(i, 2)
  Next i
  Darr = Range("F4", Range("G4").End(xlDown)).Value
  For i = 1 To UBound(Darr)
    Darr(i, 1) = .Item(Darr(i, 2))
  Next i
End With
Range("I4").Resize(UBound(Darr), 1) = Darr
End Sub


Chân thành cảm ơn 2 bác, không thể tuyệt vời hơn. Chúc 2 bác và Anh chị e ngày cuối tuấn vui vẻ J
 
Upvote 0
E làm thử bằng Pivot ra kết quả cũng như của a Ba Tê vậy. nhưng mục đích làm của e không pải là để báo cáo nên sợ Pivot không linh động bằng cách dùng mảng thầy ạ. Tại e cũng đang nghiên cứu về mảng nữa /-*+/
Nếu nói NGHIÊN CỨU thì ok, chứ PivotTable mà nói không linh hoạt thì còn thằng nào linh hoạt hơn nữa?
 
Upvote 0
Nếu nói NGHIÊN CỨU thì ok, chứ PivotTable mà nói không linh hoạt thì còn thằng nào linh hoạt hơn nữa?

Chủ thớt cho rằng mảng là cái linh động hơn PivotTable. Bạn nói về sự linh hoạt cho nên trật ý chủ thớt.

(thật sự tôi cũng không chắc chủ thớt hiểu "mảng" là cái gì không nữa. Chưa kể đến việc mảng nó "linh động" ở chỗ nào. Hình như đối với chủ thớt cái nào trông vào hành tráng khó hiểu thì là linh động)
 
Upvote 0
Nếu nói NGHIÊN CỨU thì ok, chứ PivotTable mà nói không linh hoạt thì còn thằng nào linh hoạt hơn nữa?
Để ra được cái dữ liệu như trong File, nó còn kết hợp với 3 Sheet nữa ạ, và nó bị kết hợp cả công thức nữa. E chưa vận dụng được hết VBA nên vẫn pải kết hợp vừa VBA, vừa công thức. Và với ví dụ trong file, là sẽ dựa vào đó để vận dụng vào bảng tính hoàn chỉnh. Nên e cảm thấy Pivot trong trường hợp này, chưa thực sự là cần thiết thầy ạ.

Chủ thớt cho rằng mảng là cái linh động hơn PivotTable. Bạn nói về sự linh hoạt cho nên trật ý chủ thớt.

(thật sự tôi cũng không chắc chủ thớt hiểu "mảng" là cái gì không nữa. Chưa kể đến việc mảng nó "linh động" ở chỗ nào. Hình như đối với chủ thớt cái nào trông vào hành tráng khó hiểu thì là linh động)
- E đang tìm hiểu về mảng, e mún 1 nút bấm là nó ra cái e mún, trước tiên là đơn giản vậy ạ. Sau đó mới hoành tráng đc ạ
- Mục đích sử dụng của e ở đây là loại bỏ dần công thức, để bảng tính nhẹ và chạy nhanh hơn ạ. Cái nào có thể thay thế được bằng VBA mà k làm ảnh hưởng đến sự tính toán, cũng như kết quả cuối cùng là sẽ kết hợp để vận dụng ngay.
 
Upvote 0
- E đang tìm hiểu về mảng, e mún 1 nút bấm là nó ra cái e mún, trước tiên là đơn giản vậy ạ. Sau đó mới hoành tráng đc ạ
- Mục đích sử dụng của e ở đây là loại bỏ dần công thức, để bảng tính nhẹ và chạy nhanh hơn ạ. Cái nào có thể thay thế được bằng VBA mà k làm ảnh hưởng đến sự tính toán, cũng như kết quả cuối cùng là sẽ kết hợp để vận dụng ngay.

Bạn muốn làm gì thì cũng là chuyện của bạn. Và các thành viên "chuyên về mảng" có giúp được cũng là chuyện của họ.

Tôi chỉ xen vào để cảnh báo cho các thành viên khác đang muốn học về VBA rằng:
- So sánh giữa VBA và các công cụ hổ trợ như PivotTable, PowerPivot, ... thì VBA chưa hẳn đã linh hoạt hơn. Thời gian để viết ba cái code hoành tráng này nọ đem dùng để thiết kế lại bảng tính có thể tiện ích hơn.
- Mảng không hẳn đã linh động. Vì trong VBA có công cụ chuyển range vào mảng và ngược lại cho nên nhiều người thích dùng nó để tăng tốc. Tham chiếu vào mảng là trưc tiếp vào vùng nhớ liên tục trong máy cho nên nhanh hơn tham chiếu vào cell/range là gián tiếp vào các objects trong bảng tính. Điểm chính là vậy thôi.
- Muốn thực sự đạt đến sự "linh động" trong các cấu trúc dữ liệu (mảng, collection, dictionary,...) cần phảin học sâu lắm. Không đi đường tắt như bạn làm đâu.
(người rất giỏi có thể đi đường tắt, nhưng người rất giỏi cũng biét cách áp dụng công cụ rất hiệu nghiệm, không đem xe tăng kéo cày)
 
Upvote 0
Bạn muốn làm gì thì cũng là chuyện của bạn. Và các thành viên "chuyên về mảng" có giúp được cũng là chuyện của họ.

Tôi chỉ xen vào để cảnh báo cho các thành viên khác đang muốn học về VBA rằng:
- So sánh giữa VBA và các công cụ hổ trợ như PivotTable, PowerPivot, ... thì VBA chưa hẳn đã linh hoạt hơn. Thời gian để viết ba cái code hoành tráng này nọ đem dùng để thiết kế lại bảng tính có thể tiện ích hơn.
- Mảng không hẳn đã linh động. Vì trong VBA có công cụ chuyển range vào mảng và ngược lại cho nên nhiều người thích dùng nó để tăng tốc. Tham chiếu vào mảng là trưc tiếp vào vùng nhớ liên tục trong máy cho nên nhanh hơn tham chiếu vào cell/range là gián tiếp vào các objects trong bảng tính. Điểm chính là vậy thôi.
- Muốn thực sự đạt đến sự "linh động" trong các cấu trúc dữ liệu (mảng, collection, dictionary,...) cần phảin học sâu lắm. Không đi đường tắt như bạn làm đâu.
(người rất giỏi có thể đi đường tắt, nhưng người rất giỏi cũng biét cách áp dụng công cụ rất hiệu nghiệm, không đem xe tăng kéo cày)

Kiến thức của em còn phải học hỏi nhiều mà, bây giờ mới bắt đầu biết đến VBA mà thôi. Cảm ơn những lời chia sẽ của a. Chúc a và mọi người buổi tối vui vẻ :)
 
Upvote 0
Để ra được cái dữ liệu như trong File, nó còn kết hợp với 3 Sheet nữa ạ, và nó bị kết hợp cả công thức nữa. E chưa vận dụng được hết VBA nên vẫn pải kết hợp vừa VBA, vừa công thức. Và với ví dụ trong file, là sẽ dựa vào đó để vận dụng vào bảng tính hoàn chỉnh. Nên e cảm thấy Pivot trong trường hợp này, chưa thực sự là cần thiết thầy ạ.

Kinh nghiệm của tôi: Nếu có rắc rối trong việc xừ lý kết quả thì điều đầu tiên tôi nghĩ tới phải là TA NÊN THIẾT KẾ LẠI CÁCH BỐ TRÍ CỦA DỮ LIỆU NHẬP chứ không phải cố làm bằng mọi cách để có được kết quả
Nên nhờ rằng cơ sở dữ liệu chiếm đến hơn 50% sự thành công của kết quả (nếu không nói là 80 hay 90%). Thiết kế cơ sở dữ liệu thông minh tuy có cực lần đầu nhưng bạn sẽ dùng nó mãi mãi (Đây là cách ít hao tốn tài nguyên nhất)
Tôi không biết "văn chương" nên sợ càng nói sẽ càng dài dòng. Chỉ là nêu quan điểm cá nhân, biết đâu có ai đó nghe và.. đồng cảm
 
Upvote 0
Web KT

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

Back
Top Bottom