Üdvözletem! A következő feladatot szeretném megoldani LibreOffice használatával. Adott egy táblázat, benne 2 oszlop. Az oszlopokban szövegek vannak, nem csak egy egy szó:
'Mező1' 'Mező2'
'Szöveg 1' 'Mondatok 1'
'Szöveg 2' 'Mondatok 2'
'Szöveg 3' 'Mondatok 3'
Összesen több, mint 100 sor.
Szeretnék létrehozni dokumentumokat, amikben a szöveg néhány helyen a Mező1 és Mező2-ből kerül legenerálásra, automatikusan. Tehát olyan dokumentumokat szeretnék, ahol ez olvasható:
1. doksi: "A feladatod, hogy elemezd 'Szöveg 1' szerkezetét és írd le a 'Mondatok 1' tartalmát a lapra."
2. doksi: "A feladatod, hogy elemezd 'Szöveg 2' szerkezetét és írd le a 'Mondatok 2' tartalmát a lapra."
satöbbi. (Igen, hallgatóknak szeretnék dolgozatokat generálni.)
Az hiszem, hogy a körlevél gyártás mintájára ezt meg lehet oldani, de eddig nem jöttem rá hogyan. Addig eljutottam, hogy csináltam egy adatbázist, ahol az adatok szépen ott vannak a Mező1 és Mező2 nevű oszlopokban. De innen nem sikerült kitalálni, hogy hogyan generálom le a dokumentumokat.
Bónusz kérdés: lehetséges valami olyan form-ot csinálni, ahol beírom, hogy 20 dokumentumra van szükségem, és az az adatbázisból kiválaszt 20 random sort, és legenerálja a feladatlapokat?
Tudna valaki segíteni? Előre is köszönöm,
Csaba
- 8679 megtekintés
Hozzászólások
Nem gondoltam, hogy ilyen nehéz probléma... Hátha jön még ötlet.
Csaba
- A hozzászóláshoz be kell jelentkezni
Én Calc-ban csináltam ilyet, felesleges hozzá a Base. Makrót kell hozzá írni.
Egyik lapon Egyik oszlopban mező1, másikban mező2 tartalma, harmadik oszlopba hogy mennyit generáljon (ha több sorod lenne, mint hallgató). A következő munkalapra pedig megfelelően bepozícionálva íratható a feladatsor.
Sajnos még nem volt időm előkeresni a régi makróimat (egy LO frissítésnél eltűntek), de el vannak mentve. Én matek, fizika és infó feladatlapokat csináltam velük javítókulccsal együtt (vicces volt látni a fejeket egy osztályban, amikor mindenki névre szóló feladatsort kapott, teljesen más adatokkal, feladatokkal, nekem meg mivel le lett generálva a megoldókulcs is, így csak névsorba kellett raknom, s ugyan úgy javíthattam).
Egyébként nem nagy dolog. Neten kicsit utánaolvasva, egy délelőtt alatt megvan a makróírás.
- A hozzászóláshoz be kell jelentkezni
Értem, köszönöm. Sajnos makrózásban nem vagyok igazán penge.
Csaba
- A hozzászóláshoz be kell jelentkezni
Mikorra kell? Ha átdobod az eredeti ods-t (elég 1-2 sor mintának, hogyan lássam hogyan néz ki), akkor lehet megcsinálnám. Meg mondjuk egy mintadolgozatot, hogy milyenre kell kihoznom.
- A hozzászóláshoz be kell jelentkezni
Kicsit más feladathoz, de engem is érdekelne a megoldás.
- A hozzászóláshoz be kell jelentkezni
Milyen stílusúhoz (feltéve, hogy publikus)? Én pl. elméleti kérdéssort így állítottam össze.
- A hozzászóláshoz be kell jelentkezni
Hivatalos irat generálásához gondoltam átalakítani, olyan esetekben amikor a körlevél funkció már nem elég.
- A hozzászóláshoz be kell jelentkezni
Kösz, ez nagy segítség lenne. Sajnos ki van kapcsolva a PM nálad, így nem tudok emailt írni.
Csaba
- A hozzászóláshoz be kell jelentkezni
PM küldés bekapcsolva. A hétvégén előkotrom a makrókat.
- A hozzászóláshoz be kell jelentkezni
Szerintem a probléma első fele klasszikus körlevél készítési feladatként kezelhető, nem kell hozzá semmit makrózni:
http://szabadut.fsf.hu/oktatas/oktatovideok/writer-videok/korlevel-kesz…
A random adatmintát meg a Calc RANDBETWEEN függvényével elő lehet állítani, majd egy másik körlevél adatforrásaként felhasználni.
https://help.libreoffice.org/Calc/Mathematical_Functions/hu#RANDBETWEEN
- A hozzászóláshoz be kell jelentkezni
Igen, ez az, nagyon köszönöm! A videó minden problémámat megoldotta, így már meg tudom csinálni.
Üdv,
Csaba
- A hozzászóláshoz be kell jelentkezni
Minimális makrózást használó megoldás. A munkafüzet egy új ikont tartalmaz a nyomtatás mellett, amire (a makrók engedélyezése, és a biztonsági szint alacsonyabbra állítása után) kattintva megkérdezi, hány véletlen feladatlapot nyomtasson (a nagyobb biztonság miatt érdemes a makrókat az állományból a LibreOffice makrók közé másolni).
Az első munkafüzetlap tartalmazza az adatokat, a második (a nyomtatandó feladatlap) a rá való hivatkozásokat, amely az F9 lenyomásával véletlen értékekkel frissíthető. A makrózásra, plusz ikonra csak azért volt szükség, mert nem találtam arra lehetőséget, hogy több példány nyomtatásánál menet közben is frissítse a nyomtatott lapot a LibreOffice. A makró bekér egy számot, majd annyiszor hívja meg a makrórögzítéssel felvett F9 (frissítés) és alapértelmezett nyomtatás műveleteket. A tényleges makróírás tehát csak egy adatbekérő InputBoxot tartalmazó ciklus volt, és jó esetben erre sem lett volna szükség. A felhasznált Calc függvények: COUNTA, RAND, INT, INDIRECT, a két első sor nem kerül nyomtatásra a formázás miatt (Cellavédelem » Nem nyomtatható).
- A hozzászóláshoz be kell jelentkezni
Köszönöm, legalább lehetőségem van megnézni, hogy néz ki egy ilyen makró.
Csaba
- A hozzászóláshoz be kell jelentkezni
Igen, ez az, nagyon köszönöm! A videó minden problémámat megoldotta, így már meg tudom csinálni.
Üdv,
Csaba
- A hozzászóláshoz be kell jelentkezni
sub
- A hozzászóláshoz be kell jelentkezni
A Csabának írt makró publikus részei (a Main-t kell futtatni, a másik kettő függvény):
REM **************
REM Az utolsó foglalt sor indexét adja vissza egy oszlopban
REM -1-gyet ad vissza, ha minden oszlop üres
REM **************
Function LastRowIndex (InformedColumn, Optional InformedSheet) as long
Dim oSheet As Object, C as Long
Dim oColumn As Object, oFinder As Object, oResult as object
Dim PartsOfTheName
'------- Munkalap -------
If IsMissing(InformedSheet) then
oSheet = ThisComponent.CurrentController.ActiveSheet
ElseIf IsNumeric(InformedSheet) then
oSheet = ThisComponent.Sheets(InformedSheet)
Else
oSheet = ThisComponent.Sheets.GetByName(InformedSheet)
End If
'------- Oszlop -------
If Not IsNumeric(InformedColumn) then
Dim AllColumnNames (0 to 1023)
AllColumnNames = oSheet.Columns.ElementNames
For i = 0 to 1023
If AllColumnNames(i) = UCase(InformedColumn) then
C = i
End If
Next
Else
C = InformedColumn
End If
'------- Keresés -------
oColumn = oSheet.Columns(C)
oFinder = oColumn.createSearchDescriptor
oFinder.searchRegularExpression = true
oFinder.SearchString = "."
oResult = oColumn.FindAll(oFinder)
'------- Sor index -------
If Not IsNull(oResult) then
ResultName$ = oResult.AbsoluteName
PartsOfTheName = Split(ResultName,"$")
LastRowIndex = Val(PartsOfTheName(ubound(PartsOfTheName))) - 1
Else
LastRowIndex = - 1
End If
End Function
REM *********
REM "véletlen szám" generátor
REM *********
Function GetRnd (maxValue)
Dim min,max,r,Count,Good as Boolean
min=1 : max=maxValue
Dim array(max-1)
Do
Do
Repeat:
r = Int(Rnd() * (max - min + 1)) + min
If r = max + 1 then goto Repeat
Good = true
For c = 0 to Count
If array(c) = r then
Good = false
EndIf
Next c
Loop While Good = false
array(Count) = r
Count = Count +1
Loop While Count < max
'A permutációt string-ben adja vissza, ahol a számok ;-vel vannak elválasztva
For c=0 to max-1
s = s & array(c) & "; "
Next
GetRnd = s
End Function
REM ***** Ez a meghívandó eljárás *****
Sub Main
Dim lastData, createdExam, currentLine As Integer
Dim Doc As Object
Dim oSheet, iSheet, oCell, iCell As Object
lastData = LastRowIndex(0, "Data") + 1 'a "Data" munkafüzetben az A oszlopra hivatkozik
createdExam = 20 'itt adod meg, hogy mennyi feladatsort generáljon
Doc = ThisComponent
Dim MyString As String
oSheet = Doc.Sheets(0)
iSheet = Doc.Sheets(1)
oRows = oSheet.getRows()
genPermutation = Split(GetRnd(lastData), ";")
count = 0
For c = 0 to (createdExam-1)
currPos = c + 3 * count '3 soronként kezdi újra a beírt szöveget, ha több diksit akarsz generálni
oCell = oSheet.getCellByPosition(0, currPos)
oCell.setString("Itt kiírattam egy szöveget")
oCell = oSheet.getCellByPosition(0, currPos+2)
Randomize
currentLine = genPermutation(c)
iCell1 = iSheet.getCellByPosition(0, currentLine - 1)
iCell2 = iSheet.getCellByPosition(1, currentLine - 1)
Randomize
MyString = "Itt beszúrta az egyik értéket: " + iCell1.String + ", itt a másikat: " + iCell2.String +"."
oCell.setString(MyString)
count = count +1
oRow = oRows.getByIndex(currPos+2)
oRow.isManualPageBreak = True 'itt beszúrt egy sortörést, hogy a következő feladatsor új oldalra kerüljön nyomtatáskor
Next
End Sub
Használjátok egészséggel!
- A hozzászóláshoz be kell jelentkezni