اذهب الي المحتوي
أوفيسنا

الأرقام الناقصة في المجموعة


إذهب إلى أفضل إجابة Solved by محمد هشام.,

الردود الموصى بها

المطلوب كود يستدعي الأصناف الناقصة في المجموعات

لدينا مجموعات من 1إلى 96 مثلا  وكل مجموع تحتوي على 100 صنف اريد معرفة الأصناف الناقصة في كل مجموع على الترتيب 

ولكن في هذا المثال عدد المجموعات من 1 إلى 3 فقط لكي يكون الكود سريع 

الملف

الأرقام الناقصة.xlsx

رابط هذا التعليق
شارك

تفضل اخي الكريم جرب هدا

Sub Find_MissingNumbers()
    Dim WS As Worksheet
    Dim CodeArr() As Variant, NumArr() As Variant, code As Variant
    Dim tmp As Object, ling As Long, cnt As Boolean, n As Boolean
    Dim lastRow As Long, i As Long, j As Long, maxNum As Long
    

    Set WS = Sheets("Sheet1")
    lastRow = WS.Cells(WS.Rows.Count, 1).End(xlUp).Row
    maxNum = 100  '(عدد الأصناف) ' تحديد الحد الاقصى للقيم المفقودة

    n = False
    For i = 3 To lastRow
        If Not IsEmpty(WS.Cells(i, 1).Value) And Not IsEmpty(WS.Cells(i, 2).Value) Then
            n = True
            Exit For
        End If
    Next i
    
    If Not n Then
        MsgBox "الرجاء التحقق من البيانات والمحاولة مرة أخرى", vbExclamation
        Exit Sub
    End If

    Application.ScreenUpdating = False
    On Error Resume Next
    WS.Range("F3:G" & WS.Rows.Count).ClearContents
    CodeArr = WS.Range("A3:A" & lastRow).Value
    NumArr = WS.Range("B3:B" & lastRow).Value
    
    Set tmp = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(CodeArr, 1)
        If Not tmp.Exists(CodeArr(i, 1)) Then
            tmp.Add CodeArr(i, 1), New Collection
        End If
        tmp(CodeArr(i, 1)).Add NumArr(i, 1)
    Next i
    On Error GoTo 0
    
    ling = 3
    For Each code In tmp.Keys
        For j = 1 To maxNum
            cnt = False
            For i = 1 To tmp(code).Count
                If tmp(code)(i) = j Then
                    cnt = True
                    Exit For
                End If
            Next i
            If Not cnt Then
                WS.Cells(ling, 6).Value = code
                WS.Cells(ling, 7).Value = j
                ling = ling + 1
            End If
        Next j
    Next code

    Application.ScreenUpdating = True
End Sub

 

 

في حالة الرغبة بالحصول على رسالة تعرض "كود الصنف" وعدد "الأرقام المفقودة"   لكل صنف بعد تنفيد الكود قم بتعديل الجزء الأخير من الكود كالتالي 

Capture.JPG.7bfe1133d2d47a27ccff278e78df792b.JPG

ling = 3
    Dim msg As String, KyCount As Long
    msg = ": ملخص الأرقام المفقودة" & vbCrLf & vbCrLf
    For Each code In tmp.Keys
        KyCount = 0
        For j = 1 To maxNum
            cnt = False
            For i = 1 To tmp(code).Count
                If tmp(code)(i) = j Then
                    cnt = True
                    Exit For
                End If
            Next i
            If Not cnt Then
                WS.Cells(ling, 6).Value = code
                WS.Cells(ling, 7).Value = j
                ling = ling + 1
                KyCount = KyCount + 1
            End If
        Next j
        msg = msg & "كود الصنف: " & code & " - عدد الأرقام المفقودة: " & KyCount & vbCrLf
    Next code

    Application.ScreenUpdating = True
    MsgBox msg, vbInformation, "نتيجة الأرقام المفقودة"
End Sub

 

الأرقام الناقصة v1.xlsb

تم تعديل بواسطه محمد هشام.
  • Like 2
رابط هذا التعليق
شارك

  • أفضل إجابة

تفضل أخي  

Sub Find_MissingNumbers3()
    Dim WS As Worksheet, dest As Worksheet
    Dim CodeArr() As Variant, NumArr() As Variant, code As Variant
    Dim tmp As Object, ling As Long, cnt As Boolean, n As Boolean
    Dim lastRow As Long, i As Long, j As Long, maxNum As Long
    Dim msg As String, KyCount As Long

    Set WS = Sheets("Sheet1")
    Set dest = Sheets("Sheet2")

    lastRow = WS.Cells(WS.Rows.Count, 1).End(xlUp).Row
    maxNum = 100  ' تحديد الحد الاقصى للقيم المفقودة

    n = False
    For i = 3 To lastRow
        If Not IsEmpty(WS.Cells(i, 1).Value) And Not IsEmpty(WS.Cells(i, 2).Value) Then
            n = True
            Exit For
        End If
    Next i
    
    If Not n Then
        MsgBox "الرجاء التحقق من البيانات والمحاولة مرة أخرى", vbExclamation
        Exit Sub
    End If

    Application.ScreenUpdating = False
   
    dest.Range("a2:b" & dest.Rows.Count).ClearContents
    WS.Range("F3:G" & WS.Rows.Count).ClearContents
    CodeArr = WS.Range("A3:A" & lastRow).Value
    NumArr = WS.Range("B3:B" & lastRow).Value
    
    Set tmp = CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(CodeArr, 1)
        If Not tmp.Exists(CodeArr(i, 1)) Then
            tmp.Add CodeArr(i, 1), New Collection
        End If
        tmp(CodeArr(i, 1)).Add NumArr(i, 1)
    Next i
    
    dest.Cells(2, 1).Value = "كود الصنف"
    dest.Cells(2, 2).Value = "عدد الأرقام المفقودة"

    ling = 3
    Dim a As Long
    a = 3
    
    For Each code In tmp.Keys
        KyCount = 0
        For j = 1 To maxNum
            cnt = False
            For i = 1 To tmp(code).Count
                If tmp(code)(i) = j Then
                    cnt = True
                    Exit For
                End If
            Next i
            If Not cnt Then
                WS.Cells(ling, 6).Value = code
                WS.Cells(ling, 7).Value = j
                ling = ling + 1
                KyCount = KyCount + 1
            End If
        Next j
        dest.Cells(a, 1).Value = code
        dest.Cells(a, 2).Value = KyCount
        a = a + 1
    Next code

    Application.ScreenUpdating = True
    MsgBox dest.Name & " تم ترحيل ملخص الأرقام المفقودة إلى", vbInformation

End Sub

 

الأرقام الناقصة v2.xlsb

  • Like 2
رابط هذا التعليق
شارك

منذ ساعه, sof17 said:

هناك  طلب اخر هل نسطيع تطبيق  نفس الفكرة  على جلب الأرقام المكرر بدل الناقصة 

نعم اخي يمكننا فعل دالك حاول فتح موضوع جديد بطلبك مع ارفاق عينة للنتائج المطلوبة  وان شاء الله سوف نحاول مساعدتك 

رابط هذا التعليق
شارك

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان
  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information