•  

    Witam ktoś się zna na #excel?
    Opiszę mój problem bo nigdzie nie moge naleźć jak go rozwiązać
    Chcę z zakresu np 1-500 wylosować 400 liczb które sie nie będą powtarzały i umieścić je w kolumnie B po kolei rosnąco. (Tylko liczby całkowite!) Następnie obok w kolumnie C pozostałe niewylosowane liczby.
    Tzn sam sobie już to posortuje w kolejności ważne bym miał wpływ na to ile pozycji sie losuje, by sie nie powtarzały i obok pojawialy sie pozostałe pozycje. Zamieszczę obrazek.
    Dziękuje z góry

    •  

      @Zxy44 jak ktoś rozwiąże to proszę wołać

    •  

      @Zxy44 @Waderra :
      Mam pomysł, ale daleki od pełnej automatyzacji. W ramach rozrywki postanowiłem spróbować i swoimi skromnymi umiejętnościami doszedłem do takiego karkołomnego rozwiązania.

      Arkusz 1
      Kolumna B (B2:B501) Zakres: liczby w zakresie 1-500
      Kolumna C (C2:C501) Kolumna pomocnicza: =LOS()
      Kolumna D (D2:D401) Wylosowane: =ADR.POŚR("B"&POZYCJA(C2;C$2:C$501)+1) przeciągnięta do D401

      W ten sposób masz wylosowanych 400 liczb, przy czym jest to oczywiście funkcja, która się będzie odświeżać za każdym razem.

      Arkusz 2
      W drugim arkuszu znowu mamy kolumnę "Zakres", "Wylosowane" gdzie wklejasz jako wartości dane z pierwszego arkusza. W ostatniej kolumnie "Nie wylosowane" wklejasz wartości z obu wcześniejszych kolumn, zaznaczasz ją, formatujesz aby oznaczało duplikaty, sortujesz wg koloru i usuwasz ręcznie zaznaczone wartości.

      Z pewnością da się to zrobić łatwiej i bardzo elegancko, ale hej - jest sobotnia noc i trafiłeś na średniozaawansowanego w Excelu :)

    •  

      @Zxy44: Wielkością zakresu i liczbą losowanych z niego liczb możesz sterować, zmieniając wartości w deklaracji zmiennych.

      `Sub losuj()

      Dim zakres(1 To 500), niewylosowane(1 To 100)

      For i = 1 To UBound(zakres)
      zakres(i) = i
      Next i

      For i = 1 To UBound(niewylosowane)
      los = Int((UBound(zakres) - i + 1) * Rnd + 1)
      niewylosowane(i) = zakres(los)
      zakres(los) = zakres(UBound(zakres) - i + 1)
      Next

      With [a1].Resize(UBound(zakres) - UBound(niewylosowane))
      .Value = WorksheetFunction.Transpose(zakres)
      .Sort Key1:=[a1], Order1:=xlAscending, Header:=xlNo
      End With

      With [b1].Resize(UBound(niewylosowane))
      .Value = WorksheetFunction.Transpose(niewylosowane)
      .Sort Key1:=[b1], Order1:=xlAscending, Header:=xlNo
      End With

      End Sub`

    •  

      @Zxy44: Tak dla sportu dorzucam jeszcze rozwiązanie w #powerquery :)
      let
      max = 500,
      ile = 100,
      fLosuj = (x) => Number.Round(Number.RandomBetween(1, x)),
      generator = List.Generate(() => [i = fLosuj(max), wyjscie = {i}, zakres = List.RemoveItems({1..max}, {i})], each List.Count([wyjscie]) <= ile, each [i = fLosuj(List.Count([zakres])) - 1, wyjscie = List.Combine({[wyjscie], {[zakres]{i}}}), zakres = List.RemoveItems([zakres], {[zakres]{i}})]),
      wynik = List.Last(generator),
      #"Przekonwertowane na tabelę" = Table.FromColumns({wynik[zakres], List.Sort(wynik[wyjscie])}, {"zakres", "niewylosowane"})
      in
      #"Przekonwertowane na tabelę"

      @Polinik, wołam :)

    •  

      wołam :)

      @DwaNiedzwiedzie:
      Słyszę. ( ͡° ͜ʖ ͡°)

      +: Zxy44
    •  

      @Waderra: wołam
      @DwaNiedzwiedzie: dziękuje ale, nie potrafię uruchomić twojego makra (z excela jestem zielony)

      ja zaczołem korzystać z tego makra nie jest idealne ale w miarę działa
      Kod:
      Sub Losowanie()
      Dim SrtLst As Object
      Dim vKeys As Variant
      Dim v As Variant
      Dim i As Long, k As Long
      Dim lTmp As Long
      Dim lUbound As Long
      Dim lLbound As Long
      Dim lCardin As Long

      lUbound = 500
      lLbound = 1
      lCardin = 400

      Set SrtLst = CreateObject("System.Collections.SortedList")

      Randomize Time

      Do
      lTmp = Int((lUbound - lLbound + 1) * Rnd + lLbound)

      If Not SrtLst.Contains(lTmp) Then
      SrtLst.Add lTmp, 0
      End If

      Loop While SrtLst.Count < lCardin


      ReDim vKeys(1 To lCardin)


      For i = 0 To SrtLst.Count - 1
      vKeys(i + 1) = SrtLst.GetKey(i)
      Next i


      ReDim v(1 To lUbound - lCardin)

      For i = 1 To lUbound
      If Not SrtLst.Contains(i) Then
      k = k + 1
      v(k) = i
      End If
      Next i


      vKeys = TransposeIt(vKeys)
      v = TransposeIt(v)

      Cells(2, "B").Resize(UBound(vKeys) + 1).Value = vKeys
      Cells(2, "C").Resize(UBound(v) + 1).Value = v


      End Sub

      Function TransposeIt(vData)
      Dim LBound2 As Long

      LBound2 = -1

      If IsArray(vData) Then
      On Error Resume Next
      LBound2 = UBound(vData, 2)
      On Error GoTo 0

      With CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")
      .Column = vData

      If LBound2 = -1 Then
      TransposeIt = .Column
      Else
      TransposeIt = .List
      End If
      End With

      End If


      End Function

      +: Waderra