Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
Segítségre lenne szükségem, kérlek, szánjatok rám pár percet.
Az alábbiakban felvázolnám, mit is szeretnék.
- az „A” oszlopban értékek vannak;
- a „B” oszlopban az előbbi értékek megnevezései;
- egy tetszőleges cellában pedig egy változó szám;
- a cél az, hogy az „A” oszlopból olyan cellákat válogassunk ki, melyek értékeivel a lehető legjobban megközelítsük (alulról) a tetszőleges cellában levő értéket és egy felsorolásban láthassuk azon értékek megnevezéseit, melyekkel meg tudtuk ezt valósítani.
Egy példával talán még szemléletesebb lesz:
Van egy nagy zsákunk, melynek köbtartalma a tetszőleges cellában van megadva.
Hogyan lehet a lehető legjobban kitömni ezt a nagy zsákot az „A” oszlopban megadott köbtartalmú valamikkel úgy, hogy tudjuk, melyek voltak azok a valamik?
Feltöltöttem az alábbi fájlt, talán ez egyértelműbb:
Köszönöm. Egyébként én nem konkrétan erre emlékszem, de ebben van is van "olyan" amit írtam. Úgy emlékszem, hogy az egérkurzoros / füles módszer makró nélkül volt megvalósítva.
Azt a lapot, ami a "makróval", vagy valami hasonló névre hallgat, töröld ki, én már megtettem. Körülményes, sokkal jobb módszerekkel lehet létrehozni dinamikus diagramokat. A laphoz tartozó makrót is száműztem.
A véletlenszám ismétlődésének elhanyagolható az esélye. Nálad 1/10^6, nálam 1/10^15. De azért előfordulhat mindkét módszernél. A hatásuk azonban eltérően fog megnyilvánulni. Nálad HIÁNYZIK hibaüzenettel, ami ezért pillanatok alatt kiderül, amit aztán manuálisan lehet korrigálni. Nálam viszont nem lesz semmi jele, csak az egyik betűből több lesz mint kéne, a másikból meg kevesebb. Ezért ha biztos akarok lenni, hogy pontos volt-e a kiosztás minden betűre kell csinálni egy darabtelit. És hiba esetén manuálisan javítani.
Köszi, persze a ha feltétel része "csak nagyzolásból (elnézést)" maradt így, az A1=1 helyett (de ha már tudjuk, miért ne terjesszük?).
Másrészt a véletlen számok generálásakor előfordulhat egy ilyen nagyobb halmazban is az ismétlődés, ami azonos sorszámot eredményezhet és azt már megint kezelni kell tudni.
Na tessék! Azt hittem a szétválasztó jelzővel a megértést segítem, oszt csak megkevertelek vele. Szóval semmi különös. Adatok/rendezés majd az 1/0 oszlop kiválasztása. És kész. (Ha nem ismernéd a rendezést, nézd meg súgóban. Alapvető funkció)
Egyébként azért írtam, hogy szétválasztó, mert a sorbarendezés az 1 és 0-kat szétválasztja.
Még ha a véletlenszámok 1 és 1 millió közé konvertálása feleslegesnek is tűnik. De véleményem szerint a megoldásod eleganciáját biztosító 3 plusz rafinéria nem kezdőknek való. Mivel közülük az egyiket, a =HA(A1 feltétel értelmezését én is csak napokban tanultam meg, ha jól emlékszem épp tőled. Tehát még nem épült be a napi rutinomba. Ezen kívül a sor()-t sem szeretem, mert nálam sor()-10 kéne használnom, mivel a táblázataim default a 11-ik sortól kezdődnek. Egyébiránt én is láttam sorbarendezés nélküli megoldást, csak én az 1/0 oszlop celláit számoztam volna be a G oszlopodban a
=HA(a1=0;0;vel()) képlet véletlenszámain keresztül, majd az alábbi függvénnyel osztottam volna ki a betüket:
=ha(a1=1;index($E:$E;g1-Darabteli($A:$A;0);1);"")
De ennek megoldásnak a magyarázása komplikáltabbnak tünt. Így jobbnak láttam a sorbarendezős változat felrakását.
1. egy oszlopba szépen sorban beírjuk a szükséges W,X,Y,Z értékeket
2. a mellette levő oszlopba generálunk véletlen számokat 1 és 1 millió között (azért, hogy minél kisebb legyen az esélye az azonos szám keletkezésének).
3. mellette levő oszlopba a sorszám függvénnyel meghatározzuk a véletlen számok sorrendjét.
4. Ha az A oszlopban vannak a 0-1-ek, az E oszlopba tettük a W,X,Y,Z értékeket, akkor a G oszlopba esik a sorszám,
Meg lehet ugyan csinálni egyszerűbben is, de így talán könnyebb lesz megértened az algoritmus elvét, amit aztán szabadon variálhatszt:
Az 1 és 0 cellák szétválasztása sorbarendezéssel. Hogy vissza tudd majd állítani a kezdeti sorrendjüket számozd be a cellákat a mellettük levő oszlopban, és ez az oszlop is rendeződjön a szétválasztó rendezéssel.
Az 1-k mellé tegyél egy véletlenszámot a vél() fgv.-nyel.
A következő oszlopban határozd meg hogy hanyadikok a rangsorban a SORSZAM függvénnyel.
100-s mintán teszteltem, pontosan annyit osztott szét, mint kellett...
Vigyázz, próbálkozások előtt a B oszlopot (ahova az WXYZ-t írja a program) ki kell üríteni
Function veletlen(p_ig) As Integer veletlen = Int(Rnd() * p_ig) + 1 End Function
Sub proba(p_db As Long, p_szaz As Integer, p_kar As String) Dim v_db As Long Dim v_szaz As Integer v_db = p_db v_szaz = p_szaz Randomize Do While v_db > 0 For i = 1 To 48000 ' vagy amennyi elem van az oszlopban If Cells(i, 1).Value = 1 And Cells(i, 2).Value = "" Then If veletlen(100) < v_szaz Then Cells(i, 2).Value = p_kar v_db = v_db - 1 If v_db = 0 Then Exit Sub End If End If End If Next i v_szaz = 2 * v_szaz '' ha nem használtuk el az összes ilyen karaktert, akkor újra próbálkozunk nagyobb valószínűséggel Loop
End Sub
Sub hivo() Call proba(2880, 6, "X") Call proba(5760, 12, "W") Call proba(9120, 19, "Y") Call proba(30240, 63, "Z") End Sub
Valamelyikőtök (Talán Delila) mutatott itt olyan dinamikus diagramot, aminek "fülei" voltak és a fülek felett tartva az egérkurzort, megjelent egy másik diagram.
Keresgélek, de eddig nem találtam, nincs valakinél lementve egy link esetleg? Már fentiekből kiderül mire gondolok...