Különböző verziójú msoutl.olb betöltése

Különböző verziójú msoutl.olb betöltése
2015-05-20T10:25:39+02:00
2015-05-20T12:10:55+02:00
2022-10-15T22:50:18+02:00
Silverado
Sziasztok!

Excelből kellene Outlook levélírást generálni, a munkafüzet több felhasználós. Addig jól működött, amíg mindenhol 2010-es Outlook volt. Viszont ha valaki Office2013 használata során menti a munkafüzetet, a 2010-esen a program hiányolja az msoutl.olb-t. Persze manuálisan be tudom kapcsolni neki az aktuális verzióét, de automatizálni kéne. A netről letöltött verziófigyelők mindegyike valamiért kiakad. Vagy akkor, amikor végignézné, hogy melyik sérült ("Nincs jogosultság a Visual Basic projekt programozási elérésére") ???!:
For i = ThisWorkbook.VBProject.References.Count To 1 Step -1
Set theRef = ThisWorkbook.VBProject.References.Item(i)
If theRef.isbroken = True Then
ThisWorkbook.VBProject.References.Remove theRef
End If
Next i

Ha betöltenék egyet, akkor „Method 'VBE' of object '_Application' failed":
Application.VBE.ActiveVBProject.References.AddFromFile "C:\Program Files\Microsoft Office\Office14\MSOUTL.OLB"

Ha más módon végezném, akkor "Object doesn't support this property or method":
Application.References.AddFromFile "C:\Program Files\Microsoft Office\Office14\MSOUTL.OLB"

Előre is köszi a segítséget!
Mutasd a teljes hozzászólást!
Inkább használj késői kötést a konkrét referencia megadása nélkül. Azaz a VBA részben ne csatold be statikusan az outlook hivatkozást (max a fejlesztés idejére a saját gépeden, hogy a code completion meglegyen).

Ez esetben az outlook alkalmazást az alábbi módon indítod el:

Dim oolApp As Object Set oolApp = CreateObject("Outlook.Application")
Továbbá valamennyi outlook objektum modellben definiált osztályú változót object-ként kell deklarálnod mint fent az oolApp-ot, valamint a felsorolások, konstansok sem állnak rendelkezésre, ezeket vagy újra kell definiálnod vagy pedig helyettük a konkrét értékeket kell behelyettesítened.

De ezzel a megoldással a kódodat függetleníteni tudod az adott gépen telepített outlook verziójától. Csak arra figyelj, hogy a kódod ne használjon olyan funkcionalitást a kódban, ami vmelyik verzióban nincs vagy másképp működik (vagy spéci hibakezelést kell rá írnod).
Mutasd a teljes hozzászólást!

  • "jogosultság a Visual Basic projekt programozási elérésére"

    Jó esetben (makróvédelem) ne olvasgassa (és főleg módosítsa) senki a programkódot.

    A felhasználóknál a makrókbeállításoknál átállíthatod, de nem célszerű.

    Az Outlookhoz inkább a
    set ou=createobject("Outlook.application")
    formával kapcsolódj, akkor verziófüggetlen lesz (a meghívás)
    Mutasd a teljes hozzászólást!
  • Árnyék és Micu:
    Úgy látszik, a probléma leírása olyanra sikerült, mintha értenék a témához, pedig csak ollózgattam innen-onnan.
    Az egyszerűség kedvéért a vége felé a fenti rutinokat már egy üres munkafüzetben teszteltem, ahol "csak" be kellett volna tölteniük az olb-t, vagy végignézni, hogy van-e sérült reference (a szűz munkafüzetben nyilván nem volt). De már itt jöttek a hibaüzenetek. Szintén emiatt nem értem a jogosultsági hibajelzést sem.
    Esetleg kifejtenétek bővebben egy egyszerű példával?
    Mutasd a teljes hozzászólást!
  • Mindkettőnk hozzászólásának lényege: szerintünk rossz úton jársz, a kódodat nem a statikus referenciák birizgálásával kéne megpróbálnod függetleníteni az outlook verziójától.

    Mindketten ugyanazt javasoltuk helyette: késői kötéssel, dinamikusan töltsed be az outlook alkalmazást a kódodból. Erre mindketten adtunk példakódot.
    Mutasd a teljes hozzászólást!
  • Leírom egyszerűbben amit kollegák javasolnak:
    A referenciák közül vedd ki az Outlook-ot.

    Ekkor ez a sor (vagy ehhez hasonló) hibát fog dobni:
    Dim ou As New Outlook

    Ekkor ezt a sort cseréld le a kollegák által javasolt 2 sorra. Minden csodálatosan fog működni, kivéve az intellisence-t, ami csak fejlesztés közben fog zavarni.

    Hasonlóan kell eljárni az összes olyan típussal, ami az outlook.tlb-ben van definiálva (pl. MAPIFolder, MailItem, stb)
    Mutasd a teljes hozzászólást!
  • Meg a felsorolásokkal és konstansokkal is. Ezekről még könnyebb elfeledkezni. Ha az option explicit nincs bekapcsolva, akkor kellemes hibakeresésnek néz a kérdező elébe.
    Mutasd a teljes hozzászólást!
  • Jogos
    (Bár én ezzel kezdem a VBA fejlesztést)
    Mutasd a teljes hozzászólást!
  • Nyilván velem van a baj, de mint említettem, a látszat ellenére nem tanultam programozást.
    Azt értem, hogy kiveszem az olb-t a referenciák közül.
    De az autodidakta tudásomat meghaladja, hogy pontosan hova kéne beillesztenem ezt a késői kötést, hogy ne álljon meg hibával. Íme a meghívandó eljárás (ezt is a netről ollóztam, nem az én szintem):

    Sub LevelKuldes(Uzenet As String, Cimzett As String)

    Dim OLF As Outlook.MAPIFolder
    Dim olMailItem As Outlook.MailItem
    Dim olCimzett As Outlook.Recipient

      Set OLF = GetObject("", "Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
       Set olMailItem = OLF.Items.Add ' creates a new e-mail message

       olMailItem.Subject = "értesítés"
    ...
    Mutasd a teljes hozzászólást!
  • Dim OLF As Object Dim olMailItem As Object Dim olCimzett As Object Set OLF = GetObject("", "Outlook.Application").GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) Set olMailItem = OLF.Items.Add ' creates a new e-mail message olMailItem.Subject = "értesítés"

    (mivel eleve GetObject-et használsz a többi maradhat)
    Mutasd a teljes hozzászólást!
  • Ja, hogy getobject-tel dolgozol, akkor sehova, az oké. De ahogy már írtuk, az összes outlook objektummodellbe tartozó osztály helyett csak object-et használj, azaz

    Dim OLF As Outlook.MAPIFolder

    helyett

    Dim OLF As Object

    A másik 2 változót is így deklaráld.

    olFolderInbox konstans értékét szintén az outlook deklarálja, ennek értékét ki kell nézned vagy a dokumentációból vagy az object browser-ből (F2-re jön elő) és vagy újra kell deklarálnod (dim) vagy pedig közvetlenül az értékét kell használnod a kódban.

    Az összes ilyen változóval és konstanssal így kell eljárnod.
    Mutasd a teljes hozzászólást!
  • Ugye, hogy sikerült elfeledkezni a konstansról?
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • Valaki vegye le rólam a megoldást lécci'.
    Mutasd a teljes hozzászólást!
  • Na ja, ilyen az, ha valaki nem ért hozzá.
    Köszönöm mindenki segítségét, kissé bajban is voltam, hogy kinek a megoldását fogadjam el. Ti, akik értettétek, nyilván kezdettől fogva ugyanazt mondtátok, de stl volt a legtürelmesebb.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd