• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Tools/Referanse: Missing İşaretli Referansları Kaldırma

Katılım
3 Haziran 2017
Mesajlar
797
Excel Vers. ve Dili
2007, 32
Arkadaşlar,

Yazılacak bir kod ile başında "missing" yazan referansları kaldırmak mümkün mü?
 
Haluk Hocam,

Bu kodları nasıl, nerde kullanacağımı anlamadım ama sorunum verdiğiniz linkteki sorunla aynı...


Kod:
Sub CreateRef_Word()
    Set ID = ThisWorkbook.VBProject.References
    ' Ufak Major ve Minor reference eklemek, diğer PC'lerde de çalışmasını sağlar
    ID.AddFromGuid "{00020905-0000-0000-C000-000000000046}", 1, 0
End Sub

Sub RemoveRef_Word()
    For Each myRefs In Application.VBE.ActiveVBProject.References
    If myRefs.Name = "Word" Then Application.VBE.ActiveVBProject.References.Remove myRefs
    Next
End Sub
 
Hocam bunlardan birinin dosyanın açılışında, diğerini kapanışında çalıştırsam sonuç alırım gibi değil mi?
 
Merhaba Bedri Bey,

Projenizi bitirdikten sonra kullandığınız referansları kaldırmanız gerekiyor. Daha sonra bu haliyle dosyanızı farklı kullanıcılara göndermeniz gerekiyor. Yani referans kullanılmamış halini paylaşmanız gerekiyor. Karşı taraftaki kullanıcı programı açtığında dosyanın açılışına yazacağınız kod ile ilgili referanslar otomatik olarak eklenerek programın hata vermesi önlenecektir.

Fakat Haluk beyin verdiği linkte alt ve üst versiyon probleminden de bahsedilmiş.

Ayrıca bu kodların çalışması için karşı tarafın bilgisayarında excel güvenlik ayarlarına müdahale etmeniz gerekiyor. Aşağıdaki ayarın yapılması gerekiyor.

Excel-Seçenekler-Güven Merkezi-Güven Merkezi Ayarları-Makro Ayarları bölümünden

"VBA projesi nesne modeli erişimine güven" seçeneğinin işaretlenmesi gerekiyor.

Bunu bir script ile halledebilirsiniz.

Bende böyle bir sıkıntıyı bir çalışmamda yaşamıştım. Benzer kodları kullanıyorum. Fakat sonuç alamamıştım. Sanırım versiyon problemi yaşadım. Ya da uygulamayı doğru yapamadım. Ek bilgi olarak belirtmek istedim.
 
Merhaba Bedri Bey,

Projenizi bitirdikten sonra kullandığınız referansları kaldırmanız gerekiyor. Daha sonra bu haliyle dosyanızı farklı kullanıcılara göndermeniz gerekiyor. Yani referans kullanılmamış halini paylaşmanız gerekiyor. Karşı taraftaki kullanıcı programı açtığında dosyanın açılışına yazacağınız kod ile ilgili referanslar otomatik olarak eklenerek programın hata vermesi önlenecektir.

Fakat Haluk beyin verdiği linkte alt ve üst versiyon probleminden de bahsedilmiş.

Ayrıca bu kodların çalışması için karşı tarafın bilgisayarında excel güvenlik ayarlarına müdahale etmeniz gerekiyor. Aşağıdaki ayarın yapılması gerekiyor.

Excel-Seçenekler-Güven Merkezi-Güven Merkezi Ayarları-Makro Ayarları bölümünden

"VBA projesi nesne modeli erişimine güven" seçeneğinin işaretlenmesi gerekiyor.

Bunu bir script ile halledebilirsiniz.

Bende böyle bir sıkıntıyı bir çalışmamda yaşamıştım. Benzer kodları kullanıyorum. Fakat sonuç alamamıştım. Sanırım versiyon problemi yaşadım. Ya da uygulamayı doğru yapamadım. Ek bilgi olarak belirtmek istedim.


Çok teşekkür ederim Korhan hocam.
Birkaç sorum olacak.

1- Tüm referansları mı kaldırmam gerekiyor?
2- Gerekli referansları alması için lazım gelen kod
konusunda bir bilginiz var mı?

Bu arada; ben projeyi Office 2007'de yaptım.
Hatayı Office 2016'da alıyorum.

Haluk Hoca'nın verdiği linkteki sorunla aynı sorun sanıyorım.
 
Bedri Bey,

Bende çalıştığım şirket için makro ile projeler hazırlıyorum. Bu tarz problemleri çok yaşıyorum.

Bu sıkıntıları yaşamamak için genellikle standart ofis nesnelerini kullanmak zorunda kalıyorum. Bu çok hoş bir şey değil tabi ki...

Yine de problemler çıkabiliyor.

Sizin projenizi bende denediğimde hata mesajı ile karşılaşmıştım. Sıfır hata bir proje hazırlamak gerçekten emek gerektiriyor.

Standart referansları bence kaldırmanıza gerek yok. Ama yine de denemekte fayda var.

Ofis sürümlerindeki versiyon numaraları farklı olduğu için ek olarak kullandığınız referansları kaldırmanız yeterli olabilir.

Ek olarak bunları aştıktan sonra 32-64 bit problemi de yaşabilirsiniz. Bilginiz olsun.
 
Alternatif irdelenecek linkler mevcut

Aşağıdaki linknkde kodlar mevcut ve örnek bir adet (Book11.xls) dosyada var

https://www.experts-exchange.com/qu...ove-a-reference-to-a-missing-activex-dll.html

aşağıdaki linkde de (RemoveRef.zip 10.49KB ) bu dosya var

http://www.vbaexpress.com/kb/getarticle.php?kb_id=272

diğer alternatif linkler

https://www.mrexcel.com/forum/excel-questions/937599-remove-missing-references-vba7.html
https://answers.microsoft.com/en-us...0/6cbabf2a-272c-4e3c-8b05-227d1608f2d3?auth=1


Not kodları ben kendi bilgisayarımda denedim ama her seferinde hata verdi.
 
Alternatif irdelenecek linkler mevcut

Aşağıdaki linknkde kodlar mevcut ve örnek bir adet (Book11.xls) dosyada var

https://www.experts-exchange.com/qu...ove-a-reference-to-a-missing-activex-dll.html

aşağıdaki linkde de (RemoveRef.zip 10.49KB ) bu dosya var

http://www.vbaexpress.com/kb/getarticle.php?kb_id=272

diğer alternatif linkler

https://www.mrexcel.com/forum/excel-questions/937599-remove-missing-references-vba7.html
https://answers.microsoft.com/en-us...0/6cbabf2a-272c-4e3c-8b05-227d1608f2d3?auth=1


Not kodları ben kendi bilgisayarımda denedim ama her seferinde hata verdi.


Halit Hocam,

Çok teşekkür ederim.
Projemde standart nesnelerin dışını çıkmadım.
Sadece WebBrowser yoktu, onu ekledim ki onu da kullanmayabilirim.

Bu referanslarla ilgili sorun yaşamamak için Korhan hoca bazı önerilerde bulundu; standart nesneler kullanmak mesela...

İzninizle öğrenmek için birkaç soru sormak istiyorum:

1- Missing hatası hangi durumda ortaya çıkıyor?
2- Aşağıdaki kod, hataya neden olan referansları kaldırmak için mi?

Kod:
Option Explicit
 
Sub References_RemoveMissing()
     'Macro purpose:  To remove missing references from the VBE
     
    Dim theRef As Variant, i As Long
     
    On Error Resume Next
     
    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
     
    If Err <> 0 Then
        MsgBox "A missing reference has been encountered!" & vbCrLf _
        & "You will need to remove the reference manually." & vbCrLf _
        & "Error " & Err.Number & " -" & Err.Description, _
        vbCritical, "Unable To Remove Missing Reference"
    End If
     
    On Error GoTo 0
End Sub
 
Halit Bey,

Ne hatası veriyor?

Kodun çalışması için güvenlik ayarı yapmalısınız.

Excel-Seçenekler-Güven Merkezi-Güven Merkezi Ayarları-Makro Ayarları bölümünden

"VBA projesi nesne modeli erişimine güven" seçeneğinin işaretlenmesi gerekiyor.
 
Merhaba;

Özel işlerimden dolayı bu başlıktaki mesajları izleyememiştim. Esasen konu, yukarıda arkadaşlar tarafından irdelenmiş olmakla birlikte, ben 1-2 şey belirtmek istedim.

Verdiğim linkteki kodlar yaklaşık 10 yıl öncesine ait olmakla birlikte, şimdi kullandığım versiyonda bile çalışıyor. Orada belirttiğim üzere; örnek olarak verdiğim MS Word referansı, kodun çalıştırıldığı PC'deki mevcut versiyona ait MS Word referansı eklemektedir.

Bazen VBA kodlarında referans ekliyoruz. Bunun nedeni bazı ActiveX nesneleri veya 3. şahıslar tarafında üretilmiş olan MS Office ile uyumlu, aynı zamanda da bizim gibi son kullanıcılar tarafından kullanılmasına müsaade edilen özelliklerden faydalanmak için.

Referansları bazen de; "Early Binding" yani, kodun "Compiling" (Derleme) aşamasında kod yazarına kolaylık sağladığı için kullanırız. Örnek olarak; VBE'de "Range("A1")." yazdıktan sonra, nokta (.) işaretinden sonra imlecin yanında beliren açılan kutudaki seçenekleri görebilir ve bunların arasından seçim yapabiliriz. Dışarıdan referans eklediğimizde de durum böyledir ve kullanılan nesnelerin özelliklerini görebiliriz. Böyle olmadığı durumda, o nokta işaretinden sonraki seçenekleri bizim önceden biliyor olmamız gerekir.

Ancak, yukarıdaki mesajlarda da belirtildiği gibi; dikkat edilmesi gereken konu, refansların eklendiği dosyanın diğer bilgisayarlarda sorunsuz çalışabilmesi için aynı nesnelerin o bilgisayarda da olması gerekir.

Yani siz bilgisayarınızda örneğin Word 2010 nesnesini eklediniz, arkadaşınızın PC'de yüklü değilse, "Missing" yani "Eksik" referans çıkacak ve kodlar çalışmayacaktır. Verdiğim linkteki kod ise, eğer bilgisayarda herhangi bir MS Word yazılımı varsa, o versiyonu ekler ve sorun çıkmaz.

Ancak, referansları ekledikten sonra eğer kodun içinde bu referanslara göre atamalar yapıp da, çalıştırdıktan sonra referansları kaldırıp da diğer bilgisayara gönderirseniz kodlar çalışmayacaktır. Yani, yazdığınız kodun yapısına göre değişmekle birlikte; test ettiğiniz kodun çalıştığından emin olduktan sonra referansı kaldırmak, geçerli bir çözüm değildir.

Bunun yerine, referansı ekleyip kodun "Early Binding" yani, derleme aşamasında çalıştığından emin olduktan sonra, aynı kodu bu kez "Late Binding" yani; kodun çalıştırılması sırasında değişkenlere atama yapılması, nesnelere görev yüklenmesi vb yapılabilir. Ancak bu demek değildir ki; karşı tarafta o nesne olmasa bile kodlar çalışssın. Bu mümkün değil, tabii.

Diğer yandan, kodlara referans eklenmesi kodun derleme aşamasında çok daha hızlı çalışmasını sağlayacaktır.

Diğer yandan; eski Office versiyonlarında şimdi kadar güvenlik olmadığı için bir çok şeyi kodlarla, son kullanıcının haberi olmadan hallediyorduk. Ama artık, referans eklemek dahil bir sürü şey son kullanıcın iznine bağlı. Kullanıcılar da, bu tür izinleri vermekte çekinebilir ve dolayısıyle yazılan tüm kodlar kullanılmaz hale gelebilir.

Bu nedenle; Office VBA ile kod yazarken mümkün mertebe mevcut nesnelerle yetinmekte yarar var. Özenle hazırlanmış bir koda, görsellik katmak uğruna tüm kodun kulllanılmayacak olması, kodu hazırlayan kişiyi oldukça üzecektir.

Ayrıca; kullanıcıların Office ayarlarında değişiklikler yapmak veya yapılmasını istemek; bu değişikliklerin tekrar orijinal haline gelmemesi durumunda o kullanıcıların bilgisayarlarının açık hedef haline gelmesine yol açacaktır. Yapılan araştırmalarda, kurumsal şirketlerde kurum içi bilinçli veya bilinçsiz saldırların, dışarıdan gelen saldırılar kadar etkili olduğunu göstermiştir.

Selamlar,


.
 
Korhan Bey ekran görüntülerini ekliyorum ayrıca ilgili sitedeki dosyayı da ekliyorum.
 

Ekli dosyalar

Korhan Bey ekran görüntülerini ekliyorum ayrıca ilgili sitedeki dosyayı da ekliyorum.

Halit Hocam,

Bende de çalışmadı. Dosyayı indirip açtım,
"AirPack" diye bir referansı kaldıramıyor, manuel olarak kaldırılması isteniyor.

Korhan Hocam'ın bahsettiği ayarı da yaptım.
Korhan Hoca bu ayarın bir script dosyasıyla yapılabileceğinden bahsetmişti.
Acaba önce bu ayarın yapılması mı gerekiyor?
 
Selamlar, Yıllar önce benzer bir soruyu uzman grubunda ben de sormuştum. Ferhat Pazarçevirdi ve Levent Menteşoğlunun cevaplarını aynen aktarıyorum. Probleminizin ilacı bu iki cevapta. Dikkatlice okuyunuz.

Ferhat Pazarçevirdi:

Mustafa bey, merhabalar

Eğer, değişkenlerinizde com bileşenlerine erken bağlanma (early binding) yapıyorsanız, bunu geç bağlanmaya (late binding) dönüştürünüz.

Erken bağlanma ..

Dim oOutLook as OutLook.Application

gibi ...

Örneğin, VB Referanslarında "MS Outlook 14" referansı işaretlenmiş ve Outlook application'u bu şekliyle set edilmişse; Office 2010 olmayan tüm bilgisayarlarda hata iletisi (Missing References) alırsınız.

Geç bağlanmaya dönüştürme, object tipli bir değişkene CreateObject fonksiyonu ile değer atamaktır.

Dim oOutLook As Object
Set oExcel = CreateObject("OutLook.Application")

gibi... (Bu durumda referans işaretlemesine gerek yoktur)

Tabi burada, kullanıcının bilgisayarında OutLook olup olmadığını da gözönünde bulundurmalısınız ve kontrol komutları koymalısınız.

Kod yazım esnasında, kütüphane desteği sağlamaz ama çalışma esnasında birçok problemin önüne geçer.

Bunun haricinde, eğer referans gösterdiğiniz kütüphaneler (dll, ocx) karşı bilgisayarda yoksa, bir setup programı hazırlamanız tavsiye edilir.

Levent Menteşoğlu:
Bende Ferhat beyin açıklamalarına konuyu tamamlaması açısından bir kaç ifadeyi (mavi renkliler) daha ilave edeyim.

Early bindig ile yapılan tanımlamalar, compile yani kodların derleme aşamasında yapılmış olur. Diğer bir deyişle kodlar çalışmaya başladığında değişken tanımlamaları tamamlanmıştır. Bu tür tanımlamalarda mutlaka doğru referansların işaretli olması gerekir aksi takdirde bahsettiğiniz türde sorunların yaşanması sözkonusudur.

Bu tür referans işaretleme zorunluluğunu, dolayısıyla hata olasılığını ortadan kaldırmak için late binding bağlanma tercih edilebilir. Bu bağlanmada tanımlamalar, runtime yani kodların çalışması sırasında createobject işlevi ile yapılır. Tek dezavantajı herhangi bir referans işaretli olmadığından kütüphanedeki özellik ve metodlara otomatik olarak ulaşılamamasıdır.
 
Merhaba;

Özel işlerimden dolayı bu başlıktaki mesajları izleyememiştim. Esasen konu, yukarıda arkadaşlar tarafından irdelenmiş olmakla birlikte, ben 1-2 şey belirtmek istedim.

.

Haluk Hocam,

Çok sağolun uzun cevabınız için.

Ben standart nesneleri kullandım genelde ama
arada 2016 kurup kaldırdım, sanırım o sırada
2016 için bazı nesneler eklemişim.

Bir de 2007-32 de webbrowser nesnesi yoktu, onu eklemiştim.
Bunlar dışında kurulum sırasında ne varsa, onları kullandım nesne olarak.

2016 ya ait nesneleri bilgisayarımdan kaldırmak bir çözüm olabilir mi?
Ne yapabilirim? En azından aynı sürümü kullanan kullanıcılar da sorunsuz çalışabilmesi için...
 
Bedri Bey, projenizde kullanmadığınız referansları kaldırmanız yeterli olacaktır.

Selamlar,

.
 
Halit Bey,

Verdiğiniz ilk linki inceledim. Google translate ile Türkçe'ye çevirdim. Zaten orada dosyadaki kodun MİSSİNG ile başlayan referansı kaldırmadığından bahsedilmiş. Daha sonraki yazışmalarda ise çözüm aranmış. Fakat yazılan mesajlardan tam çözümün bulunamadığını anlıyorum.

Sizde oluşan hata bende de oluşuyor. Yani kod MİSSİNG ile başlayan referansı kaldıramıyor.
 
Geri
Üst