Losowe wyszukiwanie rozwiązań (VBA)



Podobne dokumenty
LibreOffice Calc VBA

INSTRUKCJA SKOKU GOTO

4.1. Analiza AWN jest dokonywana na poziomie VBA

Technologie informacyjne: Excel i VBA

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Plik->Opcje->Zakladka Główne->Dostosuj Wstążkę Zaznaczamy kwadracik Developer na liscie po prawej stronie. Klikamy OK.

Wprowadzenie do programowania w VBA

TABLICA (ang. array) pojedyncza zmienna z wieloma komórkami, w których można zapamiętać wiele wartości tego samego typu danych.

Visual Basic for Applications. Wstęp

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Pętle. Programowanie komputerowe

Arkusze kalkulacyjne i VBA

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Tablice. Jones Stygar na tropie zmiennych

Arkusze kalkulacyjne i VBA

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Program szkolenia VBA (VISUAL BASIC FOR APPLICATIONS) W EXCELU PRZEKROJOWY.

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

PROGRAMOWANIE MAKR W PROGRAMIE EXCEL W JĘZYKU VISUAL BASIC

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

Pętle instrukcje powtórzeo

Makra VBA w Excelu dla początkujących

Wstęp do programowania

2.1 Funkcje - na przykładzie wyceny europejskiej

Instrukcje cykliczne (pętle) WHILE...END WHILE

Porównanie generatorów liczb losowych wykorzystywanych w arkuszach kalkulacyjnych

Podstawy Programowania C++

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Elektroenergetyki Technologie informatyczne

Program szkolenia VBA (VISUAL BASIC FOR APPLICATIONS) W EXCELU PODSTAWOWY.

Visual Basic for Application (VBA)

Wstęp do programowania

PROGRAMOWANIE MAKR W PROGRAMIE EXCEL W JĘZYKU VISUAL BASIC

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 3. Programowanie komputerowe

Algorytmika i Programowanie VBA 1 - podstawy

SUM Edukacja Techniczno Informatyczna Języki i Systemy Programowania. Wykład 3. dr Artur Bartoszewski - WYKŁAD: Języki i Systemy Programowania,

Technologia informacyjna programowanie Janusz Uriasz

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

Podstawy programowania obiektowego

Aplikacje w środowisku VBA. Visual Basic for Aplications

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Maxima i Visual Basic w Excelu

Liczby losowe i pętla while w języku Python

Programowanie dynamiczne cz. 2

Przedmiot: Informatyka w inżynierii produkcji Forma: Laboratorium Temat: Zadanie 4. Instrukcja warunkowa.

VBA praca z makrami w Excelu: piszemy kod! Ulepszamy program! 0. Parę uwag o samym edytorze

Visual Basic for Application (VBA)

Zaawansowane algorytmy i struktury danych

MS Excel. 1. JEŻELI - funkcja służąca do testowania warunków logicznych. Składnia: JEŻELI(warunek_logiczny; wartość_dla_prawdy; wartość_dla_fałszu)

VISUAL BASIC W EXCELU

Visual Basic for Application (VBA)

Makropolecenia w PowerPoint Spis treści

Ćwiczenie 1 Obsługa makr

Program szkolenia PODSTAWY VBA (VISUAL BASIC FOR APPLICATIONS) I FORMULARZE.

Tablice cz. I Tablice jednowymiarowe, proste operacje na tablicach

Funkcje wyszukiwania i adresu PODAJ.POZYCJĘ

Analiza algorytmów zadania podstawowe

Rozwiązywanie problemów z użyciem Solvera programu Excel

AUTOMATYZACJA PRACY Z UŻYCIEM MAKR. Tom XII NPV WSP.KORELACJI ROZKŁ.EXP JEŻELI COS KOMÓRKA VBA DNI.ROBOCZE ILOCZYN LOG SUMA CZY.

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Podstawy programowania. Podstawy C# Tablice

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Zakres tematyczny dotyczący podstaw programowania Microsoft Office Excel za pomocą VBA

Podstawowym zadaniem, które realizuje

3. Podstawy programowania w MS EXCEL

Excel 2010 PL. Formuły.

Visual Basic dla AutoCAD

Automatyzacja pracy w AutoCAD

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

PROGRAMOWANIE W EXCELU W JĘZYKU VISUAL BASIC FOR APPLICATIONS

Lista, Stos, Kolejka, Tablica Asocjacyjna

2. Wstaw przyciski: a. wykonujące funkcje z ćwiczenia 1 b. zastosuj różnorodne właściwości dla przycisku

VBA-podstawy cz. 1. Począwszy od wersji Office 2010 skoroszyty Excel wsparte makrami VB mają rozszerzenie.xlsm

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Funkcje Tablicowe podstawy

Makropolecenia w Excelu

Excel. Tworzenie zaawansowanych aplikacji.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej.

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Obsługa blędów i zewnętrznych plików

Wyszukiwanie największej spośród czterech liczb. Przykładowe rozwiązanie

Laboratorium Programowania Kart Elektronicznych

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Palindromy. Przykładowe rozwiązanie

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

PODSTAWY VBA Rinat Szepe ( )

Wstęp do systemów wielozadaniowych laboratorium 19 awk

Część I: Przypisanie makr do obiektu (przycisku).

Parę uwag, uzupełnień

Ekonometria. Regresja liniowa, współczynnik zmienności, współczynnik korelacji liniowej, współczynnik korelacji wielorakiej

Excel w obliczeniach naukowych i inżynierskich. Wydanie II.

VBA praca z makrami w Excelu

Działki Przygotowanie organizacyjne

4. Funkcje. Przykłady

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Transkrypt:

Losowe wyszukiwanie rozwiązań (VBA) Dariusz Jabłoński (hurgadion) djablons@interia.pl W pierwszym moim artykule dotyczącym losowego wyszukiwania rozwiązań skoncentrowałem się na pokazywaniu problemów dotyczących zagadnień typowo matematycznych. W niniejszym artykule prezentuję przykłady poszukiwania rozwiązań dla problemów częściej spotykanych w działalności gospodarczej. Zaprezentowano ponadto, inaczej niż poprzednio, losową metodę wyszukiwania rozwiązań z wykorzystaniem języka programowania VBA a nie tylko formuł Excela. Podejście to, może być wykorzystywane czasem jako alternatywa dla Solvera, zdarza się przy tym, że daje ono również rozwiązania inne niż Solver. Zadanie 1. 1 Załóżmy, że mamy kilkanaście magazynów umieszczonych w całym kraju, powiedzmy: 15. W każdym z tych magazynów jest jakiś towar, np w magazynie nr 1. jest towar a, b, c,d. W magazynie 2 jest towar b, c, x, y, z... W kolejnych magazynach podobnie. W żadnym magazynie nie ma całego "alfabetu" towarów. Jak obliczyć optymalną (minimalną) liczbę magazynów, które zawierają cały alfabet towarów? Rozwiązanie: W załączniku (Arkusz magazyny) w tabeli mieszczącej się w zakresie C2:S30 można wpisać w których magazynach występują poszczególne artykuły. Jest to tablica pomocnicza, na podstawie której są wykonywane obliczenia. W komórce S4 jest wpisana formuła tablicowa: =SUMA(D4:R4*$D$31:$R$31) która zlicza w ilu magazynach wytypowanych występuje dany artykuł z alfabetu. W zakresie D31:R31 po uruchomieniu Solvera będą występować zera i jedynki. Jedynka oznacza, że dany magazyn jest wytypowany. W Solverze ponadto jest warunek dla zakresu D4:R4 gwarantujący, że dla każdego artykułu z alfabetu zostanie wytypowany co najmniej jeden magazyn po optymalizacji. Po odpaleniu Solvera należy uruchomić poniższe makro, aby wybrać unikalnie magazyn, z którego będziemy sprowadzać dany artykuł. 1 http://www.excelforum.pl/topics1/optymalizacja-ilosci-dostawcow-vt23792.htm#127612

Sub Art() Dim tbl1(1 To 26) Dim x&, i&, j&, s As String x = 1 For i = 1 To 15 s = "" If Cells(31, i + 5).Value = 1 Then For j = 1 To 26 If Cells(j + 3, i + 5).Value = 1 Then If tbl1(j) = 0 Then If s = "" Then s = Cells(j + 3, 5).Value Else s = s & ", " & Cells(j + 3, 5).Value tbl1(j) = 1 Cells(i + 5, 4).Value = s Makro wybiera pierwszy z kolei magazyn, z którego da się sprowadzić dany artykuł. Po kolei dla każdego magazynu następuje sprawdzenie czy dany artykuł został już wybrany, jeżeli tak, to przechodzimy dalej, jeżeli nie, to artykuł jest przypisywany do magazynu. Problem postawiony w tym zadaniu da się rozwiązać bez wykorzystania Solvera (dzięki temu da się także uzyskać rozwiązanie nieco innego od Solvera, o ile rozwiązanie nie jest jedyne). Sub Permutacja() Dim i&, j&, l&, x&, x1&, a& ReDim V(1 To 15) ReDim VK(1 To 15) ReDim VZ(1 To 26) ReDim V1(1 To 26, 1 To 15) ReDim VPom(1 To 26, 1 To 15) Range("F31:T31").ClearContents V1 = Range("F4:T29").Value x1 = 15 For l = 1 To 10000 V = RndInt() x = 0 For i = 1 To 15 a = V(i) For j = 1 To 26 VPom(j, i) = V1(j, a) If i = 1 Then VZ(j) = 0

VZ(j) = VZ(j) + VPom(j, i) x = x + 1 If Application.Product(VZ) > 0 Then Exit For If x < x1 Then VK = V x1 = x Next l For i = 1 To x1 Cells(31, VK(i) + 5).Value = 1 Makro działa w następujący sposób: 1) Kluczowym elementem makra jest pętla iterowana przez i (ilość magazynów) oraz iterowana przez j (ilość artykułów), 2) W każdej iteracji pętli iterowanej przez l (każda pętla odpowiada innemu losowaniu) zostaje wylosowana jednowymiarowa tablica V o unikalnych elementach 1-15 (umożliwia to pomocnicza funkcja RndInt), 3) Do tablicy V1 zostają wpisane komórki zakresu F4:T29 (ten zakres jest kluczowy, odpowiada on informacji o rozmieszczeniu artykułów w magazynach) 4) Następnie zostają przepermutowane kolumny tablicy V1 w zależności od kolejności indukowanej przez elementy tablicy V. 5) W kluczowej pętli iterowanej przez i, j następuje wybór x magazynów, które posiadają wszystkie artykuły (ten warunek sprawdza funkcja Application.Product) 6) Główna pętla generowana przez l umożliwia znalezienie (a raczej zoptymalizowanie) liczby magazynów zawierającej wszystkie artykuły. 7) Dla znalezionej optymalnej liczby magazynów zostaje przypisana losowa tablica V. Funkcja pomocnicza losująca zestaw liczb od 1-15 (na podstawie pozycji [1]) Function RndInt() Dim V() As Variant, Val As Variant Dim i&, j&, r&, c&, a& Dim t1 As Variant, t2 As Variant Randomize a = 15 ReDim V(1 To a) ReDim Val(1 To 2, 1 To a)

For i = 1 To a Val(1, i) = Rnd Val(2, i) = i For i = 1 To a For j = i + 1 To a If Val(1, i) > Val(1, j) Then t1 = Val(1, j) t2 = Val(2, j) Val(1, j) = Val(1, i) Val(2, j) = Val(2, i) Val(1, i) = t1 Val(2, i) = t2 i = 0 For r = 1 To a i = i + 1 V(i) = Val(2, i) Next r RndInt = V End Function Zadanie 2. Mamy zbiór danych liczbowych (od dwóch do dwudziestu dodatnich składników). Znaleźć możliwe kombinacje sum pomiędzy dwoma z góry ustalonymi wartościami. Rozwiązanie: Unikalne (dzięki kolekcji) kombinacje wyławia losowo następujące makro (Arkusz losowanki): Sub Losowanko() Dim tabl(), tablprop(), tabl1() Dim NoDupes As New Collection Dim x&, i&, j&, s As Double, m&, a As String, p&, w& Dim Item As Variant p = Application.CountA(Range("A1:T1")) If p < 2 Then Exit Sub ReDim tabl(1 To p) ReDim tablprop(1 To p) ReDim tabl1(1 To p) tabl = Cells(1, 1).Resize(, p).value Application.ScreenUpdating = False w = Application.Max(2, Cells(Rows.Count, "A").End(xlUp).Row)

Range("A2:T" & w).clearcontents Randomize x = 1 On Error Resume Next For i = 1 To 100 * Sqr(2 ^ (p + 3)) For j = 1 To p tablprop(j) = Round(Rnd, 0) s = Application.SumProduct(tabl, tablprop) If s <= Cells(3, "V").Value And s >= Cells(2, "V").Value Then m = Cells(Rows.Count, "A").End(xlUp).Row + 1 m = Application.Max(m, 3) Cells(m, 1).Resize(, p) = tablprop For j = 1 To p Cells(m, j).value = Cells(m, j).value * Cells(1, j).value Cells(m, 1).Value = Lacz_Teksty(Cells(m, 1).Resize(, p)) NoDupes.Add Cells(m, 1).Value, CStr(Cells(m, 1).Value) On Error GoTo 0 x = 3 w = Application.Max(2, Cells(Rows.Count, "A").End(xlUp).Row) Range("A3:T" & w).clearcontents For Each Item In NoDupes Cells(x, 1).Value = Item x = x + 1 Next Item x = Cells(Rows.Count, "A").End(xlUp).Row For i = 3 To x a = Cells(i, 1).Value For j = 1 To p Cells(i, j).value = Extra(a, j) Cells(i, j).value = Cells(i, j).value * 1 Application.ScreenUpdating = True Function Extra(txt, n) Dim All As Variant All = Split(txt, "_") Extra = All(n - 1) End Function Function Lacz_Teksty(x As Range) Dim s As String, kom As Range For Each kom In x If Len(s) = 0 Then s = kom.value Else

If Len(kom.Value) > 0 Then s = s & "_" & kom.value Next kom Lacz_Teksty = s End Function Makro działa w następujący sposób: 1) Liczba p zlicza ile jest wypełnionych po kolei komórek w wierszu pierwszym (dla tylu komórek są wyszukiwane rozwiązania), 2) W komórkach V2, V3 są wpisane graniczne wartości, dla których będzie przeprowadzane wyszukiwanie rozwiązań, 3) Następnie do tablicy tabl są wpisane wartości niepustych komórek z wiersza pierwszego, 4) W głównej pętli iterowanej przez i następuje losowe wyszukiwanie odpowiednich rozwiązań, w każdym kroku zostaje utworzona losowa, zerojedynkowa tablica tablprop, 5) Następnie jest obliczona SUMA.ILOCZYNÓW (w wersji VBA) tablic tabl, tablprop 6) W kolejnym kroku jest sprawdzana czy obliczona SUMA.ILOCZYNÓW jest pomiędzy granicznymi wartościami z punktu 2), jeżeli warunek jest sprawdzony następuje dopisanie danego losowego rozwiązania, o ile wcześniej nie zostało już wpisane. Umożliwia to fragment kodu wyławiający unikaty za pomocą obiektu kolekcji, 7) Unikalne rozwiązania są po kolei wypisywane w odpowiednich, kolejnych wierszach W makrze zostały użyte standardowe, pomocnicze funkcje (Extra: na podstawie [1], Lacz_Teksty) umożliwiające operacje na łańcuchach tekstowych. Być może da się ich uniknąć i rozwiązać problem nieco łatwiej, np. za pomocą tablic (Homework ) Zadanie 3 Ogrodnikowi polecono zaprojektować ogród z drzewami i krzewami, przy czym właściciel ogrodu przeznaczył na zakup 1500zł i ponadto życzył sobie, aby: a) cisów było co najwyżej 6 sztuk, b) jałowców tyle samo co tuj i co najmniej po 20 sztuk c) jodły 2 razy więcej niż sosny

d) kosodrzewiny więcej niż 6 sztuk, ale mniej niż 12 e) świerków srebrnych 4 sztuki, a świerków białych 6 sztuk f) każdego drzewa i krzewu musi być co najmniej po 2 sztuki Ile drzew i krzewów może kupić ogrodnik za tą sumę, spełniając jednocześnie wymagania właściciela ogrodu jeśli ceny drzew i krzewów są takie, jak podano wyżej w tabeli? TOWAR cis jałowiec jodła sosna kosodrzewina świerk biały świerk srebrny tuja CENA 18,00 zł 11,00 zł 18,00 zł 10,00 zł 18,00 zł 13,00 zł 40,00 zł 25,00 zł Rozwiązanie: Problem można rozwiązać w sposób standardowy wykorzystując Solvera, otrzymamy wtedy rozwiązanie jak na załączonej tabeli. CENA LICZBA 18,00 zł 6 11,00 zł 24 18,00 zł 4 10,00 zł 2 18,00 zł 11 13,00 zł 6 40,00 zł 4 25,00 zł 24 Można jednak spróbować znaleźć rozwiązanie losowo wyszukując optymalne wartości za pomocą poniższego makra, które wyszukuje także rozwiązania inne niż Solver (Arkusz solveration). Sub Solveration() Dim table(), tablelos() Dim i& ReDim table(1 To 8) ReDim tablelos(1 To 8) Range("C2:C9").ClearContents table = Application.Transpose(Range("B2:B9")) Randomize

For i = 1 To 1000000 tablelos(1) = Int(2 + 4 * Rnd, 0) tablelos(2) = Int(20 + 50 * Rnd, 0) tablelos(4) = Int(2 + 50 * Rnd(), 0) tablelos(3) = 2 * tablelos(4) tablelos(5) = Int(7 + 5 * Rnd, 0) tablelos(6) = 6 tablelos(7) = 4 tablelos(8) = tablelos(2) If Application.SumProduct(table, tablelos) = 1500 Then Range("C2:C9").Value = Application.Transpose(tablelos) Exit Sub MsgBox Nie udało się znaleźć właściwego rozwiązania Makro działa w następujący sposób: 1) Główną pętlą jest pętla iterowana przez i. Makro odnajduje rozwiązanie, o ile istnieje (można makro przerobić, aby wyszukiwało rozwiązanie optymalne zamiast dokładnego: Homework ). W tym przypadku rozwiązanie nie jest jednoznaczne, istnieje parę różnych rozwiązań problemu. Główna pętla jest ustawiona na milion kroków, jednak po znalezieniu optymalnego rozwiązania zostaje przerwane działanie głównej pętli, 2) Każdy krok głównej pętli polega na wylosowaniu optymalnego rozwiązania (tablica tablelos, poszczególne elementy tej tablicy odpowiadają ilości danego gatunku drzewa), które jest dobierane w taki sposób, aby spełniało warunki postawione w zadaniu (jest to możliwe dzięki funkcji zaokrąglającej Int oraz podstawowym działaniom matematycznym). Do tablicy table są przypisane ceny poszczególnych drzew. Następnie potencjalne rozwiązanie zostaje zweryfikowane (zostaje obliczona SUMA.ILOCZYNÓW tablic table oraz tablelos i porównana z oczekiwaną wartością). Po pozytywnej weryfikacji potencjalnego rozwiązania następuje przypisanie tablicy tablelos do właściwego zakresu.

Ważnym zagadnieniem optymalizacyjnym jest tzw. problem plecakowy, poniżej prezentujemy rozwiązanie oparte o losową metodę wyszukiwania rozwiązań. Zadanie 4. Mamy m plecaków oraz n przedmiotów o wadze w i wartości c oraz ograniczenia pojemności plecaków a_i, i = 1,, m. Należy upakować te przedmioty do tych plecaków tak, aby suma wartości przedmiotów w plecakach była jak największa. Rozwiązanie: Problem można rozwiązać za pomocą poniższego makro (Arkusz plecak): Sub Plecaki() Dim tabil() As Long, tabcost() As Long, tablos() As Long, tab1() As Long, tabplecak() As Long, tab2() As Long Dim c1&, a&, b&, c&, d&, x&, i&, j&, k&, m&, n& m = Application.CountA(Range("1:1")) n = Application.CountA(Range("4:4")) Application.ScreenUpdating = False ReDim tabplecak(1 To m) For i = 1 To m tabplecak(i) = Cells(1, i).value ReDim tabil(1 To n) ReDim tabcost(1 To n) ReDim tablos(1 To n) ReDim tab1(1 To n) For i = 1 To n tabil(i) = Cells(4, i).value tabcost(i) = Cells(5, i).value d = d + tabcost(i) Randomize For i = 1 To Application.Min(1000000, 50 * m ^ UBound(tablos)) ReDim tab2(1 To m) c = 0 For j = 1 To n tablos(j) = Round(-0.5 + (m + 1) * Rnd, 0) For k = 1 To m If tablos(j) = k Then tab2(k) = tab2(k) + tabil(j) c = c + tabcost(j) Next k

x = 0 For j = 1 To m If tab2(j) <= tabplecak(j) Then x = x + 1 If c > c1 And x = m Then c1 = c tab1 = tablos If c1 = d Then Exit For Cells(6, 1).Resize(, n) = tab1 Range("C7").Value = c1 Application.ScreenUpdating = True Podobnie jak w poprzednich wypadkach rozwiązanie polega na losowej optymalizacji rozwiązania. W rozwiązaniu są wykorzystane tablice na których są wykonywane odpowiednie działania. Osoby zainteresowane dokładniejszym opisem proszę o kontakt. Na koniec rozwiążemy (bardziej jako ciekawostkę) w nieco nietypowy sposób klasyczny problem dotyczący znajdowania unikatów, szerzej o tym problemie można poczytać w jednym z wątków FAQ www.excelforum.pl 2. Rozwiązanie wykorzystuje funkcję Join (Arkusz unikaty). Zadanie 5. Znaleźć w określonym jednokolumnowym zbiorze danych unikaty. Rozwiązanie: Losowe Unikaty kolejno wyławia z zakresu z kolumny A makro (Arkusz unikaty): Sub LosoweUnikaty() Dim tbl(), x As Range Dim a&, i&, s&, m As String a = WorksheetFunction.CountA(Range("A:A")) Set x = Range("A2:A" & a) s = 1 For i = 1 To 10 * x.count If i = 1 Then ReDim tbl(1 To s) tbl(i) = Application.Index(x, Round(0.5 + x.count * Rnd, 0)) Else m = Application.Index(x, Round(0.5 + x.count * Rnd, 0)) 2 http://www.excelforum.pl/topics7/41-unikaty-vt22640.htm

If Join(tbl) Like "*" & m & "*" Then GoTo dalej: Else s = s + 1 ReDim Preserve tbl(1 To s) tbl(s) = m dalej: Range("B2:B" & a).clearcontents Cells(2, 2).Resize(UBound(tbl)) = Application.Transpose(tbl) Rozwiązanie polega na losowym wyławianiu Unikatów z ustalonego zakresu w kolumnie A. 1) Za pomocą funkcji Rnd oraz Arkuszowej funkcji Indeks następuje wylosowanie pewnego elementu z zakresu kolumny A. 2) Następnie zostaje sprawdzone za pomocą funkcji Join czy wylosowany element został wylosowany już wcześniej. Jeżeli wcześniej nie został wylosowany, to element zostaje dołączony do tablicy tbl przechowującej wylosowane kolejno unikaty. 3) Na koniec unikaty są wpisane do odpowiedniego zakresu kolumny B. 4) Może się zdarzyć, że nie wszystkie unikaty są wytypowane przez makro, ale jest to bardzo mało prawdopodobne. 5) Aby się zabezpieczyć przed wylosowaniem niewłaściwej liczby unikatów można wyliczyć tą liczbę unikatów i wykonywać makro do uzyskania odpowiedniej ilości elementów. W poprawie niniejszego artykułu pomógł mi Artik: www.excelforum.pl. Bibliografia: [1] Walkenbach J., Excel 2010 PL Programowanie w VBA, Helion, Gliwice, 2011 [2] Jabłoński D., Losowe wyszukiwanie rozwiązań, www.excelperfect.pl, 2011 Załącznik: losowe.wyszukiwanie.vba.xls