मैं एक कोड लिख रहा हूं जो "एक्स" क्लाइंट आईडी चुनता है, फिर एक लूप बनाता है जो यादृच्छिक रूप से एक सूची से "एक्स" आईडी चुनता है, इसके बाद कोड इस क्लाइंट से राजस्व प्राप्त करने के लिए xlookup करता है, और अंत में सभी को जोड़ता है चुने हुए ग्राहकों का राजस्व, अब तक बहुत अच्छा है, लेकिन मुझे नहीं पता कि लूप की पिछली आईडी को दोहराए बिना यादृच्छिक रूप से कैसे चुनें। मुझे नहीं पता कि मैं काफी स्पष्ट था। नीचे दिए गए कोड का पालन करें

Private Sub pick()


resultado = 0

For X = 1 To Range("G7").Value
valor_procurado = WorksheetFunction.Choose(WorksheetFunction.RandBetween(1, 10), _
Sheets("lista").Range("a1"), _
Sheets("lista").Range("a2"), _
Sheets("lista").Range("a3"), _
Sheets("lista").Range("a4"), _
Sheets("lista").Range("a5"), _
Sheets("lista").Range("a6"), _
Sheets("lista").Range("a7"), _
Sheets("lista").Range("a8"), _
Sheets("lista").Range("a9"), _
Sheets("lista").Range("a10"))

matriz_procurada = Sheets("lista").Range("a1:a10")

matriz_retorno = Sheets("lista").Range("b1:b10")

valores = WorksheetFunction.XLookup(valor_procurado, matriz_procurada, matriz_retorno, "-", 0)

resultado = resultado + valores

Next

Range("G8") = resultado

End Sub
0
Leonardo Duarte 3 फरवरी 2021, 21:48
एक काउंटर के साथ जबकि लूप का उपयोग करने पर विचार करें जो केवल तभी गिना जाता है जब यादृच्छिक रूप से चयनित सेल को पिछले लूप चक्र में नहीं चुना गया हो। आपको पहले से संसाधित किए गए कॉलम को चिह्नित करने के लिए एक सहायक कॉलम की आवश्यकता हो सकती है और यदि पंक्ति को अभी तक चिह्नित नहीं किया गया है तो केवल अपना कोड निष्पादित करें। फॉर/नेक्स्ट लूप यहां सबसे अच्छा समाधान नहीं है क्योंकि इसने एंडपॉइंट्स को परिभाषित किया है।
 – 
MBB70
3 फरवरी 2021, 22:27
यह एक अच्छा समाधान की तरह लगता है, लेकिन मैं वीबीए में नौसिखिया हूं (लगता है कि आप नोटिस करते हैं), और मुझे कोई विचार नहीं है कि एक तर्क कैसे बनाया जाए जो केवल तभी गिना जाता है जब यादृच्छिक रूप से चयनित सेल को पिछले लूप चक्र में नहीं चुना गया हो। क्या आप कृपया एक उदाहरण कोड दे सकते हैं या मुझे कुछ ट्यूटोरियल का लिंक भेज सकते हैं? बहरहाल, बहुत-बहुत धन्यवाद...-
 – 
Leonardo Duarte
3 फरवरी 2021, 22:56

1 उत्तर

सबसे बढ़िया उत्तर

अगर मैं सही ढंग से समझता हूं तो यह वही करना चाहिए जो आप खोज रहे हैं।

यह एक शब्दकोश बनाता है जिसमें कुंजी एक साधारण अनुक्रमणिका होती है और आइटम कॉलम बी में मान होता है। यह 1 और ऊपरी सीमा के बीच एक यादृच्छिक संख्या लेता है, मूल रूप से अंतिम पंक्ति पर सेट होता है। यह तब डिक्शनरी को फिर से अनुक्रमित करता है जो उस मूल्य को हटाता है जिसे चुना गया था और ऊपरी सीमा को 1 से कम करता है।

मैंने लास्ट्रो में जोड़ा लेकिन आप चाहें तो इसे हार्डकोड कर सकते हैं।

10,000 पंक्तियों के साथ परीक्षण किया गया, तेज़ होना चाहिए।

    Dim dict As Object
    Dim lr As Long
    Dim upper As Long
    Dim i As Long
    Dim j As Long
    Dim randomizer As Long
    Dim total As Long
    
    Set dict = CreateObject("Scripting.Dictionary")
    total = 0
    
    With ActiveSheet
        lr = .Cells(.Rows.Count, 1).End(xlUp).Row 'assign a value to lr if you don't want the last row
        upper = lr
        For i = 1 To lr
            dict.Add i, .Cells(i, 2).Value
        Next i
        For i = 1 To .Cells(7, 7).Value
            randomizer = Int(upper * Rnd + 1)
            total = total + dict(randomizer)
            Debug.Print randomizer, total
            dict.Remove randomizer
            For j = (randomizer + 1) To upper
                dict.Key(j) = j - 1
            Next j
            upper = upper - 1
        Next i
        .Cells(7, 8).Value = total
    End With
0
Warcupine 4 फरवरी 2021, 15:51