Office ez+az

15 views
Skip to first unread message

Nemeth Tibor

unread,
Apr 9, 2026, 1:53:14 PM (10 days ago) Apr 9
to elektr...@googlegroups.com
Hali!

Küzdök az Office-szal. Elő kellene állítanom egy tucat dokumentumot,
szinte azonos szöveggel, szerződések és pénzről is van bennük szó.
Ez az első problémám, hogy a 654321 -ből,
haszázötvennégyezer-háromszázhuszonegy is legyen. Erre találtam
megoldást, ChatGpt is segített. Először leltem egy pascal
forrásszöveget, Delphiben írtam belőle DLL-t meg hozzá tesztelő
programot, az ment jól. Gondoltam Excel VBA-ban írok függvényt ami a
DLL-re támaszkodik, ez nem jött össze. Feltételezésem szerint azért,
mert a pascal string és a VBA string máshogy néz ki a memóriában,
utóbbiról gőzöm sincs. Meg akartam kérdezni a tisztelt társulatot, de
aztán mégis ChatGpt lett belőle. Nem igazán értettem, azt állította a
pascal widestring áll a legközelebb, de ez kevés volt. Gondoltam egyet
és megkértem, hogy a pascal forrásszöveget tegye át VBA-ba és tökéletes
lett. Mivel ez a függvény talán másoknak is hasznos lehet levelem végére
bemásolom.
A második problémámra viszont nem találtam megoldást. A körlevél
generálás triviálisan adódik, erre való, de nekem nem nyomtatott
papírlapokat hanem hanem előírt nevű fájlokat kell előállítanom. A
körlevél összemördzsöli szépen, de egyetlen fájl lesz belőle. No erről
egész nap diskuráltam ChatGpt-vel és mindig voltak ötletei, de nekem
sajnos elfogytak a libáim. Amiket ajánlott, azoknak soha nem az volt az
eredménye amit szerettem volna. Első nekifutásra azt hittem sikerült,
megjelent a tucatnyi megfelelő nevű Word dokumentum fájl de nem néztem
át tüzetesen. Később kiderült, az összes fáj tartalmazza az összes
levelet összefűzve, tucatnyi különböző, de megfelelő név alatt. Utána a
sok ötletet kipróbáltam, de néha egy, néha tucatnyi fájl lett, de mindig
mindegyikben a teljes összefűzött tartalom volt.
Ez volt az első és talán a legjobb:
************VBA*********************
Sub KorlevelKulonFajlokba()

Dim i As Long
Dim doc As Document
Dim dataField As String
Dim outputPath As String

outputPath = "C:\Korlevelek\"

With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument

For i = 1 To .DataSource.RecordCount

.DataSource.ActiveRecord = i
.Execute Pause:=False

Set doc = ActiveDocument

' Fájlnév mezőből (pl. "Nev")
dataField = .DataSource.DataFields("DokuName").Value

' Mentés
doc.SaveAs outputPath & dataField & ".doc"
doc.Close False

Next i
End With

End Sub
*****************VBA vége***********************
Ez szinte jó, de minden, helyesen elnevezett, fájlban a teljes, tucatnyi
változat, tartalma benne van.

Ötletet kérek a javításhoz.

Üdv.
Németh Tibor

Számot betűkkel:
**********************Pascal**************************

function Azaz(const Mit: Int64): string;stdcall;
const
EgyesStr: array[0..9] of string =
('', 'egy', 'kettő', 'három', 'négy', 'öt', 'hat', 'hét', 'nyolc',
'kilenc');
TizesStr: array[0..9] of string =
('', 'tíz', 'húsz', 'harminc', 'negyven', 'ötven', 'hatvan', 'hetven',
'nyolcvan', 'kilencven');
TizenStr: array[0..9] of string =
('', 'tizen', 'huszon', 'harminc', 'negyven', 'ötven', 'hatvan',
'hetven', 'nyolcvan', 'kilencven');

procedure Alakit(var Maradek: Int64; Oszto: Int64; const Osztonev:
string);
var
Mit: integer;
begin
if Maradek >= Oszto then
begin
if Length(Result) > 0 then
Result := Result + '-';
Mit := Maradek div Oszto;
if Mit >= 100 then
Result := Result + EgyesStr[Mit div 100] + 'száz';
Mit := Mit mod 100;
if (Mit mod 10) <> 0 then
Result := Result + TizenStr[Mit div 10] + EgyesStr[Mit mod 10]
+ Osztonev
else
Result := Result + TizesStr[Mit div 10] + Osztonev;
end;
Maradek := Maradek mod Oszto;
end;
var
Maradek: Int64;
begin
Result := '';
if (Mit = 0) then
Result := 'Nulla'
else
begin
Maradek := Abs(Mit);
Assert(Maradek <= 999999999999);
Alakit(Maradek, 1000000000, 'milliárd');
Alakit(Maradek, 1000000, 'millió');
Alakit(Maradek, 1000, 'ezer');
Alakit(Maradek, 1, '');
Result[1] := UpCase(Result[1]);
if Mit < 0 then
Result := 'Mínusz ' + Result;
end;
end;


*********************Pacal vége**********************
*************VBA ChatGpt-től, ami jó is****************
Function Azaz(ByVal Mit As Double) As String
Dim EgyesStr(0 To 9) As String
Dim TizesStr(0 To 9) As String
Dim TizenStr(0 To 9) As String

EgyesStr(0) = ""
EgyesStr(1) = "egy"
EgyesStr(2) = "kettő"
EgyesStr(3) = "három"
EgyesStr(4) = "négy"
EgyesStr(5) = "öt"
EgyesStr(6) = "hat"
EgyesStr(7) = "hét"
EgyesStr(8) = "nyolc"
EgyesStr(9) = "kilenc"

TizesStr(0) = ""
TizesStr(1) = "tíz"
TizesStr(2) = "húsz"
TizesStr(3) = "harminc"
TizesStr(4) = "negyven"
TizesStr(5) = "ötven"
TizesStr(6) = "hatvan"
TizesStr(7) = "hetven"
TizesStr(8) = "nyolcvan"
TizesStr(9) = "kilencven"

TizenStr(0) = ""
TizenStr(1) = "tizen"
TizenStr(2) = "huszon"
TizenStr(3) = "harminc"
TizenStr(4) = "negyven"
TizenStr(5) = "ötven"
TizenStr(6) = "hatvan"
TizenStr(7) = "hetven"
TizenStr(8) = "nyolcvan"
TizenStr(9) = "kilencven"

Dim ResultStr As String
Dim Maradek As Double

If Mit = 0 Then
Azaz = "Nulla"
Exit Function
End If

Maradek = Abs(Mit)

Call Alakit(ResultStr, Maradek, 1000000000#, "milliárd", EgyesStr,
TizesStr, TizenStr)
Call Alakit(ResultStr, Maradek, 1000000#, "millió", EgyesStr,
TizesStr, TizenStr)
Call Alakit(ResultStr, Maradek, 1000#, "ezer", EgyesStr, TizesStr,
TizenStr)
Call Alakit(ResultStr, Maradek, 1#, "", EgyesStr, TizesStr, TizenStr)

' Első betű nagybetű
' ResultStr = UCase(Left(ResultStr, 1)) & Mid(ResultStr, 2)


If Mit < 0 Then
ResultStr = "Mínusz " & ResultStr
End If

Azaz = ResultStr
End Function


Private Sub Alakit(ByRef ResultStr As String, ByRef Maradek As Double, _
ByVal Oszto As Double, ByVal Osztonev As String, _
EgyesStr() As String, TizesStr() As String,
TizenStr() As String)

Dim Mit As Long

If Maradek >= Oszto Then
If Len(ResultStr) > 0 Then
ResultStr = ResultStr & "-"
End If

Mit = Int(Maradek / Oszto)

If Mit >= 100 Then
ResultStr = ResultStr & EgyesStr(Int(Mit / 100)) & "száz"
End If

Mit = Mit Mod 100

If (Mit Mod 10) <> 0 Then
ResultStr = ResultStr & TizenStr(Int(Mit / 10)) &
EgyesStr(Mit Mod 10) & Osztonev
Else
ResultStr = ResultStr & TizesStr(Int(Mit / 10)) & Osztonev
End If
End If

Maradek = Maradek Mod Oszto
End Sub

*************************VBA vége******************************





Jozef Gabulya

unread,
Apr 9, 2026, 3:18:23 PM (10 days ago) Apr 9
to elektr...@googlegroups.com
hello
Claude valaszolt :)

"Igen, klasszikus probléma. A MailMerge.Execute az összes rekordot
egyszerre fűzi össze egy új dokumentumba, nem csak az aktuálisan
beállított ActiveRecord-ot. Ezért kerül minden levél minden fájlba.

A megoldás: ne a MailMerge-t iteráld rekordonként, hanem az elkészült
összefűzött dokumentumot vágd szét utólag, vagy használj teljesen más
megközelítést.

Legjobb megközelítés: szétdarabolás után mentés

vba

Sub KorlevelKulonFajlokba()
Dim outputPath As String
outputPath = "C:\Korlevelek\"

Dim mm As MailMerge
Set mm = ActiveDocument.MailMerge

' Összes rekord egyszerre merge-elve -> egy összefűzött dok
With mm
.Destination = wdSendToNewDocument
.DataSource.FirstRecord = wdDefaultFirstRecord
.DataSource.LastRecord = wdDefaultLastRecord
.Execute Pause:=False
End With

' Az összefűzött dok az ActiveDocument most
Dim mergedDoc As Document
Set mergedDoc = ActiveDocument

Dim totalPages As Long
totalPages = mergedDoc.MailMerge.DataSource.RecordCount
' vagy: mergedDoc.ComputeStatistics(wdStatisticPages)

Dim i As Long
Dim newDoc As Document
Dim rng As Range

' Végigmegyünk oldalakon (1 rekord = 1 szakasz/section általában)
Dim sec As Section
i = 1
For Each sec In mergedDoc.Sections
' Szakasz tartalmát másoljuk új dokba
Set rng = sec.Range
' Az utolsó szakasz törésjele ne kerüljön bele
If i < mergedDoc.Sections.Count Then
rng.End = rng.End - 1
End If

Set newDoc = Documents.Add
newDoc.Range.FormattedText = rng.FormattedText

' Fájlnév: az eredeti adatforrásból
Dim fieldVal As String
mm.DataSource.ActiveRecord = i
fieldVal = mm.DataSource.DataFields("DokuName").Value

newDoc.SaveAs2 outputPath & fieldVal & ".docx", wdFormatXMLDocument
newDoc.Close False

i = i + 1
Next sec

mergedDoc.Close False
End Sub

Miért működik ez?

A MailMerge minden rekordból egy Section-t (szakaszt) csinál az
összefűzött dokumentumban. Tehát 12 rekord = 12 section. Ezeket
egyenként kimásoljuk egy-egy új dokumentumba, és az eredeti
adatforrásból (mm.DataSource) kiolvassuk a megfelelő fájlnevet.

Egy potenciális gond: ha a sablonodban már vannak section break-ek
(pl. fekvő oldal a végén), akkor a section-szám nem egyezik a
rekordszámmal. Ebben az esetben szólj, van erre is megoldás (oldalszám
alapú darabolás).

"

Jozsi

'Nemeth Tibor' via elektro-lista <elektr...@googlegroups.com> ezt
> --
> Azért kapta ezt az üzenetet, mert feliratkozott a Google Csoportok szolgáltatásbeli elektro-lista csoportra.
> Az erről a csoportról és az ahhoz kapcsolódó e-mailekről való leiratkozáshoz küldjön egy e-amailt a(z) elektro-list...@googlegroups.com címre.
> A beszélgetés megtekintéséhez látogasson el ide: https://groups.google.com/d/msgid/elektro-lista/ba86ec0a-9b09-45a2-a75c-88196982a895%40t-online.hu.

Nemeth Tibor

unread,
Apr 9, 2026, 4:51:27 PM (10 days ago) Apr 9
to elektr...@googlegroups.com
Hali!

Köszönöm.
Ma sokat gyötrődtem ezze és már leragad a szemem, de holnap kipróbálom.
Amúgy meg ráéreztél, van a végén egy fekvő lap.
Most beérném azzal is ha konstansként benne lenne a programban, hogy egy
fájlba megy 2 section amből az első két lapos a második 1 lapos.
Ha még egyszer az életben hasonló helyzetbe kerülnék, majd átírom,
feltéve, hogy emlékezni fogok rá.

Üdv.
Németh Tibor

orbana

unread,
Apr 10, 2026, 3:55:10 AM (10 days ago) Apr 10
to 'Nemeth Tibor' via elektro-lista
Szia!

A Libreoffice tudja mindenféle programozás nélkül a körlevél külön
fájlokba mentést.

Feltételezve, hogy a körlevél dokumentum már kész:
Nyomtatás - (feldobja, hogy körlevél? Válasz igen) - a többi innentől
szerintem egyértelmű.

Üdv: Árpi

orbana

unread,
Apr 10, 2026, 4:24:09 AM (10 days ago) Apr 10
to elektr...@googlegroups.com
Még egy a kérdésed másik feléhez:

A Libreoffice Calc tudja a szám-szöveg átalakítást is, igaz telepíteni
kell hozzá bővítményt (numbertext).

=numbertext(654321,"hu") --> hatszázötvennégyezer-háromszázhuszonegy

Árpi

Nemeth Tibor

unread,
Apr 10, 2026, 4:44:21 AM (10 days ago) Apr 10
to elektr...@googlegroups.com
Hali!

Köszönöm a csábító javaslatokat. Nem tudom most hol tart a LibreOffice,
de sajnos nem az én döntésem miféle dokumentumokkal kell foglalkoznom és
az aktuális problémám sem tőlem ered, a másik fél MsOffice-t használ.
Vagy húsz éve is van már amikor próbálkoztam, az talán még OpenOffice
volt, és nagyjából működtek is a dolgok, de amikor kaptem e-mailben egy
eredetileg Wordben szerkesztett dokumentumot, nem tudtam kezelni, mert a
szerző képet helyezett az élőlábba, én meg nem mondhattam, hogy ez
perverzió, bár megértettem, hogy az OpenOffice fejlesztői erre még nem
gondoltak. Tehát nem azért MS mert lelkes híve vagyok, sőt!, de
rákényszerülök a többség akaratára.
Azért majd kipróbálom, bebootolok Linuxba, ott van Libre.

Üdv.
Németh Tibor

orbana

unread,
Apr 10, 2026, 5:33:09 AM (9 days ago) Apr 10
to elektr...@googlegroups.com
Szia!

Tény, hogy kompatibilitási gondok vannak, de tapasztalatom szerint egyre
kevesebb.

Kipróbáláshoz van portable változat is:
https://www.libreoffice.org/download/portable-versions/

Esetleg próbáld meg az eredeti word fájlt megnyitni, és csak a fájlba
mentést csinálni writerben, hátha :)
Vagy csak a dokumentumot módosítani, hogy jó legyen Libreofficeban,
lehet kevesebb munka, mint basicben programozni.

Én egyébként Windows XP-n használom :)
Igaz, hogy már régi (felhagytak az xp támogatásával érthető okokból
<sajnos>):
<https://downloadarchive.documentfoundation.org/libreoffice/old/5.4.7.2/>
Ezen a verzió már nem telepíti a numbertex-et (hibát dob, gondolom épít
valami újabb funkcióra), a körlevél viszont megy, ezzel a verzióval
próbáltam ki.

Árpi

gyapo

unread,
Apr 10, 2026, 10:25:23 AM (9 days ago) Apr 10
to elektr...@googlegroups.com
April 10, 2026 11:33 orbana, you wrote:
o> Tény, hogy kompatibilitási gondok vannak, de tapasztalatom szerint egyre kevesebb.

Még lehet próbálkozni más formátummal, amit az m$ és a libre is
egyformán kezel. Vagy ha nem tovább feldolgozásra készül a kimenet,
akkor pdf, eps, html valamilyen lapleíró nyelv, hogy a felhasználónál
is ugyanúgy nézzen ki.

Üdv.: gyapo

Reply all
Reply to author
Forward
0 new messages