اذهب الي المحتوي
أوفيسنا
بحث مخصص من جوجل فى أوفيسنا
Custom Search

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

قام بنشر

السلام عليكم

صباح الخير ممكن حل للملف الخلية d2  أو على الماكرو وشكرا 

يتم توزيع الاسم حسب العدد في b2 التوزيع عشوائي من d2 الى h66

توزيع.xlsm

قام بنشر

Look you have to be more logical

The total of the numbers in column B equals 331 so the final output number of the names will be 331

While the number of cells in range D2:H66 will be 65 * 5 which equals 325 so the cells that will be have the names are less than the needed names to be populated

Can you explain how will you deal with the problem in that case

قام بنشر

أولا شكر لك استاذي الكريم على الرد بالنسبة للارقام التى ذكرت 65*5 (الرقم  5) فهو على سبيل المثال لا الحصر 

قام بنشر

الخلايا 65*5(من العمود D إلى العمود H)

توزيع الاسماء بشرط ان يتكرر الاسم عشوائيا(على اساس العامود B)

امنة1 يتم توزيعها 5 مرات عشوائيا (من العمود D إلى العمود H)

امنة2 يتم توزيعها 6 مرات عشوائيا (من العمود D إلى العمود H)

حتى اخر اسم اذا تكرمت

  • تمت الإجابة
قام بنشر

Try this code

Sub Test_LionHeart()
    Dim a, b, lr As Long
    With ActiveSheet
        lr = .Cells(Rows.Count, 1).End(xlUp).Row
        .Range("D2:H" & lr).ClearContents
        a = CreateNamesArray(.Range("A2:A" & lr), .Range("B2:B" & lr))
        ShuffleArray a
        b = ConvertToColumns(a, lr - 1)
        .Range("D2").Resize(UBound(b, 1), UBound(b, 2)).Value = b
    End With
End Sub

Function CreateNamesArray(ByVal namesRange As Range, ByVal countRange As Range)
    Dim nameArray, nameIndex As Long, countIndex As Long, rowCount As Long, totalNames As Long, currCount As Long, i As Long
    rowCount = namesRange.Rows.Count
    totalNames = WorksheetFunction.Sum(countRange)
    ReDim nameArray(1 To totalNames, 1 To 1)
    nameIndex = 1
    For countIndex = 1 To rowCount
        currCount = countRange(countIndex, 1).Value
        For i = 1 To currCount
            nameArray(nameIndex, 1) = namesRange(countIndex, 1).Value
            nameIndex = nameIndex + 1
        Next i
    Next countIndex
    CreateNamesArray = nameArray
End Function

Private Sub ShuffleArray(ByRef arr)
    Dim temp, i As Long, j As Long
    Randomize
    For i = LBound(arr) To UBound(arr)
        j = Int((UBound(arr) - i + 1) * Rnd + i)
        temp = arr(i, 1)
        arr(i, 1) = arr(j, 1)
        arr(j, 1) = temp
    Next i
End Sub

Function ConvertToColumns(ByVal inputArray, ByVal divisor As Long)
    Dim numOutputCols As Long, i As Long, j As Long, k As Long
    numOutputCols = Application.WorksheetFunction.RoundUp(UBound(inputArray, 1) / divisor, 0)
    ReDim outputArray(1 To divisor, 1 To numOutputCols)
    k = 1
    For j = 1 To numOutputCols
        For i = 1 To divisor
            If k <= UBound(inputArray, 1) Then
                outputArray(i, j) = inputArray(k, 1)
                k = k + 1
            End If
        Next i
    Next j
    ConvertToColumns = outputArray
End Function

 

  • Like 3
  • Thanks 1
قام بنشر

كل الشكر والامتنان  للاستاذ الخبير lionheart على مساعدتي في إنجاز العمل بنجاح. وقد ساعدته قيِّم عطائه ، وعلمه 

ربنا ييسر امرك ويزيدك من نعيمعه فعلا اكرمتني ربي يكرمك كل الشكر والتقدير والاجلال لك أستاذي

  • Like 1
قام بنشر

الأستاذ الفاضل

lionheart

كود جميل وأشكرك عليع

مع رجاء توضيح أماكن التعديل في الكود - في حال اردن أن نزيد عدد اعمده التوزيع عن 5 اعمده

 

تحياتي

قام بنشر

The results will be populated to the suitable number of columns so you can't modify the number of columns in results. Try to put more names and values and you will see the output will be populated in more than five columns

  • Like 1

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

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهوله .

سجل حساب جديد

تسجيل دخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.

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

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

Important Information