2016-03-28 28 views
3

Excel'de bir VBA projesi oluşturdum ve söz konusu proje içinde kodu başka bir modüle yazan bir modül var. En sonunda şifreyi gizli tutmak için projeyi şifre ile korudum (hemen bunun çok açık bir şekilde ortaya çıkacağını anlayamadım).VBA yordamını/işlevini bir .xlam eklentisine yazıyor

Kullanıcı dosyayla etkileşimde bulunduğunda, modül kodu çalıştırmayı dener, ancak bir hatayla karşılaşır (parola korumalı bir proje kendini değiştiremez! Hey hepimizin anılarımız var: p).

Dolayısıyla, bunun bir yolu olarak, dosyanın kalan kısmını korurken 'neden korumasız kısmı düzenlenmediğini' düşündüm. Bu yüzden korumasız bir .xlam eklentisi oluşturacağımı, sonra bu kodu bu bölüme yazacağımı düşündüm. Ancak bunun nasıl yapılacağını bulmakta zorluk çekiyorum. Aşağıda başka modül kodu yazdıktan yazdım kodudur:

Public Sub errorWrite() 

Dim VBComp As VBIDE.VBComponent 
Dim CodeMod As VBIDE.CodeModule 
Dim s As String 
Dim d As String 
Dim lineNumb As Long 

With ThisWorkbook.VBProject.VBComponents.item("NewModule") 
.CodeModule.InsertLines j, "Public sub newModule()" 

j = j + 1 

With ThisWorkbook.VBProject.VBComponents.item("NewModule") 
.CodeModule.InsertLines j, "(my code etc..)" 

j = j + 1 

    With ThisWorkbook.VBProject.VBComponents.item("NewModule") 
.CodeModule.InsertLines j, "end sub" 


end sub 

ben Stack üzerinde bazı bilgiler bulundu ve başka bir yerde, örneğin .xlam eklentileri (Updating an xlam add-in using VBA) ile ilgili olsa da, ben yerine sadece tutardik olabildiğince basit. Öneriler ve ipuçları çok takdir edilmektedir. Teşekkürler!

cevap

1

Korumasız bir Addin kullanmak makul bir yaklaşım gibi görünüyor. Ancak, gönderdiğiniz kod, Korumalı eklentisinde Modül modülüne yazıyor. Sen

Sonra buna bir referans oluşturmak bir VBProject

Değişim bir benzersiz Adı için Korumasız AddIn ismi gibi diğer AddIn başvurmak gerekir (VBAProject için varsayılan olarak ve benzersiz olmak zorunda değildir) Bu

Dim VBP As VBProject 
Set VBP = ThisWorkbook.VBProject.VBE.VBProjects("NameOfYourUnprotectedAddin") 

gibi Sonra tüm kodu

Ör

yerine ThisWorkbook.VBProject bu başvuruyu kullanır
With VBP.VBComponents.item("NewModule") 
    .CodeModule.InsertLines j, "Public sub newModule()" 
' etc 

End With 
+0

:) Teşekkür çalıştığı halde bunu elde, bir çalışma zamanı hatası alıyorum '9', simge aralık dışında. Excel'e göre, eklenti yüklenir, ayrıca hem .xlam uzantılı hem de w/o ile benzersiz bir eklenti adı da kullandım; – Singularity20XX

0

bu yüzden işe yarayan bir yol bulabildim, FSO kullanarak kodu yazdım, sonra dosyayı .bas modülü olarak kaydedin. yürütme tamamlandıktan sonra

Public Sub importBas() 
Dim VBP As VBProject 
Set VBP = Workbooks("example.xlam").VBProject 

VBP.VBComponents.Import ("C:\Users\...example.bas") 
VBP.VBComponents.Remove 

End Sub 

Sonra özgün modülünde, ben xlam içinde prosedürü silindi: Oradan bir modül olarak .xlam eklenti doğrudan ithal modülü sağlamak için aşağıdaki kullanılır. Bu nedenle, herhangi bir kod görülemez (hata işleme ve hatırlatma modunu devre dışı bırakmayı hatırlıyorum varsayımlarım varsayarsak: p)

'Doğrudan' yazmayı hala merak ediyorum, bu yüzden daha çok oynarım ve Bu şekilde

önerdiğiniz yukarıdaki kullanırken