问题
In Word 2010 macro VBA, i set
Set objXML = New MSXML2.DOMDocument30
to get xml type Word.officeUI file.
But when i call the sub that handling Word.officeUI file
user defined type not defined
error rised.
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,
' 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 & yeniDosyaAdiKelimeleri(xcv) & "."
yeniDosyaAdiVer = sonDosyaAdi
Next
End Function
Sub TITCK2pdf()
With ActiveDocument
sondurum = Replace(yeniDosyaAdiVer(), (.Path & "\"), "")
'MsgBox (sondurum)
sonPDFAdi = .Path & "\titck-imza-" & sondurum & "pdf"
'MsgBox (.FullName & Chr(13) & 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 & "\"), "")
'MsgBox (sondurum)
sonPDFAdi = .Path & "\titck-imza-ic-" & sondurum & "pdf"
'MsgBox (.FullName & Chr(13) & 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\" & Environ$("Username") & "\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 > 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
回答1:
Here is how to make it late-bound:
Dim objXML As Object
Set objXML = CreateObject("Msxml2.DOMDocument.3.0")
Now you don't need to set an explicit reference to MSXML.
来源:https://stackoverflow.com/questions/20323598/late-binding-to-avoid-user-defined-type-not-defined-error