Aracılığıyla paylaş


VBA ve Belge Düzeyi Özelleştirmelerini Birleştirme

Microsoft Office Word veya Microsoft Office Excel için bir belge düzeyi özelleştirmesinin parçası olan bir belgede Visual Basic for Applications (VBA) kodu kullanabilirsiniz.Özelleştirme derlemesinden belgedeki VBA kodunu çağırabilirsiniz veya özelleştirme derlemesindeki kodu çağırmak amacıyla belgedeki VBA kodunu etkinleştirmek için projenizi yapılandırabilirsiniz.

Uygulama alanı: Bu konudaki bilgiler şu uygulamaların belge düzeyi projelerine yöneliktir: Excel 2013 ve Excel 2010; Word 2013 ve Word 2010. Daha fazla bilgi için bkz. Office Uygulamalarında Kullanılabilir Özellikler ve Proje Türü.

Belge Düzeyi Özelleştirmesinde VBA Kodunun Davranışı

Visual Studio'da projenizi açtığınız zaman belge tasarım modunda açılır.VBA kodu belge tasarım modundayken çalışmaz, bu nedenle belgenin ve kodun üzerinde, VBA kodunu çalıştırmadan çalışabilirsiniz.

Çözümü çalıştırdığınızda, VBA'daki ve özelleştirme derlemelerindeki olay işleyicilerin her ikisi de belgede çıkarılan olayları yakalar ve her iki kod kümesi de çalışır.Hangi kodun diğerinden önce çalışacağına önceden karar verilemez, buna her bir durumu test ederek karar verebilirsiniz.İki kod kümesi dikkatli bir biçimde eşgüdümlenmez ve test edilmez ise beklenmeyen sonuçlar alabilirsiniz.

Özelleştirme Derlemesinden VBA Kodu Çağırma

Word belgelerinde makro, Excel çalışma kitaplarında makro ve işlev çağırabilirsiniz.Bunu yapmak için aşağıdaki yöntemlerden birini kullanın:

Tüm yöntemlerde, ilk parametre çağırmak istediğiniz makro veya işlevin ismini tanımalar; geri kalan isteğe bağlı parametreler makro veya işleve geçireceğiniz parametreleri belirtir.İlk parametrenin Word ve Excel için farklı biçimleri olabilir.

  • Word'de, ilk parametre şablon, modül ve makro isminin herhangi bir karışımı olan bir dizgi olabilir.Belge ismini belirtirseniz, kodunuz sadece geçerli bağlamla ilgili belgelerdeki makroları çalıştırır; bütün belgelerdeki makroları değil.

  • Excel'de, ilk parametre makro ismini belirten bir dizgi, işlevin nerede olduğunu belirten bir Range veya kayıtlı DLL (XLL) işlevi için bir kimlik olabilir.Bir dizgi geçirirseniz, bu dizgi etkin sayfanın bağlamında değerlendirilir.

Aşağıdaki kod örneğinde, bir belge düzeyi Excel projesinden MyMacro adındaki bir makronun nasıl çağrıldığı gösterilmektedir.Bu örnekte Sheet1 sayfasında MyMacro makrosunun tanımlandığını varsayılır.

Globals.Sheet1.Application.Run("MyMacro")
Globals.Sheet1.Application.Run("MyMacro", missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing, 
    missing, missing, missing, missing, missing, missing);

[!NOT]

Visual C#'ta isteğe bağlı parametrelerin yerine genel missing değişkeninin kullanılması hakkında daha fazla bilgi için bkz. Office Çözümlerinde Kod Yazma.

Belge Düzeyi Özelleştirmelerindeki Kodu VBA'dan Çağırma

Belgedeki Visual Basic for Applications (VBA) kodunun, özelleştirme derlemesindeki kodu çağırması için Word veya Excel için belge düzeyi projesi yapılandırabilirsiniz.Bu durum aşağıdaki senaryolarda yararlıdır:

  • Aynı belge ile ilişkilendirilen belge düzeyi özelleştirmesindeki özellikleri kullanarak belgedeki varolan VBA kodunu genişletmek istersiniz.

  • Belge düzeyi özelleştirmesinde geliştirdiğiniz hizmetleri, belgede VBA kodu yazarak hizmetlere erişebilen son kullanıcılara kullanılabilir yapmak istersiniz.

Visual Studio'daki Office geliştirme araçları, uygulama düzeyi eklentileri için benzer bir özellik sağlar.Bir eklenti geliştiriyorsanız, başka bir Microsoft Office çözümünden eklentinizdeki kodu çağırabilirsiniz.Daha fazla bilgi için bkz. Uygulama Düzeyi Eklentilerindeki Kodu Başka Office Çözümlerinden Çağırma.

[!NOT]

Bu özellik Word şablon projelerinde kullanılamaz.Sadece Word belgesinde, Excel çalışma kitabında veya Excel şablon projelerinde kullanılabilir.

Gereksinimler

VBA kodunu, özelliştirme derlemesine çağırmak için etkinleştirmeden önce, projeniz aşağıdaki gereksinimleri karşılamalıdır:

  • Belge aşağıdaki dosya adı uzantılarından birine sahip olmalıdır:

    • Word: .docm veya .doc

    • Excel: .xlsm, .xltm, .xls veya .xlt

  • Belge, VBA kodu içeren bir VBA projesine sahip olmalıdır.

  • Belgedeki VBA kodunun, kullanıcı makroları etkinleştirmeyi istemeden çalışmasına izin verilmelidir.Office projesinin konumunu Word veya Excel Güven Merkezi'ndeki güvenilir konum listesine ekleyerek VBA kodunun çalışacağına güvenebilirsiniz.

  • Office projesi, VBA'da oluşturduğunuz bir veya daha fazla ortak üyeyi içeren en az bir ortak sınıfı içermelidir.

    VBA'da yöntemleri, özellikleri ve olayları oluşturabilirsiniz.Oluşturduğunuz sınıf, konak öğesi sınıfı (Word için ThisDocument veya Excel için ThisWorkbook ve Sheet1 gibi) veya projenizde tanımladığınız başka bir sınıf olabilir.Konak öğeleri hakkında daha fazla bilgi için, bkz. Konak Öğeleri ve Konak Kontrollerine Genel Bakış.

VBA Kodunu, Özelliştirme Derlemesinde Çağırmak için Etkinleştirme

Özelleştirme derlemesindeki üyeleri, projedeki VBA kodunda oluşturmanın iki farklı yolu vardır:

  • Visual Basic projesindeki konak öğesi sınıfının üyelerini VBA'de oluşturabilirsiniz.Bunu yapmak için, konak öğesi (belge, çalışma kitabı veya çalışma sayfası) tasarımcıda açıkken, konak öğesinin Özellikler penceresindeki EnableVbaCallers özelliğini True'ya ayarlayın.Visual Studio,VBA kodunu, sınıfın tüm üyelerini çağırmak üzere etkinleştirmek için, gerekli tüm işleri otomatik olarak gerçekleştirir.

  • Visual C# projesinde herhangi bir ortak sınıftaki üyeleri veya Visual Basic projesinde konak öğesi olmayan bir sınıftaki üyeleri VBA'de oluşturabilirsiniz.Bu seçenek, hangi sınıfları VBA'de oluşturacağınızı seçmede daha çok özgürlük sağlar, ama daha çok elle yapılan adım gerektirir.

    Bunu yapmak için aşağıdaki ana adımları gerçekleştirmelisiniz:

    1. COM'de sınıf oluşturun.

    2. VBA'de ortaya çıkardığınız sınıfın bir örneğini dönmek için projenizdeki konak öğesi sınıfının GetAutomationObject yöntemini geçersiz kılın.

    3. Projedeki herhangi bir konak öğesinin ReferenceAssemblyFromVbaProject özelliğini True olarak ayarlayın.Bu, özelleştirme derlemesinin tür kitaplığını, derlemeye katıştırır ve tür kitaplığında belgedeki VBA projesine başvuru ekler.

Ayrıntılı yönergeler için, bkz. Nasıl yapılır: Visual Basic projesindeki vba koduna açığa çıkaran ve Nasıl yapılır: Visual C# projesi, vba kodu göstermek.

EnableVbaCallers ve ReferenceAssemblyFromVbaProject özellikleri, sadece Özellikler penceresinde, tasarım zamannda kullanılabilirdir; onlar çalışma zamanında kullanılamaz.Özellikleri görüntülemek için, Visual Studio içindeki konak öğesi için tasarımcıyı açın.Bu özellikleri ayarladığınızda Visual Studio'nun gerçekleştirdiği belli görevler hakkında daha fazla bilgi için, bkz. asks Performed by the Host Item Properties.

[!NOT]

Çalışma kitabı veya belge önceden VBA kodu içermiyorsa veya belgedeki VBA kodu çalıştırmak için güvenilir değil ise EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini True olarak ayarladığınızda hata iletisi alırsınız.Bunun sebebi Visual Studio'nun bu durumda belgedeki VBA projesini değiştirememesidir.

VBA Kodunundaki Üyeleri, Özelliştirme Derlemesinde Çağırmak için Kullanma

Projenizi, VBA kodunu özelliştirme derlemesine çağırmak üzere etkinleştirmek için yapılandırdığınızda, Visual Studio aşağıdaki üyeleri belgedeki VBA projesine ekler:

  • Tüm projeler için, Visual Studio GetManagedClass isimli genel yöntemi ekler.

  • EnableVbaCallers özelliğini kullanarak konak öğesinin üyelerini oluşturduğunuz Visual Basic projeleri için, Visual Studio aynı zamanda CallVSTOAssembly isimli özelliği, VBA projesindeki ThisDocument, ThisWorkbook, Sheet1, Sheet2 veya Sheet3 modülüne ekler.

CallVSTOAssembly özelliğini veya GetManagedClass yöntemini, projedeki VBA kodunda ortaya çıkardığınız sınıfın ortak üyelerine erişmek için kullanabilirsiniz.

[!NOT]

Çözümünüzü geliştirirken ve dağıtırken, VBA kodunu ekleyebileceğiniz belgenin birçok kopyası vardır.Daha fazla bilgi için, bkz. Guidelines for Adding VBA Code to the Document.

3hekt07s.collapse_all(tr-tr,VS.110).gifVisual Basic Projesinde CallVSTOAssembly Özelliğini Kullanma

Konak öğesinin sınıfına eklediğiniz ortak üyelere erişmek için CallVSTOAssembly özelliğini kullanın.Örneğin, aşağıdaki VBA makrosu, Excel çalışma kitabı projesindeki Sheet1 sınıfında tanımlanmış MyVSTOMethod isimli yöntemi çağırır.

Sub MyMacro()
    Sheet1.CallVSTOAssembly.MyVSTOMethod()
End Sub

Özelleştirme derlemesini çağırmak için GetManagedClass yöntemini doğrudan kullanmaktansa, bu özellik daha uygun bir yoldur.CallVSTOAssembly, VBA'da oluşturduğunuz konak öğesi sınıfını temsil eden bir nesne döner.Dönen nesnenin üyeleri ve yöntem parametreleri, IntelliSense'de görünür.

CallVSTOAssembly özelliği, aşağıdaki koda benzer bir bildirime sahiptir.Bu kodda, VBA'de ExcelWorkbook1 isimli Excel çalışma kitabı projesindeki Sheet1 konak öğesi sınıfını oluşturduğunuz varsayılır.

Property Get CallVSTOAssembly() As ExcelWorkbook1.Sheet1
    Set CallVSTOAssembly = GetManagedClass(Me)
End Property

3hekt07s.collapse_all(tr-tr,VS.110).gifGetManagedClass Yöntemini Kullanma

Genel GetManagedClass yöntemini kullanmak için, GetAutomationObject yönteminizin geçersiz kılınmış halini içeren konak öğesi sınıfıyla ilgili VBA nesnesini geçirin. Daha sonra, VBA'de oluşturduğunuz sınıfa erişim için döndürülen nesneyi kullanın.

Örneğin, aşağıdaki VBA makrosu, ExcelWorkbook1 isimli Excel çalışma kitabı projesindeki Sheet1 konak öğesi sınıfında tanımlanmış MyVSTOMethod isimli yöntemi çağırır.

Sub CallVSTOMethod
    Dim VSTOSheet1 As ExcelWorkbook1.Sheet1
    Set VSTOSheet1 = GetManagedClass(Sheet1)
    VSTOSheet1.MyVSTOMethod
End Sub

GetManagedClass yöntemi aşağıdaki bildirime sahiptir.

GetManagedClass(pdispInteropObject Object) As Object

Bu yöntem, VBA'da oluşturduğunuz sınıfı temsil eden bir nesne döner.Dönen nesnenin üyeleri ve yöntem parametreleri, IntelliSense'de görünür.

VBA Kodunu Belgeye Eklemek için Yönergeler

Belge düzeyi özelleştirmeinde çağırılan VBA kodunu ekleyebileceğiniz belgenin birçok kopyası vardır.

Çözümünüzü geliştirip sınadığınızda, Visual Studio'daki projenizi çalıştırırken veya hata ayıklarken açılan belgedeki VBA kodunu yazabilirsiniz. (Bu, yapı çıktı klasöründeki belgedir)Fakat, belgeye eklediğiniz herhangi VBA kodu, siz projeyi bir sonraki seferde yapılandırdığınızda yeniden yazılır, çünkü Visual Studio yapı çıktısı klasöründeki belgeyi, ana proje klasöründeki belgenin kopyasıyla değiştirir.

Çözümü çalıştırırken veya hata ayıklarken belgye eklediğiniz VBA kodunu kaydetmek istiyorsanız, proje klasöründeki belgeye VBA kodunu kopyalayın.Yapılandırma işlemi hakkında daha fazla bilgi için, bkz. Office çözümler oluşturma Yardımı.

Çözümünüzü dağıtmak için hazır olduğunuzda, VBA kodunu ekleyebileceğiniz üç ana konum vardır.

3hekt07s.collapse_all(tr-tr,VS.110).gifGeliştirme Bilgisayarındaki Proje Klasörünün İçi

Eğer belgedeki VBA kodunda ve özelleştirme kodunda tam bir denetime sahipseniz bu konum uygundur. Belge geliştirme bilgisayarında olduğu için, özelleştirme kodunu değiştirdiğinizde kolaylıkla VBA kodunu da değiştirebilirsiniz.Belgenin bu kopyasına eklediğiniz VBA kodu, çözümünüzü yapılandırıken, hatasını ayıklarken ve yayımlarken belgede kalır.

VBA kodunu, belge tasarımcıda açılırken belgeye ekleyemezsiniz.İlk önce belgeyi tasarımcıda kapatmalısınız ve ardından belgeyi doğrudan Word veya Excel'de açmalısınız.

Uyarı notuUyarı

Belge açıkken çalışan VBA kodunu eklediğinizde, nadiren bu kod belgeyi bozabilir veya tasarımcıda açılmasını engelleyebilir.

3hekt07s.collapse_all(tr-tr,VS.110).gifYayımlama veya Yükleme Klasöründe

Bazı durumlarda, VBA kodunu belgeye yayımlama veya yükleme klasöründe eklemek uygun olabilir.Örneğin, VBA kodu farklı bir geliştirici tarafından, Visual Studio yüklü olmayan bir bilgisayarda yazılıp sınandığında bu seçeneği seçebilirsiniz.

Eğer kullanıcılar çözümü doğrudan yayımlama klasöründen yüklerlerse, çözümü her yayımladığınızda VBA kodunu belgeye eklemelisiniz.Visual Studio, çözümü her yayımlayışınızda yayımlama konumundaki belgeyi geçersiz kılar.

Eğer kullanıcılar çözümü, yayımlama klasöründen farklı bir yükleme klasöründen yüklerse, çözümü her yayımladığınızda belgedeki VBA kodunu eklemekten kaçınabilirsiniz.Eğer yayımlama güncellemesi, yayımlama klasöründen yükleme klasörüne taşınmaya hazırsa, belge dışındaki tüm dosyaları yükleme klasörüne kopyalayın.

3hekt07s.collapse_all(tr-tr,VS.110).gifSon Kullanıcı Bilgisayarında

Eğer son kullanıcılar, belge düzeyi özelleştirmesinde sağladığınız hizmetleri çağıran VBA geliştiricileriyse, belge kopyalarındaki CallVSTOAssembly özelliğini veya GetManagedClass yöntemini kullanarak kodunuzun nasıl çağrıldığını anlatabilirsiniz.Çözüme güncellemeleri yayımladığınızda, son kullanıcı bilgisayarındaki belgedenin VBA kodu geçersiz kılınmaz, çünkü belge, yayımlama güncellemeleri tarafından değiştirilmez.

Konak Öğesi Özellikleri Tarafından Gerçekleştirilen Görevler

EnableVbaCallers ve ReferenceAssemblyFromVbaProject özelliklerini kullandığınızda, Visual Studio farklı görev kümeleri gerçekleştirir.

3hekt07s.collapse_all(tr-tr,VS.110).gifEnableVbaCallers

Visual Studio'da, konak öğesinin EnableVbaCallers özelliğini True olarak ayarladığınızda, Visual Studio aşağıdaki görevleri gerçekleştirir:

  1. ComClassAttribute ve ComVisibleAttribute özniteliklerini konak öğesi sınıfına ekler.

  2. Konak öğesi sınıfının GetAutomationObject yöntemini geçersiz kılar.

  3. Konak öğesinin ReferenceAssemblyFromVbaProject özelliğini True olarak ayarlar.

EnableVbaCallers özelliğini, yeniden False olarak ayarlarsanız, Visual Studio aşağıdaki görevleri gerçekleştirir:

  1. ComClassAttribute ve ComVisibleAttribute özniteliklerini ThisDocument sınıfından kaldırır.

  2. Konak öğesi sınıfından GetAutomationObject yöntemini kaldırır.

    [!NOT]

    Visual Studio, otomatik olarak ReferenceAssemblyFromVbaProject özelliğini yeniden False olarak ayarlamaz. Bu özelliği False'a, Özellikler penceresini kullanarak elle ayarlamalısınız.

3hekt07s.collapse_all(tr-tr,VS.110).gifReferenceAssemblyFromVbaProject

Visual Studio'da veya Visual C#'ta, herhangi bir konak öğesinin ReferenceAssemblyFromVbaProject özelliğini True olarak ayarladığında, Visual Studio aşağıdaki görevleri gerçekleştirir:

  1. Özelleştirme derlemesi için tür kitaplığı yaratr ve tür kitaplığını derlemeye katıştırır.

  2. Belgedeki VBA projesinde aşağıdaki tür kitaplıklarına başvurur ekler.

    • Özelleştirme derlemeniz için tür kitaplığı.

    • Office için Microsoft Visual Studio Araçları Execution Engine 9.0 Tür Kitaplığı.Bu tür kitaplık Office için Visual Studio Araçları çalışma zamanı modülü içindedir.

ReferenceAssemblyFromVbaProject özelliği, yeniden False olarak ayarlandığında, Visual Studio aşağıdaki görevleri gerçekleştirir:

  1. Belgedeki VBA projesinden tür kitaplıkları başvurularını kaldırır.

  2. Gömülü tür kitaplığını derlemeden kaldırır.

Sorun Giderme

Aşağıdaki tabloda, bazı ortak hatalar ve hataları düzeltmek için öneriler listelenmiştir.

Hata

Öneri:

EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini ayarladıktan sonra, hata iletisi belgenin VBA projesi içermediğini veya belgedeki VBA projesine erişim için izninizin olmadığını belirtir.

Projedeki belgenin en azından bir VBA makrosu olduğuna, VBA projesinin çalışması için yeterli güvene sahip olduğuna ve VBA projesinin bir parolayla korunmadığına emin olun.

EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini ayarladıktan sonra, hata iletisi GuidAttribute bildiriminin eksik veya bozuk olduğunu belirtir.

GuidAttribute bildiriminin, projenizdeki AssemblyInfo.cs veya AssemblyInfo.vb dosyasında olduğuna ve bu özniteliğin geçerli GUID'ye ayarlı olduğuna emin olun.

EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini ayarladıktan sonra, hata iletisi AssemblyVersionAttribute tarafından belirlenen sürüm numarasının geçersiz olduğunu belirtir.

AssemblyInfo.cs veya AssemblyInfo.vb dosyasındaki AssemblyVersionAttribute bildiriminin geçerli bir derleme sürümü numarasına ayarlı olduğuna emin olun.Geçerli derleme sürümü numaraları hakkında bilgi için, bkz. AssemblyVersionAttribute sınıfı.

Özelleştirme derlemesini yeniden isimlendirdiğinizde, özelleştirme derlemesini çağıran VBA kodu çalışmaz.

Eğer özelleştirme derlemesini, onu VBA'de oluşturduktan sonra yeniden isimlendirirseniz, belgedeki VBA projesi ve özelleştirme derlemeniz arasındaki bağ bozulur. Bu durumu çözmek için, projenizdeki ReferenceFromVbaAssembly özelliğini False olarak değiştirin ve yeniden True olarak ayarlayın ve ardından VBA kodundaki eski derleme ismine olan başvuruları yeni derleme ismiyle değiştirin.

Ayrıca bkz.

Görevler

Nasıl yapılır: Visual Basic projesindeki vba koduna açığa çıkaran

Nasıl yapılır: Visual C# projesi, vba kodu göstermek

İzlenecek yol: Visual Basic projesindeki vba kodu arama

İzlenecek yol: Visual C# projesi, vba kodu arama

Kavramlar

VBA ve Visual Studio'da Office Çözümleri Karşılaştırması

Diğer Kaynaklar

Office Çözümleri Tasarlama ve Oluşturma

Belge Düzeyi Özelleştirmelerini Programlama