Nemeth Tibor
unread,Apr 9, 2026, 1:53:14 PM (10 days ago) Apr 9Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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******************************