VBA ve belge düzeyi özelleştirmelerini birleştirme

Visual Basic for Applications (VBA) kodunu, Microsoft Office Word veya Microsoft Office Excel için belge düzeyinde özelleştirmenin parçası olan bir belgede kullanabilirsiniz. Özelleştirme derlemesinden belgedeki VBA kodunu çağırabilir veya projenizi belgedeki VBA kodunu özelleştirme derlemesindeki kodu çağıracak şekilde yapılandırabilirsiniz.

Şunlar için geçerlidir: Bu konudaki bilgiler Excel ve Word için belge düzeyi projeleri için geçerlidir. Daha fazla bilgi için bkz. Office uygulaması ve proje türüne göre kullanılabilen özellikler.

Belge düzeyinde özelleştirmede VBA kodunun davranışı

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

Çözümü çalıştırdığınızda, hem VBA'daki hem de özelleştirme derlemesindeki olay işleyicileri belgede tetiklenen olayları alır ve her iki kod kümesi de çalışır. Hangi kodun diğer koddan önce çalıştırılacağını önceden belirleyemezsiniz; her bir durumda test yoluyla bunu belirlemeniz gerekir. İki kod kümesi dikkatli bir şekilde eşgüdümlü ve test edilmediyse beklenmeyen sonuçlar alabilirsiniz.

Özelleştirme derlemesinden VBA kodunu çağırma

Word belgelerinde makroları çağırabilir ve Excel çalışma kitaplarındaki makroları ve işlevleri çağırabilirsiniz. Bunu yapmak için aşağıdaki yöntemlerden birini kullanın:

  • Word için sınıfının yöntemini çağırın RunApplication .

  • Excel için sınıfının yöntemini çağırın RunApplication .

    Her yöntem için, ilk parametre çağırmak istediğiniz makronun veya işlevin adını tanımlar ve kalan isteğe bağlı parametreler makroya veya işleve geçirılacak parametreleri belirtir. İlk parametre, Word ve Excel için farklı biçimlere sahip olabilir:

  • Word için, ilk parametre şablon, modül ve makro adının herhangi bir bileşimi olabilecek bir dizedir. Belge adını belirtirseniz, kodunuz yalnızca geçerli bağlamla ilgili belgelerde makro çalıştırabilir; herhangi bir belgedeki herhangi bir makroyu değil.

  • Excel için, ilk parametre makro adını belirten bir dize, işlevin nerede olduğunu belirten bir Range dize veya kayıtlı DLL (XLL) işlevi için yazmaç kimliği olabilir. Bir dize geçirirseniz, dize etkin sayfa bağlamında değerlendirilir.

    Aşağıdaki kod örneğinde, Excel için belge düzeyi projesinden adlı MyMacro makronun nasıl çağrılacakları gösterilmektedir. Bu örnekte, içinde MyMacroSheet1tanımlandığı varsayılır.

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# dilinde isteğe bağlı parametreler yerine genel missing değişkeni kullanma hakkında bilgi için bkz . Office çözümlerinde kod yazma.

VBA'dan belge düzeyi özelleştirmelerinde kod çağırma

Word veya Excel için belge düzeyinde bir proje yapılandırarak belgedeki Visual Basic for Applications (VBA) kodunun özelleştirme derlemesindeki kodu çağırabilmesini sağlayabilirsiniz. Bu, aşağıdaki senaryolarda kullanışlıdır:

  • Belgedeki mevcut VBA kodunu, aynı belgeyle ilişkilendirilmiş belge düzeyi özelleştirmesindeki özellikleri kullanarak genişletmek istiyorsunuz.

  • Belge düzeyinde bir özelleştirmede geliştirdiğiniz hizmetleri, belgeye VBA kodu yazarak hizmetlere erişebilen son kullanıcıların kullanımına açmak istiyorsunuz.

    Visual Studio'daki Office geliştirme araçları VSTO Eklentileri için de benzer bir özellik sağlar. VSTO Eklentisi geliştiriyorsanız, diğer Microsoft Office çözümlerinden VSTO Eklentinizdeki kodu çağırabilirsiniz. Daha fazla bilgi için bkz . Diğer Office çözümlerinden VSTO Eklentileri'nde kod çağırma.

Not

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

Gereksinimler

VBA kodunu özelleştirme derlemesine çağırmak üzere etkinleştirebilmeniz için önce projenizin aşağıdaki gereksinimleri karşılaması gerekir:

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

    • Word için: .docm veya .doc

    • Excel için: .xlsm, .xltm, .xls veya .xlt

  • Belge, içinde VBA kodu bulunan bir VBA projesi içermelidir.

  • Belgedeki VBA kodunun kullanıcıdan makroları etkinleştirmesini istemeden çalışmasına izin verilmelidir. Word veya Excel için Güven Merkezi ayarlarında Office projesinin konumunu güvenilen konumlar listesine ekleyerek VBA kodunun çalıştırılmasına güvenebilirsiniz.

  • Office projesi, VBA'ya açıkladığınız bir veya daha fazla genel üye içeren en az bir genel sınıf içermelidir.

    Yöntemleri, özellikleri ve olayları VBA'da kullanıma salayabilirsiniz. Kullanıma oluşturduğunuz sınıf, bir konak öğesi sınıfı (Word veya ThisWorkbookSheet1 Excel için gibiThisDocument) veya projenizde tanımladığınız başka bir sınıf olabilir. Konak öğeleri hakkında daha fazla bilgi için bkz . Konak öğelerine ve konak denetimlerine genel bakış.

VBA kodunu özelleştirme derlemesine çağırmak için etkinleştirme

Özelleştirme derlemesindeki üyeleri belgedeki VBA kodunda kullanıma sunmanın iki farklı yolu vardır:

  • Visual Basic projesindeki konak öğesi sınıfının üyelerini VBA'ya kullanıma sunun. Bunu yapmak için, konak öğesi (belge, çalışma sayfası veya çalışma kitabı) tasarımcıda açıkken Özellikler penceresinde konak öğesinin EnableVbaCallers özelliğini True olarak ayarlayın. Visual Studio, VBA kodunun sınıfın üyelerini çağırmasını sağlamak için gereken tüm işleri otomatik olarak gerçekleştirir.

  • Visual C# projesindeki herhangi bir genel sınıftaki üyeleri veya Visual Basic projesindeki konak dışı bir öğe sınıfındaki üyeleri VBA'ya kullanıma salayabilirsiniz. Bu seçenek, VBA'ya hangi sınıfları sunacağınız konusunda size daha fazla özgürlük sağlar, ancak aynı zamanda daha fazla el ile adım gerektirir.

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

    1. sınıfını COM'da kullanıma sunma.

    2. VBA'ya açıkladığınız sınıfın bir örneğini döndürmek için projenizdeki bir konak öğesi sınıfının GetAutomationObject yöntemini geçersiz kılın.

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

    Ayrıntılı yönergeler için bkz. Nasıl yapılır: Visual Basic projesinde kodu VBA'ya sunma ve Nasıl yapılır: Visual C# projesinde kodu VBA'ya sunma.

    EnableVbaCallers ve ReferenceAssemblyFromVbaProject özellikleri tasarım zamanında yalnızca Özellikler penceresinde kullanılabilir; çalışma zamanında kullanılamaz. Özellikleri görüntülemek için Visual Studio'da bir konak öğesinin tasarımcısını açın. Bu özellikleri ayarladığınızda Visual Studio'nın gerçekleştirdiği belirli görevler hakkında daha fazla bilgi için bkz . Konak öğesi özellikleri tarafından gerçekleştirilen görevler.

Not

Çalışma kitabı veya belge zaten VBA kodu içermiyorsa veya belgedeki VBA kodunun çalıştırılmasına güvenilmiyorsa, EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini True olarak ayarladığınızda bir hata iletisi alırsınız. Bunun nedeni, Visual Studio'un bu durumda belgedeki VBA projesini değiştirememesidir.

Özelleştirme derlemesine çağrı yapmak için VBA kodundaki üyeleri kullanma

Projenizi VBA kodunun özelleştirme derlemesine çağrılmasını sağlayacak şekilde yapılandırdıktan sonra, Visual Studio belgedeki VBA projesine aşağıdaki üyeleri ekler:

  • Tüm projeler için Visual Studio adlı GetManagedClassgenel bir yöntem ekler.

  • Bir konak öğesi sınıfının üyelerini EnableVbaCallers özelliğini kullanarak kullanıma sunduğun Visual Basic projeleri için Visual Studio, VBA projesindeki ThisDocument, ThisWorkbook, Sheet1, Sheet2veya Sheet3 modülüne adlı CallVSTOAssembly bir özellik de ekler.

    Projede VBA koduna CallVSTOAssembly açıkladığınız sınıfın genel üyelerine erişmek için özelliğini veya GetManagedClass yöntemini kullanabilirsiniz.

Not

Çözümünüzü geliştirir ve dağıtırken, VBA kodunu ekleyebileceğiniz belgenin birkaç farklı kopyası vardır. Daha fazla bilgi için bkz . Belgeye VBA kodu ekleme yönergeleri.

Visual Basic projesinde CallVSTOAssembly özelliğini kullanma

Konak öğesi sınıfına CallVSTOAssembly eklediğiniz genel üyelere erişmek için özelliğini kullanın. Örneğin, aşağıdaki VBA makro bir Excel çalışma kitabı projesinde Sheet1 sınıfında tanımlanan adlı MyVSTOMethod bir yöntemi çağırır.

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

Bu özellik, özelleştirme derlemesine doğrudan yöntemini kullanmaktan daha kolay bir şekilde çağrılır GetManagedClass . CallVSTOAssembly VBA'ya açık olan konak öğesi sınıfını temsil eden bir nesne döndürür. Döndürülen nesnenin üyeleri ve yöntem parametreleri IntelliSense'te görünür.

özelliği, CallVSTOAssembly aşağıdaki koda benzer bir bildirime sahiptir. Bu kod, VBA adlı ExcelWorkbook1 bir Excel çalışma kitabı projesinde konak öğesi sınıfını kullanıma Sheet1 sunulduğunuz varsayılır.

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

GetManagedClass yöntemini kullanma

Genel GetManagedClass yöntemi kullanmak için, GetAutomationObject yöntemini geçersiz kılmanızı içeren konak öğesi sınıfına karşılık gelen VBA nesnesini geçirin. Ardından, VBA'ya açıkladığınız sınıfa erişmek için döndürülen nesneyi kullanın.

Örneğin, aşağıdaki VBA makro, adlı MyVSTOMethod bir Excel çalışma kitabı projesindeki Sheet1 konak öğesi sınıfında tanımlanan adlı ExcelWorkbook1bir 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'ya açık olan sınıfını temsil eden bir nesne döndürür. Döndürülen nesnenin üyeleri ve yöntem parametreleri IntelliSense'te görünür.

Belgeye VBA kodu ekleme yönergeleri

Belge düzeyi özelleştirmesine çağrılar içeren VBA kodu ekleyebileceğiniz belgenin birkaç farklı kopyası vardır.

Çözümünüzü geliştirir ve test ederken, Visual Studio'da projenizin hatalarını ayıklarken veya çalıştırırken açılan belgeye VBA kodu yazabilirsiniz (derleme çıktı klasöründeki belge). Ancak, visual Studio derleme çıktı klasöründeki belgeyi ana proje klasöründeki belgenin bir kopyasıyla değiştirdiğinden, bu belgeye eklediğiniz VBA kodunun üzerine projeyi bir sonraki derlemenizde yazılır.

Çözümün hatalarını ayıklarken veya çalıştırırken belgeye eklediğiniz VBA kodunu kaydetmek istiyorsanız VBA kodunu proje klasöründeki belgeye kopyalayın. Derleme işlemi hakkında daha fazla bilgi için bkz . Office çözümleri oluşturma.

Çözümünüzü dağıtmaya hazır olduğunuzda, VBA kodunu ekleyebileceğiniz üç ana belge konumu vardır.

Geliştirme bilgisayarındaki proje klasöründe

Belgedeki VBA kodu ve özelleştirme kodu üzerinde tam denetime sahipseniz bu konum kullanışlıdır. Belge geliştirme bilgisayarında olduğundan, özelleştirme kodunu değiştirirseniz VBA kodunu kolayca değiştirebilirsiniz. Belgenin bu kopyasına eklediğiniz VBA kodu, çözümünüzü oluştururken, hata ayıklarken ve yayımlarken belgede kalır.

VBA kodunu tasarımcıda açıkken belgeye ekleyemezsiniz. Önce belgeyi tasarımcıda kapatmanız ve sonra belgeyi doğrudan Word veya Excel'de açmanız gerekir.

Dikkat

Belge açıldığında çalışan VBA kodu eklerseniz, nadir durumlarda bu kod belgeyi bozabilir veya tasarımcıda açılmasını engelleyebilir.

Yayımlama veya yükleme klasöründe

Bazı durumlarda, VBA kodunu yayımlama veya yükleme klasöründeki belgeye eklemek uygun olabilir. Örneğin, VBA kodu Visual Studio yüklü olmayan bir bilgisayarda farklı bir geliştirici tarafından yazılmış ve test edilmişse bu seçeneği belirleyebilirsiniz.

Kullanıcılar çözümü doğrudan yayımlama klasöründen yüklerse, çözümü her yayımladığınızda belgeye VBA kodunu eklemeniz gerekir. Çözümü yayımladığınızda Visual Studio, yayımlama konumunda belgenin üzerine yazar.

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 belgeye VBA kodunu eklemekten kaçınabilirsiniz. Yayımlama güncelleştirmesi yayımlama klasöründen yükleme klasörüne taşınmaya hazır olduğunda, belge dışındaki tüm dosyaları yükleme klasörüne kopyalayın.

Son kullanıcı bilgisayarında

Son kullanıcılar, belge düzeyi özelleştirmesinde sağladığınız hizmetlere çağrı yapan VBA geliştiricileriyse, belgenin kopyalarındaki özelliğini veya GetManagedClass yöntemini kullanarak CallVSTOAssembly kodunuzu nasıl çağıracaklarını onlara anlatabilirsiniz. Güncelleştirmeleri çözüme yayımladığınızda, belge yayımlama güncelleştirmeleri tarafından değiştirilmediğinden son kullanıcı bilgisayarındaki belgedeki VBA kodunun üzerine yazılmaz.

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.

Enablevbacallers

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

  1. konak öğesi sınıfına ComClassAttribute ve ComVisibleAttribute özniteliklerini 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 false olarak ayarladığınızda Visual Studio aşağıdaki görevleri gerçekleştirir:

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

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

    Not

    Visual Studio, ReferenceAssemblyFromVbaProject özelliğini otomatik olarak False olarak ayarlamaz. Özellikler penceresini kullanarak bu özelliği el ile False olarak ayarlayabilirsiniz.

Referenceassemblyfromvbaproject

Visual Basic veya Visual C# projesindeki herhangi bir konak öğesinin ReferenceAssemblyFromVbaProject özelliği True olarak ayarlandığında, Visual Studio aşağıdaki görevleri gerçekleştirir:

  1. Özelleştirme derlemesi için bir tür kitaplığı oluşturur ve tür kitaplığını derlemeye ekler.

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

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

    • Office Yürütme Altyapısı 9.0 için Microsoft Visual Studio Araçları Tür Kitaplığı. Bu tür kitaplığı, Office çalışma zamanı için Visual Studio Araçları eklenmiştir.

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

  3. Belgedeki VBA projesinden tür kitaplığı başvurularını kaldırır.

  4. Katıştırılmış tür kitaplığını derlemeden kaldırır.

Sorun giderme

Aşağıdaki tabloda bazı yaygın hatalar ve hataları düzeltmeye yönelik öneriler listelemektedir.

Hata Öneri
EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini ayarladıktan sonra, bir hata iletisi belgenin VBA projesi içermediğini veya belgedeki VBA projesine erişme izniniz olmadığını belirtir. Projedeki belgenin en az bir VBA makrosu içerdiğinden, VBA projesinin çalıştırmak için yeterli güvene sahip olduğundan ve VBA projesinin parolayla korunmadığından emin olun.
EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini ayarladıktan sonra, bir hata iletisi bildirimin GuidAttribute eksik veya bozuk olduğunu belirtir. Bildirimin GuidAttribute projenizdeki AssemblyInfo.cs veya AssemblyInfo.vb dosyasında bulunduğundan ve bu özniteliğin geçerli bir GUID olarak ayarlandığından emin olun.
EnableVbaCallers veya ReferenceAssemblyFromVbaProject özelliğini ayarladıktan sonra, tarafından belirtilen AssemblyVersionAttribute sürüm numarasının geçerli olmadığını belirten bir hata iletisi görüntülenir. AssemblyVersionAttribute Projenizdeki AssemblyInfo.cs veya AssemblyInfo.vb dosyasındaki bildirimin geçerli bir derleme sürüm numarasına ayarlandığından emin olun. Geçerli derleme sürüm numaraları hakkında bilgi için sınıfına AssemblyVersionAttribute bakın.
Özelleştirme derlemesini yeniden adlandırdıktan sonra, özelleştirme derlemesine çağrı yapan VBA kodu çalışmayı durdurur. Özelleştirme derlemesini VBA kodunda kullanıma sunmanızın ardından adını değiştirirseniz, belgedeki VBA projesi ile özelleştirme derlemeniz arasındaki bağlantı kesilir. Bu sorunu düzeltmek için projenizdeki ReferenceFromVbaAssembly özelliğini False olarak değiştirin ve ardından True olarak geri dönün ve VBA kodundaki eski derleme adına yapılan başvuruları yeni derleme adıyla değiştirin.