আমি ভিবিএ ব্যবহার করে একটি সমাধান পেয়েছি। আগ্রহী প্রত্যেকের জন্য কোডটি এখানে:
দ্রষ্টব্য: আমি বছরগুলিতে ভিবিএ ব্যবহার করি নি, তাই আমার কোডটি খুব ভাল নাও লাগতে পারে। পরিবর্তনগুলির জন্য যে কোনও পরামর্শই স্বাগতের চেয়ে বেশি।
প্রথমে আমি নামকরণকৃত সেলগুলি থেকে স্টার্টেট এবং এন্ডডেট পাব
Dim MAnfang As Long
MAnfang = Range("Monatsanfang").Value2
Dim MEnde As Long
MEnde = Range("Monatsende").Value2
তারপরে আমি একটি নামকৃত সেল থেকে আইটেম-আইডিও পেয়েছি এবং এটিকে একটি স্ট্রিংয়ে রূপান্তর করি
Dim ItemID As String
ItemID = CStr(Range("ItemID").Value)
তারপরে আমি শীটটি সেট করেছি, শেষ সারিটি পেয়েছি, ফিল্টেরিয়া এবং অনন্য সারিটি সংজ্ঞায়িত করব
Dim FSheet As Worksheet
Set FSheet = Sheets("Faktura")
Dim k As Integer
k = FSheet.Range("M1").End(xlDown).Row
Dim FBereich As Range
Set FBereich = FSheet.Range("A1:X" & k)
Dim UniqueColRange As Range
Set UniqueColRange = FSheet.Range("T2:T" & k)
তারপরে আমি আমার যুক্তিগুলির ভিত্তিতে এটি ফিল্টার করতে নীচের ফাংশনটি কল করি এবং অনন্য গণনাটি ফিরিয়ে এনে অন্য একটি নামক সেলে লিখি
Range("Endresult").Value = FilterAndGetCount(FSheet, FBereich, 12, MAnfang, MEnde, 6, Array(ItemID), UniqueColRange )
End Sub
Private Function FilterAndGetCount(FilterSheet As Worksheet, FilterBereich As Range, DFeld As Integer, DStart As Long, DEnde As Long, LNFeld As Integer, LNArray As Variant, UniqueColumnRange As Range)
FilterBereich.AutoFilter _
Field:=DFeld, _
Operator:=xlAnd, _
Criteria1:=">=" & DStart, _
Criteria2:="<=" & DEnde
FilterBereich.AutoFilter _
Field:=LNFeld, _
Operator:=xlFilterValues, _
Criteria1:=LNArray
Total = getVisibleArray(UniqueColumnRange)
FilterAndGetCount = getUniqueCount(Total) - 1
If FilterSheet.AutoFilterMode Then FilterSheet.ShowAllData
End Function
Private Function getUniqueCount(varray As Variant) As Integer
Dim dict As Object
Set dict = CreateObject("scripting.dictionary")
Dim element As Variant
For Each element In varray
If dict.exists(element) Then
dict.Item(element) = dict.Item(element) + 1
Else
dict.Add element, 1
End If
Next
getUniqueCount = dict.Count
End Function
Private Function getVisibleArray(vrange As Range) As Variant
Dim i As Integer
i = 0
Dim VisibleArray() As Variant
Dim VisibleArrayLength As Integer
VisibleArrayLength = vrange.SpecialCells(xlCellTypeVisible).Count
ReDim VisibleArray(VisibleArrayLength)
For Each c In vrange.SpecialCells(xlCellTypeVisible)
VisibleArray(i) = c.Value
i = i + 1
Next c
getVisibleArray = VisibleArray
End Function