title: Late binding to avoid "User defined type not defined" error
body: <p>In Word 2010 macro VBA, i set </p>
  
  <pre><code>Set objXML = New MSXML2.DOMDocument30
  </code></pre>
  
  <p>to get xml type Word.officeUI file.</p>
  
  <p>But when i call the sub that handling Word.officeUI file </p>
  
  <pre><code>user defined type not defined
  </code></pre>
  
  <p>error rised.</p>
  
  <p>I don't want to add any necessary .dll or another source from TOOLS > REFERENCES
  I need to add any thing in run time (first opening of Word).
  Here is my actual code in use at below,</p>
  
  <pre><code>' bu özel sub sadece onLoad event'ına karşılık gelen ve belge ilk defa yüklendiğinde çalışan özel bir sub
  Private Sub Document_Open()
  Application.ActiveDocument.VBProject.References.AddFromFile ("C:\Windows\System32\msxml3.dll")
  Call officeUI_duzelt
  End Sub
  
  Function yeniDosyaAdiVer()
  yeniDosyaAdiKelimeleri = Split(ActiveDocument.FullName, ".")
  yeniDosyaAdiKelimeleriSayisi = UBound(yeniDosyaAdiKelimeleri)
      For xcv = 0 To (yeniDosyaAdiKelimeleriSayisi - 1)
          sonDosyaAdi = sonDosyaAdi &amp; yeniDosyaAdiKelimeleri(xcv) &amp; "."
          yeniDosyaAdiVer = sonDosyaAdi
      Next
  End Function
  
  
  Sub TITCK2pdf()
      With ActiveDocument
      sondurum = Replace(yeniDosyaAdiVer(), (.Path &amp; "\"), "")
      'MsgBox (sondurum)
      sonPDFAdi = .Path &amp; "\titck-imza-" &amp; sondurum &amp; "pdf"
      'MsgBox (.FullName &amp; Chr(13) &amp; sonPDFAdi)
  
        .ExportAsFixedFormat OutputFileName:=sonPDFAdi, _
        ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, _
        OptimizeFor:=wdExportOptimizeForPrint, Range:=wdExportAllDocument, _
        Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
        CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
        BitmapMissingFonts:=True, UseISO19005_1:=False
      End With
  End Sub
  
  Sub TITCK_ic2pdf()
      With ActiveDocument
      sondurum = Replace(yeniDosyaAdiVer(), (.Path &amp; "\"), "")
      'MsgBox (sondurum)
      sonPDFAdi = .Path &amp; "\titck-imza-ic-" &amp; sondurum &amp; "pdf"
      'MsgBox (.FullName &amp; Chr(13) &amp; sonPDFAdi)
  
        .ExportAsFixedFormat OutputFileName:=sonPDFAdi, _
        ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, _
        OptimizeFor:=wdExportOptimizeForPrint, Range:=wdExportAllDocument, _
        Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
        CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
        BitmapMissingFonts:=True, UseISO19005_1:=False
      End With
  End Sub
  
  Sub officeUI_duzelt()
  ' // OfficeUI dosyasının yolu alınıyor
  OfficeUI_yolu = "C:\Users\" &amp; Environ$("Username") &amp; "\AppData\Local\Microsoft\Office\Word.officeUI"
  
  ' // OfficeUI dosyası (xml formatında) ele alınıyor
  Set objXML = New MSXML2.DOMDocument30
  objXML.Load (OfficeUI_yolu)
  
  '// OfficeUI içindeki node bilgileri ele alınıyor
  Set dugmelerinAnaci = objXML.getElementsByTagName("mso:sharedControls")(0)
  
  
  '// Daha önce değişiklik yapılmış mı  kontrol amaçlı girdi bakılıyor
  Set modifikasyon = objXML.getElementsByTagName("modifikasyon")
  
  '// Modifikasyon yapıldıysa sub'dan çıkılıyor
  'MsgBox (modifikasyon.Length)
  If modifikasyon.Length &gt; 0 Then
  Exit Sub
  End If
  '/////////////////////////////////////// SUB çıkış şartı var üstte
  
  ' // Her durumda modifikasyon yapılacak (modifikasyon nodu eklenecek (mso:sharedControls ana nodunun altına ekleniyor)
  Set mdf = objXML.createElement("modifikasyon")
  dugmelerinAnaci.appendChild mdf
  
  
  
  
  '// mso:button node'larına ait xml içerikleri gösteriliyor
  'Set yeniDegerler = objXML.getElementsByTagName("mso:button")
  'For yD = 0 To (yeniDegerler.Length - 1)
  'MsgBox (yeniDegerler(yD).XML)
  'Next
  
  
  
  ' Element ekleniyor ve o elemente attribute'lar ekleniyor
  Set yNesne = elementYaratVeEkle("mso:button", dugmelerinAnaci, objXML)
      yAttribute = attributeYaratVeEkle("idQ", "x1:TITCK_ic2pdf_1", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("visible", "true", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("label", "İç yazışma PDF yapıcısı", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("imageMso", "AppointmentColor3", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("onAction", "TITCK_ic2pdf", yNesne, objXML)
  
  Set yNesne = elementYaratVeEkle("mso:button", dugmelerinAnaci, objXML)
      yAttribute = attributeYaratVeEkle("idQ", "x1:TITCK2pdf_1", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("visible", "true", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("label", "Dış yazışma PDF yapıcısı", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("imageMso", "AppointmentColor1", yNesne, objXML)
      yAttribute = attributeYaratVeEkle("onAction", "TITCKpdf", yNesne, objXML)
  
  
  
  've kayıt
  objXML.Save (OfficeUI_yolu)
  End Sub
  Function elementYaratVeEkle(elementAdi, AnacElementNesnesi, hazirXMLNesnesi)
  Set objYeniNesne = hazirXMLNesnesi.createElement(elementAdi)
  AnacElementNesnesi.appendChild objYeniNesne
  Set elementYaratVeEkle = objYeniNesne
  End Function
  Function attributeYaratVeEkle(attributeAdi, attributeDegeri, AnacElementNesnesi, hazirXMLNesnesi)
  Set objXMLattr = hazirXMLNesnesi.createAttribute(attributeAdi)
  objXMLattr.NodeValue = attributeDegeri
  AnacElementNesnesi.setAttributeNode objXMLattr
  End Function
  </code></pre>