Nhờ Anh Chị và các Bạn giúp Em viết thêm code gián giá trị danh sách mặt hàng (1 người xem)

Liên hệ QC

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

ndhmoney686

Thành viên thường trực
Tham gia
25/4/12
Bài viết
376
Được thích
104
Hiện tại Em đang sử dụng code hàm tự tạo siêu tầm trên GPE. Để lọc ra một danh sách duy nhất.

Nếu dùng hàm counta đếm vùng danh sách duy nhất đó từ A13:A29 thì nó cho kết quả 17 (cứ có công thức là nó đếm). Em muốn kết quả nó đếm là những mặt hàng thực có trong danh sách là 6 (ví dụ cột C).

Anh chị và các Bạn có thể giúp Em code vào cột C để cho kết quả như mong đợi và test thử Counta C13:C29 nó sẽ là 6

Mong Anh chị và các bạn giúp đỡ. Cám ơn Anh chị và các bạn nhiều!


p/s: Mục đích của em xử lý vấn đề trên để name động chọn vùng dữ liệu đc chính xác.
 

File đính kèm

nhìn code là biết của vị anh hùng nào rồi
bạn đếm thì dùng hàm =COUNTIF(A13:A29,"<>0") đi
Nhưng tại sao bạn không dùng chức năng Remove Duplicate của Excel ?
 
Upvote 0
nhìn code là biết của vị anh hùng nào rồi
bạn đếm thì dùng hàm =COUNTIF(A13:A29,"<>0") đi
Nhưng tại sao bạn không dùng chức năng Remove Duplicate của Excel ?

Cám ơn bạn doveandrose! Mình muốn vùng dữ liệu nó tự động thay đổi. Nên muốn dùng code cho nó tự động thay đổi dữ liệu.
Và thực tế nó phục vụ cho một bài biểu đồ sử dụng name động như file và hình mình minh họa chi tiết dưới đây.
 

File đính kèm

  • name2.jpg
    name2.jpg
    42.2 KB · Đọc: 8
  • name1.jpg
    name1.jpg
    35.5 KB · Đọc: 7
  • Chart_GPE.xls
    Chart_GPE.xls
    125 KB · Đọc: 5
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bạn doveandrose! Mình muốn vùng dữ liệu nó tự động thay đổi. Nên muốn dùng code cho nó tự động thay đổi dữ liệu.
Và thực tế nó phục vụ cho một bài biểu đồ sử dụng name động như file và hình mình minh họa chi tiết dưới đây.
Cái name động đó bạn có thể thay công thức thành thế này, nếu vẫn muốn sử dụng cái code lọc duy nhất kia :

=OFFSET(Chart!$A$2,,,SUMPRODUCT((LEN(Chart!$A$2:$A$991)>2)*1),1)

Thực ra dữ liệu cũng ít, nếu xài công thức để lọc duy nhất cũng không có gì kinh khủng lắm người đẹp doveandrose nhỉ ? :3
 
Upvote 0
Cái name động đó bạn có thể thay công thức thành thế này, nếu vẫn muốn sử dụng cái code lọc duy nhất kia :

=OFFSET(Chart!$A$2,,,SUMPRODUCT((LEN(Chart!$A$2:$A$991)>2)*1),1)

Thực ra dữ liệu cũng ít, nếu xài công thức để lọc duy nhất cũng không có gì kinh khủng lắm người đẹp doveandrose nhỉ ? :3

Cám ơn bạn hoamattroicoi ! Ok bạn ah.
Mình thấy trong hàm OFFSET phần Height bạn sử dụng hạm Sumproduct hay thật, mình cũng hay sử dụng nhưng nó đơn giản hơn (có phải là len để tính những dòng có ký tự > 2 thì tính là 1 rồi tổng lên. Phải ko bạn?)
 
Upvote 0
Cám ơn bạn hoamattroicoi ! Ok bạn ah.
Mình thấy trong hàm OFFSET phần Height bạn sử dụng hạm Sumproduct hay thật, mình cũng hay sử dụng nhưng nó đơn giản hơn (có phải là len để tính những dòng có ký tự > 2 thì tính là 1 rồi tổng lên. Phải ko bạn?)

Chuẩn rồi đó bạn. Bạn có thể dùng cái đó để giới hạn Height của OFFSET.

Chúc cuối tuần vui vẻ và khám phá được nhiều điều hay của Excel nhé :)
 
Upvote 0
Chuẩn rồi đó bạn. Bạn có thể dùng cái đó để giới hạn Height của OFFSET.

Chúc cuối tuần vui vẻ và khám phá được nhiều điều hay của Excel nhé :)

Cám ơn hoamattroicoi nhiều nhé! Excel hay thật, nhiều lúc bế tắc tưởng hết cờ. Nhưng đưa lên GPE là thế cờ bị phá ngay tức thì bởi các cao thủ võ lâm. Cám ơn GPE rất nhiều, chúc GPE ngày càng lớn mạnh, chúc cả nhà cuối tuần có nhiều niềm vui!
 
Upvote 0
Trong quá trình làm. Còn một vấn đề là sau khi lọc số ngày ko theo thứ tự tăng dần.
Em nhờ Anh Chị xem giúp Em có thể chỉnh sửa code để cho nó sắp xếp được ngày theo thứ tự tăng dần. Code này em siêu tầm của Anh Siwtom, cám ơn Anh!

Function UniqueArray(ParamArray Source()) As Variant Dim SourceItem, SubItem, tmpArr
Dim Dict As Object, N As Long, tmp, tmp2 As String
Set Dict = CreateObject("Scripting.Dictionary")
ReDim tmpArr(1 To 65536, 1 To 1)
For Each SourceItem In Source
tmp = SourceItem
If Not IsArray(tmp) Then tmp = Array(tmp)
For Each SubItem In tmp
tmp2 = CStr(SubItem)
If Len(tmp2) Then
If Not Dict.Exists(tmp2) Then
N = N + 1
Dict.Add tmp2, ""
tmpArr(N, 1) = SubItem
End If
End If
Next
Next
If N Then UniqueArray = tmpArr
Set Dict = Nothing
End Function
 

File đính kèm

  • TH1.jpg
    TH1.jpg
    119.4 KB · Đọc: 4
  • Code tu tao.xls
    Code tu tao.xls
    132.5 KB · Đọc: 8
  • TH2.jpg
    TH2.jpg
    37.6 KB · Đọc: 3
Lần chỉnh sửa cuối:
Upvote 0
Trong quá trình làm. Còn một vấn đề là sau khi lọc số ngày ko theo thứ tự tăng dần.
Em nhờ Anh Chị xem giúp Em có thể chỉnh sửa code để cho nó sắp xếp được ngày theo thứ tự tăng dần. Code này em siêu tầm của Anh Siwtom, cám ơn Anh!

Dữ liệu chỉ dùng để vẽ biểu đồ, nếu bạn muốn làm công thức thì tôi làm cho, còn cái vụ sort luôn trong hàm tự tạo thì tôi chưa nghĩ ra, vẫn là 1 thách thức đối với tôi. Chắc phải chờ các cao thủ như hkphuong, giangleloi và doveandrose thôi..... hehehe
 
Upvote 0
Cám ơn các Anh Chị. Sub để sự kiện change cũng được ạ. Các Anh Chị giúp em với nhé.
 
Upvote 0
Vậy khỏi xài Function với sumif nhé. Xài sự kiện Kích hoạt sheet Chart thì code chạy.
Bạn paste code sau vào sheet Chart
Mã:
Private Sub Worksheet_Activate()
Dim sArr(), I&, J&, Dic As Object, dArr, K&, Tmp
With Sheet1
    sArr = .Range(.[A2], .[A65000].End(3)).Resize(, 2).Value
End With
ReDim dArr(1 To UBound(sArr), 1 To UBound(sArr, 2))
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
    For I = 1 To UBound(sArr, 1)
        Tmp = sArr(I, 1)
        If Not .Exists(Tmp) Then
            K = K + 1
            .Add Tmp, K
            For J = 1 To UBound(sArr, 2)
                dArr(K, J) = sArr(I, J)
            Next J
        Else
            dArr(.Item(Tmp), 2) = dArr(.Item(Tmp), 2) + sArr(I, 2)
        End If
    Next I
End With
        Range("A2:B65000").ClearContents
    If K Then
        Range("A2").Resize(K, 2).Value = dArr
        Range("A2").Resize(K, 2).Sort [A2], xlAscending
    End If
Set Dic = Nothing
End Sub


Cám ơn bạn hpkhuong! Bạn ơi mình cho code vào sheet chart nhưng ko thấy nó thay đổi dữ liệu. Bạn xem giúp mình với nhé.
 

File đính kèm

Upvote 0
Vụ chi mà nhắc tới 3 vị anh hùng "bàn phím" của GPE đây ta? Vụ sort mảng này nhớ bữa hoamattroi có làm ở topic kìa rồi mà......Còn nhớ hok nhỉ? Áp dụng cho bạn ấy ở bài này đi... Mà bữa là làm trong Sub. Còn vụ Function này thì hok biết có được không thì chưa biết...Hoamattroi giúp người ta đi............... Mà sao không hướng bạn ấy sang chạy cái SUB cho khỏe, xài Function chi cực vậy...Lọc duy nhất có nhiều cách mà....
Ấy chết, tại hạ làm sao dám mạo phạm đến các "tà sư sô" :D. Vụ sort mảng đó thì tại hạ nhớ, chạy sub ra kết quả rồi sort mảng cơ mà ý của bạn ấy là muốn chơi cái UDF kia có kết quả mà kết quả đó SORT luôn cơ, dã man lắm ý :D :D :D.
Còn vụ Function này thì hok biết có được không thì chưa biết...Hoamattroi giúp người ta đi............... Mà sao không hướng bạn ấy sang chạy cái SUB cho khỏe, xài Function chi cực vậy...Lọc duy nhất có nhiều cách mà....
Tại dữ liệu của bạn ấy cũng không nhiều, chỉ dùng để vẽ biểu đồ nên mới hướng bạn ấy dùng Function có sẵn của Excel lọc và Sort luôn giá trị như bạn ấy mong muốn. Hỏng có cực vài chục dòng thì cực chi, nếu muốn xài công thức thì copy công thức này vào A2 thôi khuyến mại 100 dòng luôn :D

PHP:
=IFERROR(SMALL(IF((COUNTIF($A$1:A1,Data!$A$2:$A$100)=0)*(Data!$A$2:$A$100<>""),Data!$A$2:$A$100,""),1),"")

Kết thúc bằng Ctrl+Shift+Enter
 

File đính kèm

Upvote 0
Đã nói là sự kiện kích hoạt sheet Chart rồi cơ mà.
Bạn lick chuột qua sheet Data, rồi lick lại sheet Chart thì nó sẽ chạy mà... đã gọi là Activate cơ mà...--=0--=0--=0


Mình dán code vào sheet "chart". Rồi sau đó nhập thử dữ liệu vào sheet "Data". Rồi bấm sang sheet "chart thì nó báo lỗi. Bạn check giúp mình nhé.
 

File đính kèm

  • a1.jpg
    a1.jpg
    11.9 KB · Đọc: 5
  • a2.jpg
    a2.jpg
    21.7 KB · Đọc: 4
  • Code tu tao (2).xls
    Code tu tao (2).xls
    125.5 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0
Mình dán code vào sheet "chart". Rồi sau đó nhập thử dữ liệu vào sheet "Data". Rồi bấm sang sheet "chart thì nó báo lỗi. Bạn check giúp mình nhé.
Bạn đổi thay đổi code chỗ này của người ấy : Range("A2").Resize(K, 2).Sort [A2], xlAscending

Thành : Range("A2").Resize(K, 2).Sort Range("A2"), xlAscending
 
Upvote 0
Ấy chết, tại hạ làm sao dám mạo phạm đến các "tà sư sô" :D. Vụ sort mảng đó thì tại hạ nhớ, chạy sub ra kết quả rồi sort mảng cơ mà ý của bạn ấy là muốn chơi cái UDF kia có kết quả mà kết quả đó SORT luôn cơ, dã man lắm ý :D :D :D.

Tại dữ liệu của bạn ấy cũng không nhiều, chỉ dùng để vẽ biểu đồ nên mới hướng bạn ấy dùng Function có sẵn của Excel lọc và Sort luôn giá trị như bạn ấy mong muốn. Hỏng có cực vài chục dòng thì cực chi, nếu muốn xài công thức thì copy công thức này vào A2 thôi khuyến mại 100 dòng luôn :D

PHP:
=IFERROR(SMALL(IF((COUNTIF($A$1:A1,Data!$A$2:$A$100)=0)*(Data!$A$2:$A$100<>""),Data!$A$2:$A$100,""),1),"")

Kết thúc bằng Ctrl+Shift+Enter

Mình ngồi chạy thử dữ liệu với công thức của bác Hoamattroi, kết quả thu được rất đúng.
Đúng như bạn nói. Nếu dữ liệu ít thì rất ok. Dữ liệu với 2.000 dòng thì nó chạy khá ì ạch. Có cách nào để cải thiện được tốc độ chạy nhanh lên không nhỉ?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn đổi thay đổi code chỗ này của người ấy : Range("A2").Resize(K, 2).Sort [A2], xlAscending

Thành : Range("A2").Resize(K, 2).Sort Range("A2"), xlAscending


Mình thay thành Range("A2").Resize(K, 2).Sort Range("A2"), xlAscending rồi nhưng vẫn báo lỗi. Các bạn xem giúp mình nhé.
 

File đính kèm

Upvote 0
Mình ngồi chạy thử dữ liệu với công thức của bác Hoamattroi, kết quả thu được rất đúng.
Đúng như bạn nói. Nếu dữ liệu ít thì rất ok. Dữ liệu với 2.000 dòng thì nó chạy khá ì ạch. Có cách nào để cải thiện được tốc độ chạy nhanh lên không nhỉ?
Ô mô, mình đã nói ở trên mà, công thức chỉ dùng trong trường hợp dữ liệu của bạn ít, còn 2000 dòng thì thua, nó ì ạch là đúng roài. 2000 dòng bạn xài code của người đẹp hpkhuong đi. Chắc phải copy rồi sửa code cho bạn ngon lành úp file lên mới chịu phải honk, kekekeke :D :D :D :D. File đây ạ :D :D :D
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ô mô, mình đã nói ở trên mà, công thức chỉ dùng trong trường hợp dữ liệu của bạn ít, còn 2000 dòng thì thua, nó ì ạch là đúng roài. 2000 dòng bạn xài code của người đẹp hpkhuong đi. Chắc phải copy rồi sửa code cho bạn ngon lành úp file lên mới chịu phải honk, kekekeke :D :D :D :D. File đây ạ :D :D :D


Cám ơn các bạn! chớp mắt phát kết quả có ngay. Thật tuyệt vời.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom