Word Dot Şablonunu Açtırarak Veri Göndermek

1 2 3
14/01/2025, 15:55

bibib

(13/01/2025, 16:32)berduş yazdı:
With Tahkikat_Talep_Form
     .Class = "Word.Document"
     .Verb = acOLEVerbOpen
     .Visible = False
     .Object.Application.Documents.Item(1).SaveAs Me.Dosya_Kayıt_Yeri & "\" & Şablon_Dosyası, Visible = False
     .Close
End With
.close ksımını devre dışı bırakıp dener misiniz?

galiba üstyazıda da vardı

Hocam dosya arka planda açık kalıyor close ile kapatınca
Evet tüm worde gönderilen şablonlarda programı çalıştırınca sadece 1 defa gönderiyor 2. kayıtı gönderince hata veriyor.
14/01/2025, 17:18

berduş

dosyanızı değişiklik yaptığınız haliyle yeniden yükler misiniz?
değişikliği hangi form/kod blogunda yaptığınızı da belirtin.
ilgili bloklardaki .close yazan satırları silice bende hata vermedi

(14/01/2025, 15:55)bibib yazdı: Hocam dosya arka planda açık kalıyor close ile kapatınca
ne demek istediğinizi anlamadım?
14/01/2025, 23:11

atoykan

Kodlardaki
'------------- ŞABLONU OLUŞTURULUYOR-----------
    Şablon_Dosyası = "Tüccar_Tutanak_1."
'====================================================
With Tüccar_Tutanak_1
    .Class = "Word.Document"
    .Verb = acOLEVerbOpen
    .Visible = False
    .Object.Application.Documents.Item(1).SaveAs Me.Dosya_Kayıt_Yeri & "\" & Şablon_Dosyası ', Visible = False
    .Close

End With
kısmını

With Tüccar_Talep_Formu_1
    .Class = "Word.Document"
    .Verb = acOLEVerbOpen
    .Visible = False
    Dim WordApp As Object
    Set WordApp = .Object.Application
    WordApp.Documents.Item(1).SaveAs Me.Dosya_Kayıt_Yeri & "\" & Şablon_Dosyası
    WordApp.Quit
    Set WordApp = Nothing
    .Close
End With
  olarak değiştirip dener misiniz? Word Apllication bir Object olarak tanımlanmış ve OLE üzerinden işlem yapıyorsunuz. Dolayısı ile comm nesnelerinin serbest bırakılıp temizlenmesi önemli wordü tamamen kapatmak gerekli task managerda arka planda işlem yapmaya devam etmemeli. Bu blokta deneyin istediğiniz sonucu alıyorsanız diğer bloklarada benzer işlemi uygulayın. Şayet bu şekilde de sonuç alamaz ve wordü arka planda kapatamazsanız End With'in altına
Shell "taskkill /F /IM WINWORD.EXE", vbHide
ekleyerek deneyebilirsiniz ancak burada dikkat etmeniz gereken wordü task managerdan sonlandırma işlemini kodla yapıyor olduğunuzdur ve dolayısı ile açık başka word dosyalarınız var ise onlarda kapatılır ve kayıt edilmemiş çalışmalarınız kaybolur.
14/01/2025, 23:20

atoykan

Kill Me.Dosya_Kayıt_Yeri & "\" & Şablon_Dosyası dosyaları silmek için kullandığınız kod. Burada Me. formunuzu temsil eder ve kullanılmaması gerekir, sonuçta dosya diskinizde ve onu silmek istiyorsunuz bu kısım hataya sebebiyet verir. Bİr kaç detay daha var baktığım ve yazayım dediğim ama biraz yoğunum notlarımı nereye koyduğumu bulamadım. İlk fırsatta onları da iletirim.
15/01/2025, 16:15

atoykan

Notlarımı buldum tespitlerimi de ileteyim.
  1. DoCmd.RunSQL "DELETE * FROM Veri_girişi WHERE isnull([Evrak_Geliş_Sayısı])" gibi Sql işlemlerinizi DAO ile daha kararlı ve tutarlı çalışacak şekilde revize edin. Örneğin
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "DELETE FROM Veri_girişi WHERE [Evrak_Geliş_Sayısı] IS NULL", dbFailOnError
    Set db = Nothing
    gibi.
  2. For Each ctl In Me.Form.Controls 
    If ctl.Tag = "KBL_KMT" Then ctl.Enabled = True
    If ctl.Tag = "KMT" And ctl.Enabled = False Then ctl.Enabled = True
    If ctl.Tag = "WRD_KMT" Then ctl.Enabled = True
    Next
    gibi döngüleri her denetim ve şart için if/else değerlendirmesi ile tekrar tekrar döngüye sokmak yerine doğrudan koşula odaklı Select Case kullanıp performans arttırmaya odaklanın. Örneğin
    For Each ctl In Me.Controls
    Select Case ctl.Tag
    Case "KBL_KMT", "KMT", "WRD_KMT"
    ctl.Enabled = True
    End Select
    Next
    bu durumda if değerlendirmesine gerek kalmadan doğrudan case durumuna ilerleyerek performansı iyileştirirsiniz. Ayrıca .Tag kullanmakta çok sağlıklı değil bunun yerine daha belirgin ve tutarlı olacak şekilde denetimlere ilişkin bir değerlendirme yapmak daha doğru olur.
  3. If Len(Kişi_Adı) <= 0 Then Kişi_Adı.Enabled = False gibi gereksiz tekrarlayan denetimler yerine Kişi_Adı.Enabled = Len(Kişi_Adı) > 0 kullanmak daha tutarlı ve performanslıdır.
  4. Evrak_Türü_AfterUpdate ve Evrak_yazışma_Türü_Onay_Click olaylarında aynı kontrol ve işlemler tekrar ediyor. Bu işlemleri neden bir fonksiyona çekmiyorsunuz?
  5. Benzer şekilde tarih formatlamarı, ASCII denetimleri tekrar tekrar yazılmış bunları neden bir fonksiyona çekip hem kodu daha işlevsel hem performansı daha üst seviyeye çıkartmıyorsunuz?
  6. Hata denetimi mekanizmanız zaten yok. On Error Resume Next bir hata denetimi değildir hata varsa yoksay demektir.
    On Error GoTo ErrorHandler
    ' Kodlarınız burada
    Exit Sub
    ErrorHandler:
    MsgBox "Hata oluştu: " & Err.Description, vbCritical, "Hata"
    Resume Next
    şeklinde yazılacak kod bir hata denetimidir ve size hatanın ne olduğunu bidirdiğinden nereye nasıl müdahale etmeniz gerektiği ile ilgili bilgi sahibi olursunuz. Örneğin çok net olarak bu yapı kurgulanmadığı için mevcut sorunuzdaki hatanın nerede ve ne açıklama ile meydana geldiğini ancak debug ederek adım adım ilerleyerek tespit edebiliyorsunuz.
Dün, 15:42

bibib

(15/01/2025, 16:15)atoykan yazdı: Notlarımı buldum tespitlerimi de ileteyim.
  1. DoCmd.RunSQL "DELETE * FROM Veri_girişi WHERE isnull([Evrak_Geliş_Sayısı])" gibi Sql işlemlerinizi DAO ile daha kararlı ve tutarlı çalışacak şekilde revize edin. Örneğin
    Dim db As DAO.Database
    Set db = CurrentDb
    db.Execute "DELETE FROM Veri_girişi WHERE [Evrak_Geliş_Sayısı] IS NULL", dbFailOnError
    Set db = Nothing
    gibi.
  2. For Each ctl In Me.Form.Controls 
    If ctl.Tag = "KBL_KMT" Then ctl.Enabled = True
    If ctl.Tag = "KMT" And ctl.Enabled = False Then ctl.Enabled = True
    If ctl.Tag = "WRD_KMT" Then ctl.Enabled = True
    Next
    gibi döngüleri her denetim ve şart için if/else değerlendirmesi ile tekrar tekrar döngüye sokmak yerine doğrudan koşula odaklı Select Case kullanıp performans arttırmaya odaklanın. Örneğin
    For Each ctl In Me.Controls
    Select Case ctl.Tag
    Case "KBL_KMT", "KMT", "WRD_KMT"
    ctl.Enabled = True
    End Select
    Next
    bu durumda if değerlendirmesine gerek kalmadan doğrudan case durumuna ilerleyerek performansı iyileştirirsiniz. Ayrıca .Tag kullanmakta çok sağlıklı değil bunun yerine daha belirgin ve tutarlı olacak şekilde denetimlere ilişkin bir değerlendirme yapmak daha doğru olur.
  3. If Len(Kişi_Adı) <= 0 Then Kişi_Adı.Enabled = False gibi gereksiz tekrarlayan denetimler yerine Kişi_Adı.Enabled = Len(Kişi_Adı) > 0 kullanmak daha tutarlı ve performanslıdır.
  4. Evrak_Türü_AfterUpdate ve Evrak_yazışma_Türü_Onay_Click olaylarında aynı kontrol ve işlemler tekrar ediyor. Bu işlemleri neden bir fonksiyona çekmiyorsunuz?
  5. Benzer şekilde tarih formatlamarı, ASCII denetimleri tekrar tekrar yazılmış bunları neden bir fonksiyona çekip hem kodu daha işlevsel hem performansı daha üst seviyeye çıkartmıyorsunuz?
  6. Hata denetimi mekanizmanız zaten yok. On Error Resume Next bir hata denetimi değildir hata varsa yoksay demektir.
    On Error GoTo ErrorHandler
    ' Kodlarınız burada
    Exit Sub
    ErrorHandler:
    MsgBox "Hata oluştu: " & Err.Description, vbCritical, "Hata"
    Resume Next
    şeklinde yazılacak kod bir hata denetimidir ve size hatanın ne olduğunu bidirdiğinden nereye nasıl müdahale etmeniz gerektiği ile ilgili bilgi sahibi olursunuz. Örneğin çok net olarak bu yapı kurgulanmadığı için mevcut sorunuzdaki hatanın nerede ve ne açıklama ile meydana geldiğini ancak debug ederek adım adım ilerleyerek tespit edebiliyorsunuz.



atoykan bey çok sağolun yordum sizi DAO ya dönüştürmek istemiyorum çok yer değişecek diğer önerilerinizi uygulayacağım olmazsa offece 2016-19 a dönerim
1 2 3