Mong các thầy ,cô giúp đỡ(hàm counif trong vba) (1 người xem)

Liên hệ QC

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

nguyenvanlinhab

Thành viên mới
Tham gia
27/2/22
Bài viết
40
Được thích
0
Em mới học Excel phần vba nên chưa có kinh nghiệm mong các thầy, cô chỉ giúp cách điền công thức counif ứng dụng
cho viêc lọc trùng với số lượng dữ liệu dòng cuối có thay đổi mà công thức vẫn tự đồng điền ạ(Ứng dụng phần mảng càng tốt ạ tại dữ liệu của em nó lớn ạ)
 

File đính kèm

Em mới học Excel phần vba nên chưa có kinh nghiệm mong các thầy, cô chỉ giúp cách điền công thức counif ứng dụng
cho viêc lọc trùng với số lượng dữ liệu dòng cuối có thay đổi mà công thức vẫn tự đồng điền ạ(Ứng dụng phần mảng càng tốt ạ tại dữ liệu của em nó lớn ạ)
Bạn thử xem file
Nhấn nút chạy Code và xem điều gì diễn ra ở P2.
Thêm bớt dữ liệu và chạy thử.
 

File đính kèm

Upvote 0
Bạn thử xem file
Nhấn nút chạy Code và xem điều gì diễn ra ở P2.
Thêm bớt dữ liệu v

Bạn thử xem file
Nhấn nút chạy Code và xem điều gì diễn ra ở P2.
Thêm bớt dữ liệu và chạy thử.
Cảm ơn thầy .Đúng ý em rồi thầy có thể viết thêm sự kiện trong sheet khi thay đổi giá trị mã sản phẩm được không ạ
 
Upvote 0
@HUONGHCKT Thầy ơi sau khi học code của thầy em còn thắc mắc. Giả sử data của em có thêm 3 mã sản phẩm mới nữa thì vùng (key )nó có lọc mã không trùng được không ạ
 

File đính kèm

Upvote 0
Cảm ơn thầy .Đúng ý em rồi thầy có thể viết thêm sự kiện trong sheet khi thay đổi giá trị mã sản phẩm được không ạ
Có thể được.
@HUONGHCKT Thầy ơi sau khi học code của thầy em còn thắc mắc. Giả sử data của em có thêm 3 mã sản phẩm mới nữa thì vùng (key )nó có lọc mã không trùng được không ạ
Bạn cứ thêm vào và chạy thử là biết ngay mà.
 
Upvote 0
Có thể được.

Bạn cứ thêm vào và chạy thử là biết ngay mà.
Em có sửa lại dữ liệu để ứng dụng code của thầy mà em vẫn chưa hiểu các biến tăng item ,với key nó hoạt động như thế nào mong thầy giúp đỡ
 

File đính kèm

Upvote 0
Em có tìm hiểu qua nhiều bài trên GPE rồi mà không tư duy ra được mong anh chỉ giáo
Chỉ cây giáo thì được gì?
Muốn học thì nhờ người ta "dẫn dắt".

Mà code có sẵn, chỉ tự chế ra dữ liệu và chạy thử cũng không biết làm thì học chi nữa.
Có thể được.

Bạn cứ thêm vào và chạy thử là biết ngay mà.
 
Upvote 0
Em có tìm hiểu qua nhiều bài trên GPE rồi mà không tư duy ra được mong anh chỉ giáo
Bạn chịu khó tìm loạt bài về VBA cơ bản của anh befaint trong diễn đàn rồi đọc, thực hành, thực hành và thực hành, từng bước rồi bạn sẽ hiểu.
 
Upvote 0
Em có sửa lại dữ liệu để ứng dụng code của thầy mà em vẫn chưa hiểu các biến tăng item ,với key nó hoạt động như thế nào mong thầy giúp đỡ
Có nghĩa là bây giờ bạn muốn Đếm số ItemID (cột F) phải không?
Nôm na thế này nhé:
Sử dụng Dictionary là để lọc ra các phần tử (ItemID): Tạm hiểu là Dic giống như 1 giá sách: Mỗi Sách đều có 1 ID (key) trong đó có tập 1 tập 2 đều có chung ID(key) và như thế: mỗi loại sách đều được sắp ở 1 vị trí nhất định (kể cả tập 1, tập 2, ...)
Dòng Key = Arr(i, số cột định chọn làm key) -Trong bài của bạn là cột F (cột 6).
Dòng Not Dic.Exists(key) then : được hiểu là nếu đã tồn tại trong Dic chưa (đã có trên giá chưa) nếu chưa thì
Dòng t=t+1 là xác định vị trí sắp cho loại ID (key) đó theo thứ tự (1,2), dòng Dic.add(key), t: là nhập vào giá sách và ấn định vị trí của ID(key) của loại đó.
Và như trong bài: KQ(t,1) =Key : là xếp vào giá sách (theo mảng)
KQ(t,2) =1 là ghi lại số lượng sách:
Nếu (else) lại gặp sách đã có trến giá(trong Dic.Add) thì tiếp tục xếp sách vào giá tại vị trí mà sách ấy đang giữ chỗ: Dic.Item(key)=số thứ tự của Key trong Dic = k . và lúc này số lượng của loại sách ID( key) trên giá sẽ = Số đã có = thêm 1 sách mới được tìm thấy.
Cũng như anh @Hoàng Tuấn 868 đã nói bạn phải tìm hiểu thêm nhiều nữa. Trên GPE này mình thấy có chùm bài viết Tổng quan về Arr và Dictionary (của Anh @befaint thì phải), bạn nên sarch và tìm hiểu thêm nhé.
Chúc Thành công.
 
Upvote 0
Có nghĩa là bây giờ bạn muốn Đếm số ItemID (cột F) phải không?
Nôm na thế này nhé:
Sử dụng Dictionary là để lọc ra các phần tử (ItemID): Tạm hiểu là Dic giống như 1 giá sách: Mỗi Sách đều có 1 ID (key) trong đó có tập 1 tập 2 đều có chung ID(key) và như thế: mỗi loại sách đều được sắp ở 1 vị trí nhất định (kể cả tập 1, tập 2, ...)
Dòng Key = Arr(i, số cột định chọn làm key) -Trong bài của bạn là cột F (cột 6).
Dòng Not Dic.Exists(key) then : được hiểu là nếu đã tồn tại trong Dic chưa (đã có trên giá chưa) nếu chưa thì
Dòng t=t+1 là xác định vị trí sắp cho loại ID (key) đó theo thứ tự (1,2), dòng Dic.add(key), t: là nhập vào giá sách và ấn định vị trí của ID(key) của loại đó.
Và như trong bài: KQ(t,1) =Key : là xếp vào giá sách (theo mảng)
KQ(t,2) =1 là ghi lại số lượng sách:
Nếu (else) lại gặp sách đã có trến giá(trong Dic.Add) thì tiếp tục xếp sách vào giá tại vị trí mà sách ấy đang giữ chỗ: Dic.Item(key)=số thứ tự của Key trong Dic = k . và lúc này số lượng của loại sách ID( key) trên giá sẽ = Số đã có = thêm 1 sách mới được tìm thấy.
Cũng như anh @Hoàng Tuấn 868 đã nói bạn phải tìm hiểu thêm nhiều nữa. Trên GPE này mình thấy có chùm bài viết Tổng quan về Arr và Dictionary (của Anh @befaint thì phải), bạn nên sarch và tìm hiểu thêm nhé.
Chúc Thành công.
Cảm ơn thầy và anh @Hoàng Tuấn 868 đã giúp đỡ
 
Upvote 0

File đính kèm

Upvote 0
Đó là file em tự học theo file của anh đính kèm của thầy @befaint .Đây là file dữ liệu của em mong anh xem giúp em, em muốn lọc mã sản phẩm theo vi trí và vị trí đó nếu tồn tại thì cộng dồn lại
Chắc là thế này chăng???
Mã:
Sub DEM()
Dim i&, t&, k&, Lr&
Dim Arr(), KQ()
Dim Sh As Worksheet
Dim Dic As Object, Key

Set Sh = Sheets("Sheet1")
Lr = Sh.Cells(Rows.Count, 1).End(3).Row
Arr = Sh.Range("A2:G" & Lr).Value
Set Dic = CreateObject("Scripting.Dictionary")
ReDim KQ(1 To UBound(Arr), 1 To 3)

For i = 1 To UBound(Arr)
    Key = Arr(i, 6)
    If Not Dic.Exists(Key) Then
        t = t + 1: Dic.Add (Key), t
        KQ(t, 1) = Key
        KQ(t, 2) = Arr(i, 4)
        KQ(t, 3) = Arr(i, 7)
    Else
        k = Dic.Item(Key)
        KQ(k, 3) = KQ(k, 3) + Arr(i, 7)
    End If
Next i

If t Then
    Sh.Range("P2").Resize(10000, 3).ClearContents
    Sh.Range("P2").Resize(t, 3) = KQ
End If
Set Dic = Nothing
MsgBox "OK", vbInformation, "THÔNG BÁO"
End Sub
 
Upvote 0
Chắc là thế này chăng???
Mã:
Sub DEM()
Dim i&, t&, k&, Lr&
Dim Arr(), KQ()
Dim Sh As Worksheet
Dim Dic As Object, Key

Set Sh = Sheets("Sheet1")
Lr = Sh.Cells(Rows.Count, 1).End(3).Row
Arr = Sh.Range("A2:G" & Lr).Value
Set Dic = CreateObject("Scripting.Dictionary")
ReDim KQ(1 To UBound(Arr), 1 To 3)

For i = 1 To UBound(Arr)
    Key = Arr(i, 6)
    If Not Dic.Exists(Key) Then
        t = t + 1: Dic.Add (Key), t
        KQ(t, 1) = Key
        KQ(t, 2) = Arr(i, 4)
        KQ(t, 3) = Arr(i, 7)
    Else
        k = Dic.Item(Key)
        KQ(k, 3) = KQ(k, 3) + Arr(i, 7)
    End If
Next i

If t Then
    Sh.Range("P2").Resize(10000, 3).ClearContents
    Sh.Range("P2").Resize(t, 3) = KQ
End If
Set Dic = Nothing
MsgBox "OK", vbInformation, "THÔNG BÁO"
End Sub
Sau khi xem chỗ sai và sửa lại em phát hiện các key có cái vẫn không lọc được trùng nhờ anh xem lại giúp em ạ
 

File đính kèm

Upvote 0
Em sửa lại cú pháp "J" thành j mà anh nói nhưng khi kiểm tra code thì phát hiện "mít" vần không lọc trùng
được trong khi các quả cam,xoài,táo đã ra kết quả và số lượng đúng
Dữ liệu của bạn không chuẩn. Có cách trước cách sau. nên nó mới vậy
Muốn khắc phục lỗi này thì sửa code như sau
Mã:
Option Explicit

Sub xem()
Dim sh As Worksheet
Dim i As Long, j As Long, k As Long
Dim lr As Long
Dim dic As Object
Dim arr(), kq(), key
    On Error Resume Next
   Set dic = CreateObject("Scripting.Dictionary")
    Set sh = Sheets("sheet1")
    lr = sh.Range("A" & Rows.Count).End(xlUp).Row
    arr = sh.Range("A1:B" & lr).Value
    ReDim kq(1 To UBound(arr, 1), 1 To 3)
     j = 0
     For i = 1 To UBound(arr, 1)
        key = Trim(arr(i, 1))
        If Not dic.Exists(key) Then
            j = j + 1
           dic.Add key, j
            kq(j, 1) = j
            kq(j, 2) = arr(i, 1)
            kq(j, 3) = arr(i, 2)
        Else
            k = dic.Item(key)
            kq(k, 3) = kq(k, 3) + arr(i, 2)

            
        
        End If
        
     Next i
     sh.Range("D2").Resize(10000, j).ClearContents
     sh.Range("D2").Resize(j, 3).Value = kq



End Sub
 
Upvote 0
Dữ liệu của bạn không chuẩn. Có cách trước cách sau. nên nó mới vậy
Muốn khắc phục lỗi này thì sửa code như sau
Mã:
Option Explicit

Sub xem()
Dim sh As Worksheet
Dim i As Long, j As Long, k As Long
Dim lr As Long
Dim dic As Object
Dim arr(), kq(), key
    On Error Resume Next
   Set dic = CreateObject("Scripting.Dictionary")
    Set sh = Sheets("sheet1")
    lr = sh.Range("A" & Rows.Count).End(xlUp).Row
    arr = sh.Range("A1:B" & lr).Value
    ReDim kq(1 To UBound(arr, 1), 1 To 3)
     j = 0
     For i = 1 To UBound(arr, 1)
        key = Trim(arr(i, 1))
        If Not dic.Exists(key) Then
            j = j + 1
           dic.Add key, j
            kq(j, 1) = j
            kq(j, 2) = arr(i, 1)
            kq(j, 3) = arr(i, 2)
        Else
            k = dic.Item(key)
            kq(k, 3) = kq(k, 3) + arr(i, 2)

         
     
        End If
     
     Next i
     sh.Range("D2").Resize(10000, j).ClearContents
     sh.Range("D2").Resize(j, 3).Value = kq



End Sub

Dữ liệu của bạn không chuẩn. Có cách trước cách sau. nên nó mới vậy
Muốn khắc phục lỗi này thì sửa code như sau
Mã:
Option Explicit

Sub xem()
Dim sh As Worksheet
Dim i As Long, j As Long, k As Long
Dim lr As Long
Dim dic As Object
Dim arr(), kq(), key
    On Error Resume Next
   Set dic = CreateObject("Scripting.Dictionary")
    Set sh = Sheets("sheet1")
    lr = sh.Range("A" & Rows.Count).End(xlUp).Row
    arr = sh.Range("A1:B" & lr).Value
    ReDim kq(1 To UBound(arr, 1), 1 To 3)
     j = 0
     For i = 1 To UBound(arr, 1)
        key = Trim(arr(i, 1))
        If Not dic.Exists(key) Then
            j = j + 1
           dic.Add key, j
            kq(j, 1) = j
            kq(j, 2) = arr(i, 1)
            kq(j, 3) = arr(i, 2)
        Else
            k = dic.Item(key)
            kq(k, 3) = kq(k, 3) + arr(i, 2)

          
      
        End If
      
     Next i
     sh.Range("D2").Resize(10000, j).ClearContents
     sh.Range("D2").Resize(j, 3).Value = kq



End Sub
Em cảm ơn anh , em áp dụng vào file này thì làm như thế nào ạ có phải dùng vòng lặp qua cột để nó đếm số lượng không ạ
 

File đính kèm

Upvote 0
Kết quả em để ờ file định kèm ạ.Em muốn anh xem giúp em muốn lọc trùng mã sản phẩm theo ví trí,nếu vị trí đó tồn tại thì đếm vị trí đó tổng có bao nhiêu
Thử code sau.
Mã:
Sub DEM()
Dim i&, t&, k&, Lr&
Dim Arr(), KQ()
Dim Sh As Worksheet
Dim Dic As Object, Key

Set Sh = Sheets("Sheet1")
Lr = Sh.Cells(Rows.Count, 1).End(3).Row
Arr = Sh.Range("A2:G" & Lr).Value
Set Dic = CreateObject("Scripting.Dictionary")
ReDim KQ(1 To UBound(Arr), 1 To 3)

For i = 1 To UBound(Arr)
    Key = Arr(i, 6)
    If Not Dic.Exists(Key) Then
        t = t + 1: Dic.Add (Key), t
        KQ(t, 1) = Key
        KQ(t, 2) = Arr(i, 4)
        KQ(t, 3) = 1
    Else
        k = Dic.Item(Key)
        KQ(k, 3) = KQ(k, 3) + 1
    End If
Next i

If t Then
    Sh.Range("P2").Resize(10000, 3).ClearContents
    Sh.Range("P2").Resize(t, 3) = KQ
End If
Set Dic = Nothing
MsgBox "OK", vbInformation, "THÔNG BÁO"
End Sub
 
Upvote 0
Hình như bạn ấy đưa em đi 1 vòng rồi lại quay về cái code ban đầu thì phải
Em muốn hỏi là key chính của em là mã sản phẩm,em muốn add thêm key nữa là vị trí .nếu key mã sản phẩm đã tồn tại thì không lấy. key vị trí đã tồn tại thì cộng dồn ra số lượng ạ
 
Upvote 0
Hình như bạn ấy đưa em đi 1 vòng rồi lại quay về cái code ban đầu thì phải
Mình thấy thời gian đưa ra câu hỏi rất nhanh, bình thường thì nên nghiên cứu kỹ, dò từng dòng code xem cách vận hành, từ đó suy ra nhiều thứ, đằng này nhoằng cái hỏi luôn, vụ này còn nhiều vòng đây.
 
Upvote 0
Mình thấy thời gian đưa ra câu hỏi rất nhanh, bình thường thì nên nghiên cứu kỹ, dò từng dòng code xem cách vận hành, từ đó suy ra nhiều thứ, đằng này nhoằng cái hỏi luôn, vụ này còn nhiều vòng đây.
Chắc em trả lại code ban đầu cho bạn ấy. nhờ tác giả code ban đầu vào sửa cho bạn ấy thôi
 
Upvote 0

File đính kèm

Upvote 0
Em có xem rồi ạ nhưng không tìm ra hướng giải quyết . Mong các anh,chị tìm hướng giúp em ạ
Có gì mà hướng với không hướng. Bạn muốn trích lọc theo itemcode và rack no hay cái gì. Thì nói rõ ràng 1 chút. chứ mã sản phẩm nào.? Mã sản phẩm ở đâu?
 
Upvote 0
Em có xem rồi ạ nhưng không tìm ra hướng giải quyết . Mong các anh,chị tìm hướng giúp em ạ .Em không hiểu sao cột vị mã sản phẩm nó không lọc trùng
Bạn mới xem được vài hôm thì chưa ăn thua, cái này nó cần thời gian và lộ trình nhiều hơn bạn nghĩ.
 
Upvote 0
Bạn mới xem được vài hôm thì chưa ăn thua, cái này nó cần thời gian và lộ trình nhiều hơn bạn nghĩ.

Bạn mới xem được vài hôm thì chưa ăn thua, cái này nó cần thời gian và lộ trình nhiều hơn bạn nghĩ.
Em không thấy tài liệu nào nó lọc trùng cả 2 ô ạ .Vậy em có thể sử dụng phương pháp gì để dictionary lọc cả hai cột mã sản phẩm và vị trí ạ.Em cảm ơn
 
Upvote 0
Em có xem rồi ạ nhưng không tìm ra hướng giải quyết . Mong các anh,chị tìm hướng giúp em ạ .Em không hiểu sao cột vị mã sản phẩm nó không lọc trùng
Thêm nữa là nên lưu ý về các chi tiết cho dù to hay nhỏ, ví dụ mình thấy ở tiêu đề bạn ghi là hàm "counif", thực ra đâu có hàm này mà là hàm "countif" (thiếu chữ t), viết code thì sai một ký tự là cũng có thể không chạy được hoặc có chạy được cũng chưa chắc đúng, cho nên cẩn thận không thừa.
Bài đã được tự động gộp:

Em không thấy tài liệu nào nó lọc trùng cả 2 ô ạ
Bạn chưa tìm hiểu hết thôi, nên từ từ tìm, khi thấy thì sẽ nhớ rất lâu.
Bài đã được tự động gộp:

em trả lại code ban đầu cho bạn ấy.
Vụ trả lại code bàn giao xong chưa.
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm nữa là nên lưu ý về các chi tiết cho dù to hay nhỏ, ví dụ mình thấy ở tiêu đề bạn ghi là hàm "counif", thực ra đâu có hàm này mà là hàm "countif" (thiếu chữ t), viết code thì sai một ký tự là cũng có thể không chạy được hoặc có chạy được cũng chưa chắc đúng, cho nên cẩn thận không thừa.
Bài đã được tự động gộp:


Bạn chưa tìm hiểu hết thôi, nên từ từ tìm, khi thấy thì sẽ nhớ rất lâu.
Em chưa học tin học văn phòng .E có lén xem youtube 1 năm giờ đang bị covid19 nên em ở nhà học thôi ạ.Chứ em làm công nhân 1 tháng có 4tr à . Nên cũng không quan trọng lắm. tại công nhân có được dùng máy tính đâu ạ
 
Upvote 0
Vụ trả lại code bàn giao xong chưa.
Hihi. Thôi để anh chị khác vào chỉ bạn ấy. Chứ chắc mình ngắn chữ . Không biết giải thích sao. Thậm chí còn chưa hiểu hết ý bạn ấy hỏi. Có khi lại lợn lành thành lợn què mất
Bài đã được tự động gộp:

Em chưa học tin học văn phòng .E có lén xem youtube 1 năm giờ đang bị covid19 nên em ở nhà học thôi ạ.Chứ em làm công nhân 1 tháng có 4tr à . Nên cũng không quan trọng lắm. tại công nhân có được dùng máy tính đâu ạ
Làm cái gì không quan trọng bạn ạ. Vấn đề là bạn muốn học. thì phải học căn bản trước.
 
Upvote 0
Hihi. Thôi để anh chị khác vào chỉ bạn ấy. Chứ chắc mình ngắn chữ . Không biết giải thích sao. Thậm chí còn chưa hiểu hết ý bạn ấy hỏi. Có khi lại lợn lành thành lợn què mất
Bài đã được tự động gộp:


Làm cái gì không quan trọng bạn ạ. Vấn đề là bạn muốn học. thì phải học căn bản trước.
E muốn thực hành nhiều để biết chứ căn bản e có biết học từ đâu đâu. Qua các diễn đàn học lập trình bổ ích hơn chơi game dù nó không phù hơp công việc
 
Upvote 0
Chắc anh làm công việc có liên quan nên nhiều kinh nghiệm lắm ạ
Công việc của mình liên quan rất ít, và thất nghiệp rất nhiều nên kinh nghiệm đầy mình mỗi tội kinh nghiệm trong lĩnh vực excel so với các thành viên trong diễn đàn này coi như bằng không.
 
Upvote 0
Upvote 0
Công việc của mình liên quan rất ít, và thất nghiệp rất nhiều nên kinh nghiệm đầy mình mỗi tội kinh nghiệm trong lĩnh vực excel so với các thành viên trong diễn đàn này coi như bằng không.
Anh cho em hỏi về căn bản vba được không . muốn tự động fill công thức xuống dùng công thức gì. Em record macro mà nó không có ra
 
Upvote 0
Upvote 0

File đính kèm

Upvote 0
Cái này có chậm không ạ tại dữ liệu em nó lớn ý ạ
Đương nhiên phải chậm rồi...(nếu lớn hơn 10.000 dòng mới cảm thấy... khi mở file...)
Có thể khắc phục bằng chuyển về giá trị (value) sau khi fill, thêm dòng sau:
Sheet1.Range("G2:G" & DongCuoi).Value = Sheet1.Range("G2:G" & DongCuoi).Value
Tuy nhiên sẽ mất tính năng tự động fill khi bạn thêm dữ liệu mới vào cột F...
 

File đính kèm

Upvote 0
Kính gửi: Thầy và Anh Chị Em trên diễn đàn
Nhờ mọi người giúp đỡ viết Hàm để đếm (số nhân viên) có các điều kiện ràng buộc như sau:
1 - Điều kiện 1 (theo mã Quỹ lương)
2 - Điều kiện 2 (theo mã Bộ phận)
3 - Điều kiện 3 (theo mã tháng)
4 - Điều kiện 4: Mỗi nhân viên (thỏa mãn các điều kiện 1, đk 2 và đk 3) chỉ được đếm 1 lần mà thôi (dù có tên lặp lại trong danh sách nhiều lần và đã thỏa mãn đk 1, đk2 và đk3).
Hùng xin gửi file kèm theo, nhờ Thầy và Anh Chị Em giúp đỡ, Hùng cám ơn nhiều.
 

File đính kèm

Upvote 0

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

Back
Top Bottom