Excel szótár készítése VB segítségével
2009-09-16T20:17:12+02:00
2009-09-17T20:53:37+02:00
2022-07-25T10:46:21+02:00
  • Kipróbáltam, remekül működik!
    Nagyon szépen köszönöm a segítséget, hálám örökké üldözni fog! :)

    Hol tudlak pontozni?
    Mutasd a teljes hozzászólást!
  • Na, azért csak megvan Excel makróval és talán mindent tud, amit akartunk:
    Kicsit módosítottam, de szerintem a hosszú változónevek miatt érthető lesz és teleírtam megjegyzéssel is.

    Táblázat, nyelvenként külön számlálókkal, a szavak elején és végén aláhúzásjellel, hogy a szinonímákkal se legyen gond:
    angol magyar kérdeztem (angol) tudtad (angol) kérdeztem (magyar) tudtad (magyar)
    _dog_ _kutya_ 0 0 0 0
    _cat_ _macska_cica_ 0 0 0 0
    _lion_ _oroszlán_ 0 0 0 0
    _tiger_ _tigris_ 0 0 0 0
    _puppy_ _kiskutya_kölyökkutya_kutyakölyök_ 0 0 0 0


    Sub szotar() ' Nullára állítja a számlálókat sor = 2 While Cells(sor, 1) <> "" Cells(sor, 3).Value = 0 ' kérdeztem (angol) Cells(sor, 4).Value = 0 ' tudtad (angol) Cells(sor, 5).Value = 0 ' kérdeztem (magyar) Cells(sor, 6).Value = 0 ' tudtad (magyar) sor = sor + 1 Wend maxsor = sor - 1 ' utolsó kitöltött sor száma szo_sora = 2 Do ' Ciklus a kérdésekhez, kilépéshez *vége* választ kell beírni For i = 1 To 10 ' Ennyiszer fog a program új véletlenszámot generálni, ha olyan szót kérdezne, ami már volt és mindig tudtad kerdezett_nyelv = Int(2 * Rnd + 1) ' véletlenszám 1 vagy 2 If kerdezett_nyelv = 1 Then valasz_nyelv = 2 kerdeztem_oszlop = 3 tudtad_oszlop = 4 Else valasz_nyelv = 1 kerdeztem_oszlop = 5 tudtad_oszlop = 6 End If szo_sora = Int((maxsor - 1) * Rnd + 2) ' véletlenszám 2 - maxsor között ' ha ezt még nem kérdeztem, akkor megkérdezhető, tehát kilép a For ciklusból If Cells(szo_sora, kerdeztem_oszlop).Value = 0 Then Exit For ' ha kérdeztem, de nem tudtad, akkor megkérdezhető újra, tehát kilép a For ciklusból If Cells(szo_sora, tudtad_oszlop).Value < Cells(szo_sora, kerdeztem_oszlop).Value Then Exit For ' ha kérdeztem és mindig tudtad, akkor keressünk új szót, vagyis új véletlenszám kell ' de ha 10-szer ezt próbáltuk, akkor a For ciklusnak úgyis vége, vagyis mégiscsak megkérdezzük ezt a szót is If Cells(szo_sora, kerdeztem_oszlop).Value = Cells(szo_sora, tudtad_oszlop).Value Then szo_sora = Int((maxsor - 1) * Rnd + 2) Next ' az első "_" nélküli szövegben cseréli az "_"-t ", "-re, majd a legvégéről lehagy 2 karaktert: ' pl. _kiskutya_kölyökkutya_kutyakölyök_ cellaértékből kiskutya, kölyökkutya, kutyakölyök lesz kerdezendo_szo = Mid(Cells(szo_sora, kerdezett_nyelv).Value, 2) kerdezendo_szo = Replace(kerdezendo_szo, "_", ", ") kerdezendo_szo = Mid(kerdezendo_szo, 1, Len(kerdezendo_szo) - 2) ' bekérjük a választ valasz = InputBox(Cells(1, kerdezett_nyelv) + " szó: " + kerdezendo_szo, "Kilépéshez *vége* válasz kell") ' ha a válasz "*vége*", akkor kilépés a programból If valasz = "*vége*" Then Exit Do ' feldolgozzuk a beírt választ: ' a kérdeztem oszlopban növeljük a számlálót Cells(szo_sora, kerdeztem_oszlop).Value = Cells(szo_sora, kerdeztem_oszlop).Value + 1 ' a beírt válasz elejére és végére "_" jelet teszünk, mert így csak teljes szót talál meg az Instr() valasz = "_" + valasz + "_" ' ha a választott sor és választott nyelv szerinti cellában megvan a beírt szó, akkor elfogadjuk a választ If InStr(1, Cells(szo_sora, valasz_nyelv).Value, valasz, vbBinaryCompare) > 0 Then ' msgbox("Jó válasz!") ' Megnöveljük a tudtad oszlopban a számlálót Cells(szo_sora, tudtad_oszlop).Value = Cells(szo_sora, tudtad_oszlop).Value + 1 Else ' msgbox("Rossz válasz!") End If Loop End Sub

    Sok sikert a további próbálkozásaidhoz! Biztosan találsz benne javítható részt, vagy újabb ötleteket is lehetne még beletenni.
    Mutasd a teljes hozzászólást!
  • Majd próbálkozok Excel makróval is. Az én algoritmusommal nagyon ne foglalkozz, mert gyorsan összedobtam valamit, hogy legyen miből indulni. Pl. a sor változó már nem kell, a kérdés és a válasz összehasonlítása pedig azért InStr(), mert először úgy álltam neki, hogy egy szóhoz több válasz is lehet (ezt érdemes lenne majd beletenni, pl. a puppy lehet kiskutya, kölyökkutya, kutyakölyök, de egyenlőre hagyjuk, most nem kevertem bele az algoritmusba.)
    Másik probléma, hogy célszerű lenne nyelvenként a kérdeztem/tudtam értéket tárolni.

    Javasolt algoritmus:
    Ciklus
    kérdeztem, tudtad oszlopok nullára állítása
    Ciklus vége

    Kérdésekhez ciklus (adott számú kérdéshez For, egyébként While és valamivel majd kilépünk a ciklusból - pl. beírod válasznak hogy *vége*)

    véletlenszám a nyelv kiválasztásához (kérdés nyelve 1 vagy 2)
    véletlenszám a szó kiválasztásához
    ciklus, amíg megkérdezhető szót találunk vagy a próbálkozásaink száma túl sok volt (pl. for 1-től 100-ig)

    --- innentől jön az eldöntendő rész, amin még lehet agyalni...
    --- egy változat:
    ha még nem kérdeztük ezt a szót (a szó sorában a kérdeztem oszlop = 0 akkor ciklus vége, ezt a szót kérdezzük
    ha kérdeztük, de nem tudtad (tudtad<kérdeztem) akkor ciklus vége, ezt a szót kérdezzük
    ha a kérdezett szót mindig tudtad (kérdeztem=tudtad), akkor új véletlenszám a szó kiválasztásához

    --- agyalós rész vége, van egy olyan sorszám, ami a kérdezendő szó sorát tartalmazza, esetleg olyat kérdez, ami már volt
    ciklus vége

    ha kérdés nyelve = 1
    kérdezzük a választott sor, 1. oszlop szerinti szót
    ha válasz="*vége*" akkor kilépünk a ciklusból
    kérdeztem oszlopban az értéket növelni eggyel
    ha a kérdezett szó = válasz, akkor tudtad oszlopban értéket eggyel növelni, esetleg visszajelzést kiíni, hogy jó válasz
    (különben visszajelzés, hogy rossz válasz)

    ha a kérdés nyelve = 2
    kérdezzük a választott sor, 2. oszlop szerinti szót
    ha válasz="*vége*" akkor kilépünk a ciklusból
    kérdeztem oszlopban az értéket növelni eggyel
    ha a kérdezett szó = válasz, akkor tudtad oszlopban értéket eggyel növelni, esetleg visszajelzést kiíni, hogy jó válasz
    (különben visszajelzés, hogy rossz válasz)

    kérdés ciklus vége

    Sok sikert!!
    Mutasd a teljes hozzászólást!
  • HPeter!

    Huh, nagyon köszönöm a segítséget, ez már egy jó alapnak tűnik, bár kicsit át kell írnom, mert én az Excel VB szerkesztőjében akarom csinálni.

    Mivel nekem elég új a VB programozás, ezért először meg kell értenem az algoritmusodat és utána megváltoztatni. Alapdolgokat tudok, de az szerintem kevés egy ilyen programhoz.

    Ha lesz még rá időd, szívesen veszem a folytatást!
    Mégegyszer köszönöm!
    Mutasd a teljes hozzászólást!
  • Szia!
    Én csak kicsit ismerem a vbs-t, google-al ennyire jutottam, talán még folytatom, ha ráérek (tudom így még nem tudja az összes elvárást...)

    Hozz létre egy Excel fájlt és mentsd el (a nevét és mappáját a Set oMlap =... sorban javítsd ki):
    angol magyar kérdeztem tudtad
    dog kutya 0 0
    cat macska 0 0
    lion oroszlán 0 0
    tiger tigris 0 0

    Ezt .vbs kiterjesztéssel mentsd el:
    ' szotar .vbs Option Explicit dim oExcel, oMlap dim i, nyelvek(2), sor, szo dim maxsor, vszam, knyelv, vnyelv Set oExcel = CreateObject("Excel.Application") Set oMlap = oExcel.Workbooks.Open("c:\vbs\szotar.xlsx") nyelvek(1)=Trim(oExcel.Cells(1, 1).Value) nyelvek(2)=Trim(oExcel.Cells(1, 2).Value) maxsor=4 randomize() sor=2 for i=1 to 5 vnyelv=10*rnd() if vnyelv > 5 then knyelv=2 vnyelv=1 else knyelv=1 vnyelv=2 end if vszam=int(maxsor*rnd())+2 oExcel.Cells(vszam , 3).Value=oExcel.Cells(vszam , 3).Value+1 szo = InputBox(nyelvek(knyelv)+" szó: "+oExcel.Cells(vszam ,knyelv).Value) if instr(1, oExcel.Cells(vszam,vnyelv).Value, szo, 0) > 0 then msgbox("Jó válasz!") oExcel.Cells(vszam , 4).Value=oExcel.Cells(vszam , 4).Value+1 end if next oExcel.Quit WScript.Quit
    Mutasd a teljes hozzászólást!
  • Ha nekiállsz magad megoldani a feladatot és közben elakadsz, akkor segítünk neked itt a prog.hu-n tovább jutni, de egy komplett feladat megoldását (különösen a 3. pont miatt) ne várd itt.

    Ez nem egy 2 soros makró lesz és szerintem nem is az excel erre a legmegfelelőbb eszköz, bár abban is meg lehet kétségtelenül csinálni.
    Mutasd a teljes hozzászólást!
  • Ja, értem...oké.
    De azért nem kell az üzenetemet állásajánlatnak venni. Honorálni nem tudom, csak egy nagy köszönetnyilvánítást tudok felajánlani cserébe.

    Amúgy köszönöm az ötletet a függvényekkel, valamit megpróbálok ügyködni velük, hátha eljutok 1ről a 2re.
    Mutasd a teljes hozzászólást!
  • Nem.
    Adtál egy feladatleírást, hogy mit szeretnél.

    Ha te a vízszerelőnek azt mondod, hogy szerelje fel a mosdódat, akkor az munka.
    Ha esetleg megkérdezed, hogy mit vegyél meg a felszereléshez, akkor segít, hogy megmondja.

    ---
    Már át is repült
    Mutasd a teljes hozzászólást!
  • de szerintem ez így hamarosan az állás rovatban fog landolni.

    Ezt nem értem...
    Eszerint ennyire nehezet kérdeztem volna?
    Mutasd a teljes hozzászólást!
  • A 2. ponthoz még vb se nagyon kell.

    Kell egy darabteli() (hogy tudd hány szó pár van)
    Egy vél(), hogy sorsoljon egyet
    Egy fkeres(), (vagy index és match), hogy leellenőrizze a választ.

    A 3. pont már sezbb feladat...

    de szerintem ez így hamarosan az állás rovatban fog landolni.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Szeretnék egy egyszerű interaktív szótárt készíteni Excelben Visual Basic segítségével. A baj csak az, hogy én csak nagyon minimális szinten ismerem a VB-t.
    A következőképpen nézne ki:

    1. Két Excel oszlopból dolgozna a szótár: az egyik oszlop maga az idegen szónak, a másik a magyar jelentésnek.

    2. Elindításkor egy ablakban kérdezné a szót VÉLETLENSZERŰEN (beleértve azt is, hogy az idegent vagy a magyart kérdezi-e, ez is véletlenszerű), nekem pedig be kéne írnom a helyes választ. Eredményül pedig a "Helyes válasz!" vagy "Helytelen válasz!" üzeneteket adná, értelemszerűen attól függően, hogy jó-e az általam megadott válasz.

    3. A helytelen válaszokat (amiknek a jelentését ugye nem tudom), azokat gyakrabban kérdezné meg annak érdekében ugye, hogy jobban tanuljam meg ezeket a szavakat.

    Tulajdonképpen ennyi volna. Valaki meg tudja ezt csinálni esetleg Visual Basicben? Egy ismerősöm csinált egy ilyen szótárat, de sajnos már nem tudom őt elérni, hogy segítsen. Szerintem talán meg lehet csinálni, bár gondolom a nehézsége a véletlenszerűségen és azon van, hogy a rossz válaszokat gyakrabban kérdezze vissza.

    A segítségeteket előre is nagyon megköszönöm!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd