Ha kevés az időd és csak a videó érdekel, itt megtalálod.
Két módszert ismertetek, mellyel az Excel-t más alkalmazásokkal lehet összekapcsolni, illetve Excel-ből más alkalmazásokat irányítani:
a Korai Kötés (Early Binding) és a Késői Kötés (Late Binding).
Korai Kötés (Early Binding):
- a folyamat/kód elején létrehozza a kapcsolatot az Excel és a másik alkalmazás (pl.: Outlook) között
- használatához be kell állítani a manipulálandó alkalmazás objektum könyvtárához (Object Library) tartozó referenciát, mely függ az Office verziójától.
– Pl. 2016-os verziónál a Visual Basic szerkesztőjében (VBE) az alábbi referenciát (hivatkozást) kell beállítani, mondjuk az Outlook-hoz:
Tools – References – “Microsoft Outlook 16.0 Object Library” elé a pipát be kell rakni, majd „OK” gomb:
– Ugyanez a hivatkozás 2010-es verzió esetén:
Tools – References – “Microsoft Outlook 14.0 Object Library” elé kell a pipát berakni, majd „OK” gomb
– Ha ezt nem pipáljuk be akkor nem fut le a kód és az alábbi hibaüzenetet kapunk: ‘”Compile error: User-defined type not defined”:
– Excel verziójának meghatározásához lásd a „Sub ExcelVerzio” nevű makrót ebben a posztban
- Példa a deklarálásra és az objektum létrehozására:
1 2 |
Dim Outlook_ As Outlook.Application Set Outlook_ = CreateObject("Outlook.Application") |
vagy
1 2 |
Dim Outlook_ As Outlook.Application Set Outlook_ = New Outlook.Application |
vagy
1 |
Dim Outlook_ As New Outlook.Application |
- Kód segítségével is hozzá lehet adni a hivatkozást (minta: ThisWorkbook.VBProject.References.AddFromGuid GUID:=”XXXXXXXX”) ám erre most külön nem térek ki, mivel a téma külön posztot érdemelne
- Valamivel gyorsabban fut le a makró, mint a Késői Kötés (Late Binding) esetében
- Akkor érdemes használni, ha tudjuk a kódot futtató gépeken lévő Office verziójának/verzióinak számát (pl. Office 2016-os fut minden gépen, amin a kód fut)
- Minél több hivatkozást adunk hozzá, a fájl mérete annál nagyobb lesz
- Olyan állandókkal dolgozhatunk melyek jelentése benne van a nevükben, pl.:
1 |
Set MailItem_ = Outlook_.CreateItem(olMailItem) |
Egyértelmű, hogy a létrehozandó tétel (item) itt egy email (olMailItem).
Ugyanez a sor Késői Kötéssel kizárólag a olMailItem-nek megfelelő azonosító számmal (itt: 0) működik:
1 |
Set MailItem_ = Outlook_.CreateItem(0) |
A 0-ból nyilván nem derül ki, mi is lett létrehozva pontosan
- Óriási előnye, hogy ennél a megoldásnál rendelkezésünkre állnak az alábbiak:
– Intellisense (nem találtam rá igazán jó magyar megfelelőt, talán kódkiegészítés lehetne): VBE-ben: Tools – Options – „Auto List Members” elé a pipát betenni, majd „OK”:
– a VBE-nek a kód gépelése közbeni automatikus kiegészítése. Ez egy legördülő listában jeleníti meg a begépelt kódhoz tartozó objektum tagjait, tulajdonságait (properties), eljárásait (methods), helyi és globális változókat stb. Példa: az aktuális kódot tartalmazó munkafüzethez (ThisWorkbook) kapcsolódó tulajdonságok, valamint eljárások automatikus kilistázása a „.” begépelését követően:
Tulajdonságok: papírlapra mutató ujj ikon
Eljárások: repülő zöld doboz ikon
– Objektumtallózó (Object Browser): ebben kiválaszthatjuk a típus könyvtár nevét, majd ellenőrizhetjük a benne lévő objektumokat – azok tulajdonságaival és eljárásaival együtt. Például az alábbi makrónál kiválasztjuk a „Path” szót és F2-t nyomunk:
Eredmény:
– Compile: kód ellenőriztetése. Ez a funkció ellenőrzi, hogy a megírt kódban a változók megfelelően lettek-e deklarálva („Option Explicit” kiírása szükséges hozzá a modul tetején), van-e szintaktikai (mondattani) hiba, vagyis egyfajta hibakeresést hajt végre, megelőzve ezzel a kód futása közben felmerülő hibákat vagy épp az alkalmazás összeomlását.
Vegyük például ezt a kódot, ahol a „Path” szónál szándékosan lehagytam a „h” betűt:
1 2 3 |
Sub Intellisense_() MsgBox ThisWorkbook.Pat End Sub |
Ellenőriztessük le a kódot:
Visual Basic szerkesztőjében (VBE): „Debug” menü, majd „Compile VBAProject”:
Eredmény: a hibás szót kijelölte a funkció és egy hibaüzenetet kaptunk: “Compile Error: Method or data member not found”
Késői Kötés (Late Binding):
- Az objektumok a kód futtatása közben lesznek ellenőrizve, illetve létrehozva
- Használatához NEM kell beállítani a manipulálandó alkalmazás objektum könyvtárához (Object Library) tartozó referenciát, így a kód működni fog a különböző verzióknál (verziófüggetlen makró)
- A változót objektumként (object) deklaráljuk (a „CreateObject” használatával), ezzel létrehozva az alkalmazás egy példányát. Példa a deklarálásra és az objektum létrehozására Outlook-nál:
1 2 |
Dim Outlook_ As Object Set Outlook_ = CreateObject("Outlook.Application") |
- A Korai Kötésnél említettek nem állnak rendelkezésre (Intellisense, Objektumtallózó, Compile)
- Lassabban fut le a kód, mint az Early Binding-nál
- Ha egy másik verzióban az objektum neve, eljárás vagy a tulajdonság megváltozik, hibára fut a kód. Tapasztalatom szerint ez nem túl gyakran változik meg.
- A Korai Kötésnél említett
1 |
Set MailItem_ = Outlook_.CreateItem(0) |
sorhoz kapcsolódóan: a változók azonosító számát (itt: 0-t) így kaphatjuk meg:
Írjuk meg a kódot Korai Kötéssel, majd nyissuk meg az „Immediate ablak”-ot (CTRL+G) és gépeljük be az állandó nevét a „?” után, végül nyomjunk Enter-t. Az előbbi példánál maradva:
?olMailItem-et beírjuk az „Immediate ablak”-ba majd Enter. Eredmény: 0:
Így a késői kötésnél ez a helyes létrehozás:
1 |
Set MailItem_ = Outlook_.CreateItem(0) |
Konklúzió:
Nálam a legjobb módszer az, hogy megírom a kódot Korai Kötéssel (Early Binding), majd átírom Késő Kötésre (Late Binding), ha nem tudom a kódot futtató gép(ek) Office verzióját, pl.:
Korai Kötés: mondjuk a 2016-os verziónál beállítom a referenciát az Outlook-hoz:
Tools – References – “Microsoft Outlook 16.0 Object Library” elé a pipát berakom, majd „OK” gomb
1 2 |
Dim Outlook_ As New Outlook.Application, MailItem_ As Outlook.MailItem Set MailItem_ = Outlook_.CreateItem(olMailItem) |
Megírom a kódot, majd a fenti sorokat átírom Késői Kötés-re:
1 2 3 |
Dim Outlook_ As Object, MailItem_ As Object Set Outlook_ = CreateObject("Outlook.Application") Set MailItem_ = Outlook_.CreateItem(0) |
Végül kiveszem a pipát a Tools – References – “Microsoft Outlook 16.0 Object Library” elől és lefuttatom a kódot.
A videóban említett VBA kódok (egy üres munkafüzetbe szúrjunk be egy modult a Visual Basic szerkesztőjében és az alábbi kódokat adjuk hozzá:):
Korai Kötés (Early Binding):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Sub EarlyBinding_Outlook() Dim Outlook_ As New Outlook.Application, MailItem_ As Outlook.MailItem Application.ScreenUpdating = False 'Early Binding= Korai Kötés 'Készítette: XLMotyo (https://xlmotyo.hu) 'Mielõtt futtatjuk a kódot, hozzá kell adni a hivatkozást Visual Basic szerkesztõjében (VBE-ben), pl.Excel 2016 - nál: 'Tools - References - "Microsoft Outlook 16.0 Object Library" elé a pipát be kell rakni majd "OK" gomb. 'ha ezt elmulasztjuk, akkor nem fut le a kód és ezt a hibaüzenetet kapjuk:"Compile error: User-defined type not defined". 'a különbözõ Excel (illetve Office) verzióknál más számozású objektum könyvtár (object library) elé kell berakni a pipát. 'Excel verzió meghatározásához lásd a "Sub ExcelVerzio" makrót az "ExcelVerzio_" nevû modulban, ebben a munkafüzetben. 'ha lefuttatjuk a "Sub ExcelVerzio" nevû makrót és eredményül pl. ezt kapjuk: "Excel 2010-et használsz." - akkor az 'Application.Version = 14.0-val,így az Outlook irányításához a "Microsoft Outlook 14.0 Object Library" elé kell pipát tenni Set MailItem_ = Outlook_.CreateItem(olMailItem) With MailItem_ .To = "vevo01@cegneve.com" .CC = "szamlazas@cegneve.com" .Subject = "Próba email, csatolt fájllal" .BodyFormat = olFormatHTML .HTMLBody = _ "Tisztelt Hölgyem/Uram!<p>" & _ "Ez egy makró által küldött <b>próba</b> email, mely <font color=red>csatolt</font> fájlt tartalmaz.<p>" & _ "Üdvözlettel,<p>" & _ "Roland<p>" & _ "Utóirat: weboldal linkje: " & "<a href=https://xlmotyo.hu/>XLMotyo</a>" .Attachments.Add ("c:\Users\Roland\Desktop\_xlmotyo.hu\Posts\08.Score Card szinezes\ScoreCard_Szinezes_03.xlsm") .Importance = olImportanceHigh .Display '.Send 'ha kivesszük az aposztrófot a ".Send" elõl, akkor az email automatikusan elküldésre kerül End With Application.ScreenUpdating = True End Sub |
Késői kötés (Late Binding):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Sub LateBinding_Outlook() Dim Outlook_ As Object, MailItem_ As Object Application.ScreenUpdating = False 'Late Binding= Késõi Kötés 'Készítette: XLMotyo (https://xlmotyo.hu) 'itt NEM kell a Visual Basic szerkesztõjében (VBE-ben) pl. a "Microsoft Outlook 16.0 Object Library" elé a pipát berakni, 'késõi kötés miatt az állandók helyett az azoknak megfelelõ számokat kell használni, különben nem fut le a kód, 'pl.: Outlook típusánál: '"Outlook_.CreateItem(olMailItem)" helyett: Outlook_.CreateItem(0) 'minden Excel verzioban futni fog a kód Set Outlook_ = CreateObject("Outlook.Application") Set MailItem_ = Outlook_.CreateItem(0) '0 = olMailItem With MailItem_ .To = "vevo01@cegneve.com" .CC = "szamlazas@cegneve.com" .Subject = "Próba email, csatolt fájllal" .BodyFormat = 2 '2 = olFormatHTML .HTMLBody = _ "Tisztelt Hölgyem/Uram!<p>" & _ "Ez egy makró által küldött <b>próba</b> email, mely <font color=red>csatolt</font> fájlt tartalmaz.<p>" & _ "Üdvözlettel,<p>" & _ "Roland<p>" & _ "Utóirat: weboldal linkje: " & "<a href=https://xlmotyo.hu/>XLMotyo</a>" .Attachments.Add ("c:\Users\Roland\Desktop\_xlmotyo.hu\Posts\08.Score Card szinezes\ScoreCard_Szinezes_03.xlsm") .Importance = 2 '2= olImportanceHigh .Display '.Send 'ha kivesszük az aposztrófot a ".Send" elõl, akkor az email automatikusan elküldésre kerül End With Application.ScreenUpdating = True End Sub |
Szintén a témához kapcsolódó VBA kód, mely az Excel verzióját határozza meg:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub ExcelVerzio() 'Készítette: XLMotyo (https://xlmotyo.hu) If Application.Version = "16.0" Then '16.0-t ad vissza 2016-os, 2019-es és O365-ös verziónál is! MsgBox "Excel 2016-ot, 2019-et vagy O365-öt használsz." ElseIf Application.Version = "15.0" Then MsgBox "Excel 2013-at használsz." ElseIf Application.Version = "14.0" Then MsgBox "Excel 2010-et használsz." ElseIf Application.Version = "12.0" Then MsgBox "Excel 2007-et használsz." ElseIf Application.Version = "11.0" Then MsgBox "Excel 2003-at használsz." ElseIf Application.Version = "10.0" Then MsgBox "Excel 2002-t használsz." ElseIf Application.Version = "9.0" Then MsgBox "Excel 2000-t használsz." ElseIf Application.Version = "8.0" Then MsgBox "Excel 97-et használsz." ElseIf Application.Version = "7.0" Then MsgBox "Excel 95-öt használsz." End If End Sub |
Végezetül a videó, mely tartalmazza a Korai és Késői kötés legfontosabb jegyeit és azok gyakorlati példán keresztüli alkalmazását: olyan makrókkal, melyek segítségével automatikusan lehet előre formázott emailt (csatolmánnyal) küldeni Outlook-ból:
Remélem hasznos volt a poszt.
Kérdésed, észrevételed van? Szólj hozzá lent vagy dobj egy emailt: xlmotyo@gmail.com