Access ile VBA Kullanarak Word Dosyası Doldurmak


Word dosyalarını otomatik olarak Access ile doldurmak mümkün. Bunun için birkaç yöntem var. Benim de ofiste çalışırken kullandığım bu yöntemleri sizinle paylaşmak istedim. Senaryo şu şekilde olacak: Elimizde bir form dosyası var. Biz bu form dosyasının ilgili bölümlerini Access ile otomatik bir şekilde dolduracağız. Umarım işinizi görür.

Bu kodların çalışabilmesi için VBA Penceresinde Tools > References altından Microsoft Word XX.0 Object Library seçeneğini işaretlememiz gerekiyor. Bende sürüm 16 yüklü olduğu için Microsoft Word 16.0 Object Library seçili.
Sub ve End Sub arasında kalan alana kodlarımızı yazmaya başlayalım.
Öncelikle VBA kodunda bazı tanımlamalar yapmamız gerekecek.
Dim Word As Word.Application
Dim TemaSec As String
Dim wdRng As Word.Range
Dim wAlan As Range
Dim Resimyolu As String
Dim Alternatif As String
Dim newPicture
Word kelimesinin bir Word Belgesi olduğunu tanımladık. Doldurmak istediğimiz Word dosyasını seçmek için bir tanımlama yaptık ve birkaç farklı örnek göstermek istediğim için iki farklı Range tanımlaması yaptık. Resim eklemek için de ayrıca iki değişken tanımladık.

Öncelikle Temamızı seçelim:

Çalıştığınız Access projesinin yanına bir dosya oluşturun ve adını Tema olarak değiştirin. CurrentProject.Path komutu ile dosyamızın hangi klasörde olduğunu yazmamıza gerek kalmıyor. Ayrıca bu yöntemle yarın öbür gün klasörün yerini değiştirdiğiniz zaman kodlarda değişiklik yapmadan çalışma şansımız oluyor.
TemaSec = CurrentProject.Path & "/Tema/WordTema1.docx"
Hangi Word dosyası üzerinde değişiklik yapacağımızı seçtiğimize göre gerekli tanımlamaları yapalım.
    Set WordApp = GetObject(, "Word.Application")
    If Err.Number <> 0 Then
        Set WordApp = CreateObject("Word.Application")
       End If
       On Error GoTo ErrHandler
      
       WordApp.visible = True
       WordApp.WindowState = wdWindowStateMaximize
       WordApp.Documents.Add Template:=TemaSec, NewTemplate:=False

   With WordApp.Selection

' Calisilacak Alan

  End With

Bookmarks (Yer İşaretleri) ile değiştirme

En sevdiğim yöntem ile başlamak istedim. Word ile oluşturduğumuz formlara yer işaretleri ekleyerek değişiklik işlemleri yapabiliyoruz. Tema dosyası açıldığı zaman tanımlamalar görünmediği için bu yöntemi tercih ediyorum. En büyük eksisi uzun yazıları göndermek istediğimiz zaman hata veriyor. Karekter sınırı tahminime göre 255, tam sınırı bulabilirsem yazının bu kısmını güncellerim.

Yukarıda Tema seçimi yaparken yazdığımız kodda Word belgesinin adını "WordTema1" olarak yazmıştım. Office'in yeni sürümlerinde Word belgesi uzantısı ".doc" şeklinde değil, ".docx" şeklinde. Buna da dikkat etmek gerekiyor. Word belgemizi açalım. Ben Office 365 kullanıyorum. Eğer benim gibi yeni bir Office sürümü kullanıyorsanız "Ekle > Bağlantılar > Yer İşaretleri" yolunu izleyerek Yer İşareti penceresini açabilirsiniz.

Değiştirmek istediğiniz alana gelin ve Yer işaretinizi ekleyin. Benim bu örnekte ekleyeceğim yer işaretinin adı "Adres" olacak.

' Calisilacak Alan kısmını silip aşağıdaki kodları ekleyebilirsiniz
   .GoTo what:=wdGoToBookmark, Name:="Adres"
   .TypeText "Adres bilgileri bu alana yazılıyor."
Bu sade örneği IF - ELSE kullanarak biraz değiştirmek gerekirse ;
    If IsNull(Forms("FormAdi").AdresTextbox) Then
     .GoTo what:=wdGoToBookmark, Name:="Adres"
     .TypeText "Adres Bilgisi Girilmemiş"
     Else
     .GoTo what:=wdGoToBookmark, Name:="Adres"
     .TypeText Forms("FormAdi").[AdresTextbox]
     End If
Yukarıdaki örnekte eğer "FormAdi" isimli formumda bulunan "AdresTextbox" isimli Metin Kutusu boş ise oluşturduğumuz Adres etiketinin bulunduğu yere "Adres Bilgisi Girilmemiş" yazıyor. Eğer boş değilse de yine aynı Metin kutusunun içindeki değeri yazıyor.

Bul ve Değiştir Komutu ile Değiştirme

Bul ve Değiştir örneğini kullanmadan önce tanımlama yaptığımız kısıma bir satırlık kod eklememiz gerekiyor.
    Set WordApp = GetObject(, "Word.Application")
    If Err.Number <> 0 Then
        Set WordApp = CreateObject("Word.Application")
       End If
       On Error GoTo ErrHandler
      
       WordApp.visible = True
       WordApp.WindowState = wdWindowStateMaximize
       WordApp.Documents.Add Template:=TemaSec, NewTemplate:=False
       For Each wdRng In WordApp.ActiveDocument.StoryRanges
   With WordApp.Selection

' Calisilacak Alan

  End With
Word Dosyamızı (WordTema1) açıyoruz. Bu sefer tanımlamalarımız görünür olacak. Word dosyası içerisinde geçen herhangi bir kelimeyi değiştirmemiz mümkün. "Ece" kelimesini değiştirmek istediğimizde "Gece" kelimesini de değiştireceği için sıkıntı yaşayabiliriz. Ben bu yüzden <<Adres>> gibi belge içinde geçmesi çok düşük ihtimal olan etiketler kullanıyorum. Eğer formumuzda Adres alanı varsa karşısındaki bölüme <<Adres>> yazalım.

' Calisilacak Alan kısmını silip aşağıdaki kodları ekleyebilirsiniz.
       With wdRng.Find
        .Text = "<<Adres>>"
        .Replacement.Text = "Değiştirilmiş Metin"
        .Wrap = wdFindContinue
        .Execute Replace:=wdReplaceAll
       End With
Yine bu örneği biraz geliştirmek gerekirse;
       If IsNull(Forms("FormAdi").AdresTextbox) Then
       With wdRng.Find
        .Text = "<<Adres>>"
        .Replacement.Text = "Adres Bilgisi Girilmemiş"
        .Wrap = wdFindContinue
        .Execute Replace:=wdReplaceAll
       End With
     Else
      With wdRng.Find
        .Text = "<<Adres>>"
        .Replacement.Text = Forms("FormAdi").AdresTextbox
        .Wrap = wdFindContinue
        .Execute Replace:=wdReplaceAll
       End With
     End If
Yukarıdaki örnekte eğer "FormAdi" isimli formumda bulunan "AdresTextbox" isimli Metin Kutusu boş ise oluşturduğumuz Adres etiketinin bulunduğu yere "Adres Bilgisi Girilmemiş" yazıyor. Eğer boş değilse de yine aynı Metin kutusunun içindeki değeri yazıyor.

Üst Bilgi ve Alt Bilgi Bölümünü Otomatik Olarak Değiştirmek Mümkün mü ?

Yukarıda verdiğim kodlar ile değişiklik yapmak istediğinizde Bookmark (Yer İşareti) çalışmayacak, "bul ve değiştir" komutu da üst ve alt bilgide arama yapmayacak. Yani yukarıda verdiğim kodlar ile Üst bilgi ve Alt bilgi alanında değişiklik yapamazsınız. Eğer Alt Bilgi ve Üst Bilgi alanında değişiklik yapmak istiyorsanız aşağıdaki kodu kullanmanız gerekiyor.

'Calisilacak Alan kismina gelmesi gereken kod;
Set wAlan = WordApp.ActiveDocument.Bookmarks("Adres").Range
wAlan.Text = Forms("FormAdi").[AdresTextbox].Value
Yazının başında "wAlan" değişkenini Range olarak tanımlamıştık.

Word Belgesindeki Onay Kutusunu Otomatik Olarak İşaretlemek Mümkün Mü ?

Onay kutusunu otomatik olarak işaretlemek için önce Word dosyası içindeki onay kutusuna isim vermemiz gerekiyor. Eğer eski tarz bir onay kutunuz var ise iki kere tıklayıp yer işaretine bir isim vermeniz gerekiyor. Bizim örneğimizde bu isim "Tamam" olsun.

'Calisilacak Alan kismina gelmesi gereken kod;
WordApp.ActiveDocument.FormFields("Tamam").CheckBox.Value = True

Resim Eklemek Mümkün mü ?

Resim eklemek için 'Calisilacak Alan kismina gelmesi gereken kod;
Resimyolu = CurrentProject.Path & "\Tema\OrnekResim.jpg"               

   .GoTo what:=wdGoToBookmark, Name:="resim"
    Set newPicture = .InlineShapes.AddPicture(FileName:=Resimyolu, LinkToFile:=False, SaveWithDocument:=True)
        With newPicture
          'Resimi yazının önüne getirmesini sağlıyor
          .ConvertToShape
          'Ratio oranlarının korunmasını sağlıyor
          .LockAspectRatio = msoTrue
         End With

Yazının Rengini Değiştirmek Mümkün mü ?

Yazı rengini değiştirmek için kullanılması gereken küçük bir kod var.

'Calisilacak Alan kismina gelmesi gereken kod;
.Font.ColorIndex = wdRed
İsterseniz Değişkenler İçerisinde de kullanabilirsiniz
If IsNull(Forms("FormAdi").AdresTextbox) Then
     .GoTo what:=wdGoToBookmark, Name:="Adres"
     .TypeText "Adres Bilgisi Girilmemiş"
     .Font.ColorIndex = wdRed
     Else
     .GoTo what:=wdGoToBookmark, Name:="Adres"
     .TypeText Forms("FormAdi").[AdresTextbox]
     .Font.ColorIndex = wdBlack
     End If
RGB Renkler kullanmak isterseniz;
.Font.Color = RGB(255, 0, 0)
Yazıyı Kalın yazmak isterseniz;
.Font.Bold = True
gibi kodları da kullanabilirsiniz.

Belgeyi Kaydetmek İçin

Gerekli düzenlemeleri yaptıktan sonra belgeyi kaydetmek için kullanılacak kod ;
DoEvents

   WordApp.Activate
   WordApp.ActiveDocument.SaveAs2 CurrentProject.Path & "/Kaydet/Deneme.pdf", 17
   WordApp.ActiveDocument.SaveAs2 CurrentProject.Path & "/Kaydet/Deneme.docx"
   WordApp.ActiveDocument.Close      

   Set WordApp = Nothing
   Exit Sub

ErrHandler:

Set WordApp = Nothing
Eğer Bul ve Değiştir tekniğini kullandıysak ErrHandler: altındaki Set WordApp = Nothing ifadesinden sonra aşağıdaki ifadeleri eklememiz gerekiyor;
Set wdRng = Nothing
Next wdRng
Öncelikle Access dosyasının bulunduğu dizine "Kaydet" isimli bir klasör oluşturamız gerekecek. Yukarıdaki örnek farklı kaydet seçeneği ile kayıt işlemlerini yapıyor. PDF ve Word dosyası olarak ayrı ayrı iki dosya halinde kayıt almamızı sağlıyor. PDF dosyasına ihtiyacınız yoksa "Deneme.pdf" ifadesinin bulunduğu satırı silebilirsiniz. Virgülden sonraki 17 sayısı PDF olarak kaydet anlamına geliyor.

Yorumlar

Lütfen bizimle fikrinizi paylaşmaktan çekinmeyin. Yorumlarınız bizim için önemli.