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 newPictureWord 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 IfYukarı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 WithWord 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 WithYine 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 IfYukarı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 IfRGB 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 = NothingEğ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