Option Explicit Option Base 1 Dim para As Paragraph Dim Doc As Document Dim ParaIndex As Integer Dim osszesbekszam As Integer Dim bekszam As Integer Dim oldszam As Integer Dim b As Boolean Dim eloltorles As Boolean Dim sormagassagelol As Single Dim sormagassaghatul As Single Dim tombszam() As Integer 'A törölhető bekezdések számának tárolására. Dim tombindex As Integer 'A mindenkori tömbméret. Dim tombertek() As Single 'A törölhető bekezdéseket követő bekezdés térközének tárolására. Dim NemTorhetoSzokozMerete As Single Dim X As New EventClassModule Sub Register_Event_Handler() Set X.App = Word.Application End Sub Sub FormaiJavito() ' ' FormaiJavito Makró ' Rögzítés: 2008.12.22., készítő: dr. Száraz György
' 'Csak olyan, egy szakaszból álló, dokumentumokra alkalmas, amelyek nem tartalmaznak táblázatot! 'Csak olyan bekezdés törölhető, még karakterek hiányában is, amelyben nincs 'függőleges Tab vonal, nincs szegélyezve, s nincs mintázata. 'Ezért ezeket külön függvényekben ellenőrizzük. 'A teljes bekezdés törlését kölön menetben kell csinálni, mert különben a ciklus megbolondul. Set Doc = ActiveDocument oldszam = 1 tombindex = 0 'Az utolsó bekezdést külön vizsgáljuk: 'A térközök változását tömbbe kell tenni, s nem azonnal a bekezdéshez hozzárendelni, 'mert különben megváltozik a laptörés. 'Az első bekezdésnél az előtte lévő térközt figyelembe veszi a program! 'Ezért a törölt bekezdés térközeit az utána következő bekezdéshez rendeljük hozzá. 'De külön kell választani a tömbbe íráskor a törlendő bekezdésszám és az utána jövő bekezdés előtti térköz 'beírását, mert a törlendő utáni bekezdés elejéről még a későbbiekben lehet, hogy törlünk! 'Következik a törölhető bekezdések számának tömbben való rögzítése: bekszam = 1 'Vizsgálat az 1. bekezdéstől az utolsó előttiig: osszesbekszam = Doc.Paragraphs.Count bekszam = 0 For Each para In Doc.Paragraphs bekszam = bekszam + 1 If bekszam <> osszesbekszam Then If Torolheto(para) Then
tombindex = tombindex + 1 ReDim Preserve tombszam(tombindex) As Integer tombszam(tombindex) = bekszam Next para 'Következik a törölhető bekezdések utáni bekezdés elől lévő térközének tömbben való rögzítése: If tombindex <> 0 Then ReDim Preserve tombertek(tombindex) As Single For ParaIndex = 1 To tombindex tombertek(paraindex) = alsobekterkozeelol(paraindex) Next ParaIndex 'Következik a törölhetők utáni bekezdések térközének módosítása: 'Ha laptörés jellel kezdődik a bekezdés, akkor nem módosítjuk a térközét! For ParaIndex = tombindex To 1 Step -1 Set para = Doc.Paragraphs(tombSzam(ParaIndex) + 1) If Asc(para.Range.Characters.First) <> 12 Then para.spacebefore = tombertek(paraindex) Next ParaIndex 'Következik az üres bekezdések törlése. 'A törlést a dokumentum vége felől kell kezdeni, mert különben összezavarodik a bekezdések számozása. For ParaIndex = tombindex To 1 Step -1 Doc.Paragraphs(tombSzam(ParaIndex)).Range.Delete Next ParaIndex
'Utolsó bekezdés vizsgálata: 'A törlések miatt az utolsó bekezdés száma változott: bekszam = Doc.Paragraphs.Count osszesbekszam = bekszam Set para = Doc.Paragraphs(bekSzam) If Torolheto(para) Then para.range.delete End Sub Function Torolheto(bekezdObj As Paragraph) As Boolean Dim s As String Dim n As Integer Torolheto = False If NemMintazott(bekezdObj) = False Then If vankeret(bekezdobj) = True Then b = kitoltokarnincs(bekezdobj) bekezdobj.range.select If ujoldalon() = True Then
If (soroktorleseutankarszam() = 1) And (fuggvonalnincs(bekezdobj)) Then bekezdobj.spacebefore = terkozelol() Torolheto = True ElseIf eloltorles Then bekezdobj.spacebefore = terkozelol() Function soroktorleseutankarszam() As Integer 'Az utolsó sorvége jel törölhető, ha nincs nyomtatható karakter a sorban. Vigyázat a törölt sorok számával! 'Az elejétől kezdve is törölhető a sor, ha sor vége jelet tartalmaz, 's előtte nincs nyomtatható karakter. Dim s As String Dim KarSzam As Integer Dim NemTorhetoSzokozHelye As Integer eloltorles = False sormagassagelol = 0 sormagassaghatul = 0 'A bekezdés vizsgálata elölről: Csak addig vizsgáljuk a bekezdést, amíg törölhető sorokat találunk. 'Ha egy sor nem törölhető, utána abbahagyjuk az elölről való vizsgálatot. Do Selection.Collapse Selection.MoveEnd Unit:=wdLine, Count:=1 s = Selection.Text 'De vigyázat: ha a nem törhető szóköz karakter mérete eltér a bekezdés vége vagy sorvége jel méretétől, a sor 'magasság mind növekvő, mind csökkenő irányban átveszi a legnagyobb méretű nem törhető szóköz méretét!
'Külön programrészben kell megállapítani a legnagyobb méretű nem törhető szóköz méretét. De ha a bekezdés 'pontos sorközre van állítva, akkor ez az érték a döntö, s ekkor az 1,153-as szorzó sem kell! NemTorhetoSzokozHelye = InStr(s, Chr(160)) NemTorhetoSzokozMerete = 0 Do While NemTorhetoSzokozHelye <> 0 NemTorhetoSzokozMerete = Max(Selection.Characters(NemTorhetoSzokozHelye).Font.Size, NemTorhetoSzokozMerete) s = Replace(s, Chr(160), " ",, 1) 'Nem törhető szóköz első előfordulása szóközre cserélve NemTorhetoSzokozHelye = InStr(s, Chr(160)) Loop 'Ha a sorban csak szóközök és Tabulátor billentyűzések vannak, akkor a sor magasságát a sorvége vagy a 'bekezdés vége jel határozza meg. Ezek csak úgy törölhetők, ha helyükre azonos méretű karaktert teszünk. 'De ha nemtörhető szóköz is van, akkor ennek mérete a meghatározó! s = Trim(s) If b Then s = Replace(s, Chr(9), " ") 'Tabulátor szóközre cserélve s = Trim(s) KarSzam = Len(s) If (KarSzam = 1) Then If Asc(Right(s, 1)) = 11 Then 'A sor törölhető: eloltorles = True sormagassagelol = sormagassagelol + Sormagassag(Selection) Selection.Delete KarSzam = 0 ElseIf Asc(Right(s, 1)) = 13 Then
'Üres a bekezdés, azaz törölhető soroktorleseutankarszam = 1 NemTorhetoSzokozMerete = 0 Loop Until KarSzam >= 1 'A ciklus akkor ismétlődik, ha KarSzam = 0. 'A bekezdés vizsgálata hátulról: 'Ha ide jut a vezérlés, a bekezdés már nem lesz törölhető! para.range.select s = Selection.Text Do While Asc(Right(s, 2)) = 11 sormagassaghatul = sormagassaghatul + Sormagassag(Selection) 'A sorvége jelet tartalmazó sor magassága. Selection.Characters.Last.Previous.Delete s = Selection.Text Loop 'Az elölről és hátulról végzett vizsgálatok vége. soroktorleseutankarszam = Len(s) If bekszam <> osszesbekszam Then Doc.Paragraphs(bekSzam).SpaceAfter = Max(Doc.Paragraphs(bekSzam + 1).SpaceBefore, Doc.Paragraphs(bekSzam).SpaceAfter) + sormagassaghatul Function NemMintazott(bekezdesObj As Paragraph) As Boolean Dim b As Boolean
Dim F As Boolean Dim T As Boolean Dim mintazat As Shading Set mintazat = bekezdesobj.format.shading b = (mintazat.backgroundpatterncolor = wdcolorautomatic) F = (mintazat.foregroundpatterncolor = wdcolorautomatic) T = (mintazat.texture = wdtexturenone) NemMintazott = b And F And T Function vankeret(bekezdesobj As Paragraph) As Boolean Dim szegelyforma As ParagraphFormat Set szegelyforma = bekezdesobj.format vankeret = True If szegelyforma.borders(wdbordertop) = True Then If szegelyforma.borders(wdborderbottom) = True Then If szegelyforma.borders(wdborderleft) = True Then If szegelyforma.borders(wdborderright) = True Then
vankeret = False Function ujoldalon() As Boolean Dim ujoldszam As Integer ujoldszam = Selection.Information(wdActiveEndPageNumber) If oldszam = ujoldszam Then ujoldalon = False Else oldszam = ujoldszam ujoldalon = True Function kitoltokarnincs(bekezdesobj As Paragraph) As Boolean Dim b As TabStop Dim c As Boolean Dim tabszam As Integer Dim i As Integer tabszam = bekezdesobj.tabstops.count If tabszam > 0 Then For i = 1 To tabszam Set b = bekezdesobj.tabstops(i)
c = b.customtab If c = True And (b.leader <> wdtableaderspaces) Then kitoltokarnincs = False Next i kitoltokarnincs = True Function fuggvonalnincs(bekezdobj As Paragraph) As Boolean Dim b As Boolean Dim tabszam As Integer Dim i As Integer tabszam = bekezdobj.tabstops.count If tabszam > 0 Then For i = 1 To tabszam b = (bekezdobj.tabstops(i).alignment = wdaligntabbar) If b = True Then fuggvonalnincs = False Next i fuggvonalnincs = True
Function alsobekterkozeelol(tombfutoindex) As Single Dim torlendobekszam As Integer torlendobekszam = tombszam(tombfutoindex) Dim torlendobekezdes As Paragraph Set torlendobekezdes = Doc.Paragraphs(torlendoBekSzam) torlendobekezdes.range.select 'Az eredményt nem bekezdéshez rendelni, hanem tömbbe tenni! If tombszam(tombfutoindex) <> 1 Then 'Nem első bekezdés If tombfutoindex <> 1 Then If torlendobekszam - 1 = tombszam(tombfutoindex - 1) Then 'Ha egy törölhető bekezdést közvetlenül követő bekezdés törléséről van szó. alsobekterkozeelol = tombertek(tombfutoindex - 1) + Max(torlendoBekezdes.SpaceAfter, Doc.Paragraphs(torlendoBekSzam + 1).SpaceBefore) + Sormagassag(Selection) alsobekterkozeelol = Max(Doc.Paragraphs(torlendoBekSzam - 1).SpaceAfter, torlendobekezdes.spacebefore) + Max(torlendoBekezdes.SpaceAfter, Doc.Paragraphs(torlendoBekSzam + 1).SpaceBefore) + Sormagassag(Selection) Else 'Első bekezdés
alsobekterkozeelol = Max(Doc.Paragraphs(torlendoBekSzam + 1).SpaceBefore, torlendobekezdes.spaceafter) + torlendobekezdes.spacebefore + Sormagassag(Selection) Function Max(a, b) As Single If a >= b Then Max = a Else Max = b Function Sormagassag(kivalasztasObj As Selection) As Single 'Ha a bekezdés sortávolsága pontosan x pont, akkor annál nagyobb nem lehet!!! 'Ráadásul még akkor is ennyi, ha a karakterek mindegyike kisebb méretű!!! 'Törölhető sornál a sormagasság csak akkor vesz fel a sortávolságnál nagyobb 'értéket, ha a sorvége jel, azaz a sor utolsó karaktere vesz fel nagyobb 'értéket. Miután a sor úgyis csak akkor törölhető, ha a szóközökön és 'tabulátoron kívül mást nem tartalmaz (s ezek mérete hiába nagyobb, a sor 'magassága ezt nem veszi át, elég a sor utolsó karakterét ellenőrizni. 'A törlendő sor méretét kell az alábbiakban kiszámítani. Ez mind elől, mind 'hátul törlés esetén az utolsó karakter mérete, kivéve, ha a sorban nemtörhető szóköz van: If kivalasztasobj.paragraphs.linespacingrule = wdlinespaceexactly Then Sormagassag = kivalasztasobj.paragraphs.linespacing
ElseIf NemTorhetoSzokozMerete <> 0 Then Sormagassag = 1.153 * NemTorhetoSzokozMerete * kivalasztasobj.paragraphs.linespacing / 12 Else Sormagassag = 1.153 * kivalasztasobj.characters.last.font.size * kivalasztasobj.paragraphs.linespacing / 12 Function terkozelol() If bekszam <> 1 Then terkozelol = Max(Doc.Paragraphs(bekSzam).SpaceBefore, Doc.Paragraphs(bekSzam - 1).SpaceAfter) + sormagassagelol Else terkozelol = Doc.Paragraphs(bekSzam).SpaceBefore + sormagassagelol Vissza a magyarázathoz