Klasördeki pdf dosyaları makro ile excel içinden yazıcıya göndermek

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,781
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Merhaba Arkadaşlar,
Klasördeki pdf dosyaları makro ile excel içinden yazıcıya göndermek istiyorum. Uygun makro bulamadım.
Saygılarımla
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,459
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Merhaba Arkadaşlar,
Klasördeki pdf dosyaları makro ile excel içinden yazıcıya göndermek istiyorum. Uygun makro bulamadım.
Saygılarımla

Aşağıda, belirli bir klasördeki tüm PDF dosyalarını yazdırmak için kullanabileceğiniz bir VBA makrosu örneği bulabilirsiniz.
VBA Makrosu
  1. Excel’de VBA Düzenleyicisini Açın:
    • Excel’de herhangi bir çalışma kitabını açın.
    • ALT + F11 tuşlarına basarak VBA Düzenleyicisini açın.
  2. Yeni Bir Modül Ekleyin:
    • VBA Düzenleyicisinde, Insert menüsünden Module seçeneğine tıklayarak yeni bir modül ekleyin.
  3. Aşağıdaki Kodları Modüle Yapıştırın:

Sub PrintPDFsInFolder()
Dim folderPath As String
Dim fileName As String
Dim pdfApp As Object

' Klasör yolunu belirleyin
folderPath = "C:\Klasör\Yolu\" ' Bu kısmı kendi klasör yolunuza göre değiştirin

' Adobe Acrobat uygulamasını açın
Set pdfApp = CreateObject("AcroExch.App")

' Klasördeki tüm PDF dosyalarını döngüye alın
fileName = Dir(folderPath & "*.pdf")
Do While fileName <> ""
' PDF dosyasını yazdırın
pdfApp.ExecuteMenuItem ("Print")

' Bir sonraki dosyaya geçin
fileName = Dir
Loop

' Adobe Acrobat uygulamasını kapatın
pdfApp.Exit
Set pdfApp = Nothing

MsgBox "PDF dosyaları yazdırıldı!", vbInformation
End Sub

  1. Klasör Yolunu Düzenleyin:
    • Kodda folderPath değişkenini PDF dosyalarınızın bulunduğu klasörün yolu ile değiştirin. Örneğin, "C:\PDFler\".
  2. Makroyu Çalıştırın:
    • VBA Düzenleyicisinde, F5 tuşuna basarak makroyu çalıştırabilirsiniz.
    • Kod, belirttiğiniz klasördeki tüm PDF dosyalarını açacak ve yazdıracaktır.
Notlar:
  • Bu makro Adobe Acrobat Reader veya başka bir PDF okuyucu gerektirir. PDF dosyalarını yazdırmak için Adobe Acrobat’ın kurulu ve düzgün çalışıyor olması gerekmektedir.
  • Makro çalışırken dikkatli olun, çünkü PDF dosyaları yazdırılacak ve yazıcınızda çıktı alacaktır.
 

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,781
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Sayın Cems,
İlginize teşekkür ederim.
Kod:
Sub Baski_Yap1()
    Dim wf As WorksheetFunction
    Dim Yol As String
    Dim fileName As String
    Dim pdfApp As Object
    On Error Resume Next
    Set wf = WorksheetFunction
    
    dd = Cells(2, 2)    'klasör adı
    Yol = ThisWorkbook.Path & "\" & dd & "\"
        For x = 1 To 1
            aa = wf.VLookup(x, Range("A:B"), 2, 0)  '   pdf dosyanın adı
            Yol = aa & ".pdf"
            CreateObject("Shell.Application").Namespace(0).ParseName(Yol).InvokeVerb ("Print")
            AppActivate "pdf24-Reader", True
        Next x
End Sub
Oluşturduğum makroya uyarlayamadım, maalesef.
Saygılarımla
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,459
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Sayın Tevfik_Kursun ;


Hatalar ve Öneriler
  1. CreateObject("Shell.Application").Namespace(0) Hatası:
    • Namespace(0) ifadesi, Windows gezgininde kök (root) dizini ifade eder ve dosya yolu olarak kullanılamaz. Bunun yerine, doğru dizini belirlemeniz gerekir.
  2. Yol = aa & ".pdf" Satırı:
    • Burada Yol değişkeni, dosya adını değil, dosya yolunu ifade etmeli. Ayrıca, dosyanın tam yolu ile birlikte kullanmalısınız.
  3. AppActivate "pdf24-Reader", True:
    • AppActivate komutu, pencere başlığını hedef alır ve bu başlık, açık olan uygulamanızın başlığına göre değişebilir. Eğer hedef uygulamanızın başlığı tam olarak belirli değilse, bu satır çalışmayabilir.
  4. Dim Eksikliği:
    • dd, aa, ve x değişkenlerinin Dim ile tanımlanması gerekir. Bu, kodunuzun daha güvenilir ve anlaşılır olmasını sağlar.
  5. On Error Resume Next:
    • Hataları gizlemek yerine, hata ayıklama yapmanız daha iyi olabilir. Bu kodu, hangi hataların oluştuğunu anlamak için kullanmamak daha iyi olabilir.
Düzeltilmiş Kod
Aşağıda, kodunuzun düzeltilmiş bir versiyonu bulunmaktadır:

Sub Baski_Yap1()
Dim wf As WorksheetFunction
Dim Yol As String
Dim fileName As String
Dim pdfApp As Object
Dim dd As String
Dim aa As String
Dim x As Integer

' Hata denetimi devreye al
On Error GoTo ErrorHandler

' WorksheetFunction nesnesini al
Set wf = Application.WorksheetFunction

' Klasör yolunu belirle
dd = Cells(2, 2).Value ' Klasör adı
Yol = ThisWorkbook.Path & "\" & dd & "\"

' VLOOKUP işlemi ve dosya baskısı
For x = 1 To 1
aa = wf.VLookup(x, Range("A:B"), 2, False) ' PDF dosyanın adı
fileName = Yol & aa & ".pdf"

' Dosyanın mevcut olup olmadığını kontrol et
If Dir(fileName) <> "" Then
' Dosyayı yazdır
CreateObject("Shell.Application").Namespace(ThisWorkbook.Path).ParseName(fileName).InvokeVerb ("Print")
' Beklemek için küçük bir süre bırak
Application.Wait Now + TimeValue("00:00:05")
Else
MsgBox "Dosya bulunamadı: " & fileName
End If
Next x

Exit Sub

ErrorHandler:
MsgBox "Bir hata oluştu: " & Err.Description
End Sub

Açıklamalar:
  1. Hata Yönetimi: On Error GoTo ErrorHandler kullanarak hataları daha etkili bir şekilde ele alabilirsiniz.
  2. Dosya Yolu: fileName değişkenini doğru şekilde belirleyerek dosya yolunu kullanın.
  3. Dosya Var Kontrolü: Dir fonksiyonunu kullanarak dosyanın var olup olmadığını kontrol edin.
  4. Bekleme: Yazdırma işlemi sonrasında uygulamanın yanıt verebilmesi için küçük bir bekleme ekleyebilirsiniz.
Kodunuzu bu şekilde düzelttikten sonra, dosya baskı işlemi ve hata ayıklama daha stabil hale gelecektir.

Bu kodu deneyebilir misiniz ?
 

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,781
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Sayın Cems,
İlginiz ve açıklamalarınız için çok teşekkür ederim. Denedim.
CreateObject("Shell.Application").Namespace(ThisWorkbook.Path).ParseName(fileName).InvokeVerb ("Print")
bu satırda resimdeki hatayı veriyor.
Nereyi eksik bırakmışım acaba?
Saygılarımla
 

Ekli dosyalar

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,459
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Hatanın nedeni, CreateObject("Shell.Application").Namespace(ThisWorkbook.Path).ParseName(fileName).InvokeVerb("Print") satırının doğru bir şekilde çalışması için dosyanın tam yolunu belirtmeniz ve bu yolun doğru olduğundan emin olmanız gerektiğidir. Aynı zamanda, Namespace metodu bir klasörü belirtir, bu nedenle dosyanın tam yolu yerine sadece dizini sağlayabilirsiniz.
Aşağıda hatayı çözmek için gözden geçirmeniz gereken bazı noktalar var:

1. Tam Dosya Yolu
  • Dosya yolunu belirtirken, Yol değişkeninin sonuna dosya adını eklemişsiniz. Ancak, Namespace metodu bir klasörü belirtir, bu yüzden ParseName metodu dosyanın yolunu bulamayabilir. Bunun yerine, sadece klasör yolunu belirtmek yeterli olmalıdır.
2. Klasör Yolunu ve Dosya Yolunu Doğru Ayarlama
  • Dosya adını ve yolunu doğru şekilde ayarladığınızdan emin olun. Ayrıca, dosya adının VLookup fonksiyonuyla doğru döndürüldüğünden emin olun.
3. Doğru Namespace Kullanımı
  • Namespace yerine, Namespace(Yol) ile klasörün doğru belirtilip belirtilmediğini kontrol edin.
Kodun Düzeltilmiş Hali:


Sub Baski_Yap1()
Dim wf As WorksheetFunction
Dim Yol As String
Dim fileName As String
Dim pdfApp As Object
Dim dd As String
Dim aa As String
Dim x As Integer

' Hata denetimi devreye al
On Error GoTo ErrorHandler

' WorksheetFunction nesnesini al
Set wf = Application.WorksheetFunction

' Klasör yolunu belirle
dd = Cells(2, 2).Value ' Klasör adı
Yol = ThisWorkbook.Path & "\" & dd & "\"

' VLOOKUP işlemi ve dosya baskısı
For x = 1 To 1
aa = wf.VLookup(x, Range("A:B"), 2, False) ' PDF dosyanın adı
fileName = Yol & aa & ".pdf"

' Dosyanın mevcut olup olmadığını kontrol et
If Dir(fileName) <> "" Then
' Dosyayı yazdır
CreateObject("Shell.Application").Namespace(Yol).ParseName(aa & ".pdf").InvokeVerb ("Print")
' Beklemek için küçük bir süre bırak
Application.Wait Now + TimeValue("00:00:05")
Else
MsgBox "Dosya bulunamadı: " & fileName
End If
Next x

Exit Sub

ErrorHandler:
MsgBox "Bir hata oluştu: " & Err.Description
End Sub


Bu kodda, Namespace metodu için sadece klasör yolunu (Yol) belirttim ve ParseName metodu için ise sadece dosya adını (aa & ".pdf") kullandım.
Bu değişiklikler, hatanın çözülmesine yardımcı olabilir. Eğer sorun devam ederse, dosya yolunu manuel olarak kontrol ederek, dosyanın var olup olmadığını ve yolun doğru olup olmadığını teyit edebilirsiniz.
 

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,781
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Sayın Cems Hocam,
Söylediğiniz kontrolleri F8 ile adım adım giderek bir defa daha yaptım. Pdf24 te yüklü halde yine aynı satırda aynı hata uyarısını verdi.
Saygılarımla
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,459
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Sanırım dosyanız olmadan cozulmesi zor olacak

ya da


InvokeVerb("Print") metodunun dosyayı yazdırmaya çalıştığı sırada hata vermesinin birkaç nedeni olabilir. Bu tür hatalar genellikle dosyanın mevcut olmaması, yanlış yol verilmesi, ya da PDF yazdırma işlemi için gerekli uygulamanın uygun şekilde çalışmaması durumlarında ortaya çıkabilir.
Alternatif Yaklaşım: ShellExecute API Kullanın
Shell.Application yerine, ShellExecute API'sini kullanarak dosyayı yazdırmayı deneyebilirsiniz. Bu yöntem, bazen InvokeVerb("Print") ile yaşanan sorunları çözebilir.
Aşağıda, ShellExecute API'sini kullanarak PDF dosyasını yazdıran bir örnek kod bulunmaktadır:

Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long

Sub Baski_Yap1()
Dim wf As WorksheetFunction
Dim Yol As String
Dim fileName As String
Dim dd As String
Dim aa As String
Dim x As Integer
Dim RetVal As Long

' Hata denetimi devreye al
On Error GoTo ErrorHandler

' WorksheetFunction nesnesini al
Set wf = Application.WorksheetFunction

' Klasör yolunu belirle
dd = Cells(2, 2).Value ' Klasör adı
Yol = ThisWorkbook.Path & "\" & dd & "\"

' VLOOKUP işlemi ve dosya baskısı
For x = 1 To 1
aa = wf.VLookup(x, Range("A:B"), 2, False) ' PDF dosyanın adı
fileName = Yol & aa & ".pdf"

' Dosyanın mevcut olup olmadığını kontrol et
If Dir(fileName) <> "" Then
' Dosyayı yazdır
RetVal = ShellExecute(0, "print", fileName, vbNullString, vbNullString, 0)
' Beklemek için küçük bir süre bırak
Application.Wait Now + TimeValue("00:00:05")
Else
MsgBox "Dosya bulunamadı: " & fileName
End If
Next x

Exit Sub

ErrorHandler:
MsgBox "Bir hata oluştu: " & Err.Description
End Sub

Bu Yöntemin Avantajları:
  • Daha Esnek: ShellExecute API'si, yerleşik Shell.Application metotlarına göre daha esnektir ve daha fazla komutla çalışabilir.
  • Genel Uyum: Farklı PDF yazıcılar ve yazılım çözümleriyle daha iyi uyum sağlayabilir.
Kodun Çalışma Prensibi:
  1. ShellExecute API kullanılarak, PDF dosyasını varsayılan yazıcıya gönderir.
  2. Error Handling: Hataları yakalamak ve kullanıcıya mesaj vermek için bir hata denetimi eklenmiştir.
Bu kodu deneyerek, sorun yaşadığınız satırı aşabilir ve dosyanın yazdırılmasını sağlayabilirsiniz.
 

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,781
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Sayın Cems Hocam,
İlginize çok teşekkür ederim, bu sefer çalıştı.
Saygılarımla
 

cems

Altın Üye
Katılım
2 Eylül 2005
Mesajlar
2,459
Excel Vers. ve Dili
office 2010 tr 32bit
Altın Üyelik Bitiş Tarihi
13-06-2029
Kolaylıklar dilerim :) Saygılar bizden
 

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,781
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Çok teşekkür ederim.
Saygılarımla
 

RBozkurt

𐱅𐰇𐰼𐰚
Altın Üye
Katılım
10 Ocak 2018
Mesajlar
681
Excel Vers. ve Dili
Microsoft Office 2024
Google Sheets
Altın Üyelik Bitiş Tarihi
19-12-2026
Alternatif;

Kendimde kullanırım. Aslında Acrobat Pro DC varsa bu siteye gerek yok.
Aynı anda 20 PDF dosyasını birleştirip tek PDF haline getirir.
 

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,781
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Sayın RBozkurt Hocam,
İlginize teşekkür ederim. Tamamı ücretsiz, PdfTK, PDF24, Convert exelerini kullanıyorum ben, sınırsız sayıda pdf sayfayı birleştirme imkanı veriyor. Burada benim aradığım, pdf ilişkisi zayıf bir elemanın baskı için sıkıntı yaşamamasını sağlamak.
 
Üst