Mesai Formu Yazdırma Hk.

Katılım
6 Mart 2011
Mesajlar
101
Beğeniler
1
Excel Vers. ve Dili
Microsoft Office 2010
#1
Merhaba

Şantiyemizde çalışmakta olan personellerimize ait birimlerinde yapmış oldukları mesaileri ay sonunda toplu şekilde yazdırmak istiyorum. Örnek dosyamda mesai yapan birimlere ait personeller var Form sayfasında Oluşturmuş olduğum (Beton İşleri, Toprak İşleri, Jeoteknik, Hava Hattı) butonuna bağlı olarak sarı renkte belirttiğim alanlara (Personelin mesaiye kaldığı tarih, adı soyadı, görevi,mesaiye kaldığı yer) alanlarını doldurup yazdırmasını istiyorum. Personellerin karşısına hangi günde mesaiye kalmış ise (1) yazıyorum. Daha öncede farklı bir çalışma ile hazırlanmış kodu bu sisteme uyarlayamadım. Yardımcı olabilir misiniz.

... Örnek Dosya ...

Sub PAZAR_YAZDIR()
Set p = Sheets("PERSONEL"): Set m = Sheets("MESAİ ÇALIŞMA")
sonp = p.Cells(Rows.Count, "B").End(3).Row
If p.Cells(1, Columns.Count).End(xlToLeft).Column = 7 Then Exit Sub
For psut = 8 To p.Cells(1, Columns.Count).End(xlToLeft).Column
If WorksheetFunction.CountIf(p.Range(p.Cells(5, psut), p.Cells(sonp, psut)), 1) > 0 Then
m.[B8] = p.Cells(1, psut)
m.[F23] = p.Cells(1, psut)
m.[F31] = p.Cells(1, psut)
For sat = 5 To sonp Step 2
If p.Cells(sat, psut) = 1 Then
m.[F20] = p.Cells(sat, 2): m.[F21] = p.Cells(sat, 3)
m.[F22] = p.Cells(sat, 4): m.PrintOut
Application.Wait (Now + TimeValue("00:00:02"))
End If
Next
End If
Next
MsgBox "İşlem tamamlandı."
End Sub
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#2
Aşağıdaki makroyu deneyiniz. Makro BETON İŞLERİ sayfasına göre düzenlendi. Diğer sayfalar için set s2 satırını sayfa adına göre değiştirerek kendiniz ayarlayabilirsiniz:

PHP:
Sub mesai()
Set s1 = Sheets("BETON İŞLERİ")
Set s2 = Sheets("Form")
son = s2.Cells(Rows.Count, "B").End(3).Row
tarih = s2.[N22]
If Month(tarih) <> Month(s1.[E2]) Then
    MsgBox "Veri tablosundaki ay ile seçilen tarih uyumsuz", vbCritical
    Exit Sub
End If

gun = Day(tarih) + 4
For i = 1 To son
    If s1.Cells(i, gun) = 1 Then
        s2.[G20] = s1.Cells(i, "B")
        s2.[G21] = s1.Cells(i, "C")
        s2.[B15] = s1.Cells(i, "D")
        s2.PrintOut
    End If
Next
End Sub
 
Katılım
6 Mart 2011
Mesajlar
101
Beğeniler
1
Excel Vers. ve Dili
Microsoft Office 2010
#3
Merhaba
tarih = s2.[N22]
If Month(tarih) <> Month(s1.[E2]) Then
kontrolünü yapmasa olmaz mı?
Örnek : Beton İşlerini yazdırmak istediğimde ilk sıradan başlasın personelin kaldığı bütün mesaileri sırayla yazdırsın işlem bittikten sonra diğer personelin kaldığı mesaileri sırayla yazdırsın listede olan bütün personellere sırayla aynı işlemi yapabilir mi?
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#4
Deneyiniz. Ancak tarih kısmının düzgün olması için öncelikle ilgili sayfalarda F2 hücrelerine aşağıdaki formülü yapıştırıp sağa doğru kopyalayın. Böylece E2 hücresine girilen ay, örneğin Şubat ise 28'inden sonraki sütunlar boş kalır:

Kod:
=EĞER(E2="";"";EĞER(AY(E2)=AY(E2+1);E2+1;""))
PHP:
Sub mesai()
Set s1 = Sheets("BETON İŞLERİ")
Set s2 = Sheets("Form")
son = s2.Cells(Rows.Count, "B").End(3).Row
For kisi = 1 To son
    For gun = 5 To 34
        If s1.Cells(2, gun) <> "" Then
            If s1.Cells(kisi, gun) = 1 Then
                s2.[G20] = s1.Cells(kisi, "B")
                s2.[G21] = s1.Cells(kisi, "C")
                s2.[B15] = s1.Cells(kisi, "D")
                s2.[B8] = s1.Cells(2, gun)
                s2.[G22] = s1.Cells(2, gun)
                s2.PrintOut
            End If
        End If
    Next
Next
End Sub
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#6
Ben denediğimde farklı sonuçlar veriyor. Dosyayı o haliyle yüklerseniz inceleyelim.
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#8
Gönderdiğiniz dosyada makro düzgün şekilde çalışıyor.
 
Katılım
6 Mart 2011
Mesajlar
101
Beğeniler
1
Excel Vers. ve Dili
Microsoft Office 2010
#9
Makroyu diğer sayfalar için çoğaltmak istediğimde sadece sayfanın adını değiştirmem yeterli dimi?
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#10
Evet. Eğer dosyada başka sayfa olmayacaksa ya da sayfalar önceden belliyse tek makroyla tüm sayfalar ayrı ayrı değerlendirilebilir.
 
Katılım
6 Mart 2011
Mesajlar
101
Beğeniler
1
Excel Vers. ve Dili
Microsoft Office 2010
#12
Merhaba
Öncelikle yardımların için çok teşekkür ederim. Yazdırma işlemlerini yaparken bazı sorunlarla karşılaştım.
Çıktı almak istediğimde Örnek "TOPRAK iŞLERİ" ne ait çıktıda belli bir personelden "MUSTAFA ÇELİK-3"sonrasını yazdırmıyor. Kodları sizin dediğiniz şekilde çoğalttım neden olabilir.

Yazdırma işlemlerinde yazıcıda hata verdiğinde yada elektrik kesintisinde kaldığı yerden nasıl devam edebiliriz. Yazdırılanlara "OK" çekini atsa bir daha aynı çıktıları almasa çok iyi olur.

--- Örnek Dosya---
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#13
Günaydın. İl dışında görevde olduğumdan ancak sorunuza bakabildim, kusura bakmayın.

Önceki cevabımda sayfa tanımlamasını yanlış yaptığımdan belli bir satırdan sonrasını yazdırmıyormuş.

Aşağıdaki makroyu deneyin. Yazdırılacak kişi çok olduğundan ben deneyemedim maalesef.

Makro tüm sayfalar için çalışıyor. Her sayfa için değiştirmenize gerek yok. Bu işlemi de MESAİ AÇIKLAMA sayfasının D sütununa bakarak yapıyor. Bu sayfada D2'den itibaren ikişer atlayarak satırları kontrol ediyor ve mevcut sayfalarla karşılaştırıyor. Eğer o sayfanın D2, D4, D6 vs hücrelerinde yazan sayfa adları dosyada varsa o sayfada kişi ve mesai kontrolü yapıyor. Eğer o sayfa dosyada yoksa B sütununa Sayfa Bulunamadı yazıyor.

Sayfa varsa satır satır kişileri ve her kişi için de günleri kontrol ediyor. Kişinin gün sütunu 1 ise ve dolgu rengi mavi değilse o kişinin o gün için mesai formunu yazdırıyor. Eğer 1 değilse ya da dolgu rengi maviyse o günü yazdırmıyor.

Sayfayı yazdırdıktan sonra o kişinin gün hücresini mavi dolgulu yapıp dosyayı kaydediyor. Tüm işlem bitince İşlem tamamlandı şeklinde uyarı veriyor. Verilerin çokluğuna göre makronun çalışması uzun sürüyor doğal olarak.

PHP:
Sub mesai()
Set s1 = Sheets("MESAİ AÇIKLAMA")
Set s2 = Sheets("Form")
sonsayfa = s1.Cells(Rows.Count, "D").End(3).Row
For sayfa = 2 To son Step 2
    a = "yok"
    For grup = 1 To Sheets.Count
        If Sheets(grup).Name = s1.Cells(sayfa, "D") Then
            Sheets(grup).Select
            a = "var"
            son = Sheets(grup).Cells(Rows.Count, "B").End(3).Row
            For kisi = 1 To son
                For gun = 5 To 34
                    If Sheets(grup).Cells(2, gun) <> "" Then
                        If Sheets(grup).Cells(kisi, gun) = 1 And Sheets(grup).Cells(kisi, gun).Interior.Color <> vbBlue Then
                            s2.[G20] = Sheets(grup).Cells(kisi, "B")
                            s2.[G21] = Sheets(grup).Cells(kisi, "C")
                            s2.[B15] = Sheets(grup).Cells(kisi, "D")
                            s2.[B8] = Sheets(grup).Cells(2, gun)
                            s2.[G22] = Sheets(grup).Cells(2, gun)
                            s2.PrintOut
                            Sheets(grup).Cells(kisi, gun).Interior.Color = vbBlue
                            ActiveWorkbook.Save
                        End If
                    End If
                Next
            Next
        End If
    Next
    If a = "yok" Then
        s1.Cells(sayfa, "B") = "Sayfa Bulunamadı"
    End If
Next
MsgBox "İşlem Tamamlandı"
End Sub
Yalnız bu kağıt pahalılığında neden böyle bir uygulama yaptığınızı anlamadım. Mevcut dosya neden yetmiyor ya da her kişi ve gün için ayrı sayfa yerine her kişi için ayrı bir sayfada tüm günlerin gösterildiği bir tablo yapmak daha iyi olmaz mı? Sadece 4-5 hücrenin değiştirilip bir A4 kağıdı yazdırılması bence hiç verimli ve mantıklı bir uygulama değil. Kağıt pahalı olmasa bile çevre koruma ve kaynakların doğru değerlendirilmesi adına farklı uygulama yapmanızı öneririm.
 
Katılım
6 Mart 2011
Mesajlar
101
Beğeniler
1
Excel Vers. ve Dili
Microsoft Office 2010
#14
Merhaba
Şirket yetkilisi istedikten sonra yapılacak çok fazla bir işlem kalmıyor. Kağıt masrafı maalesef çok oluyor ama elimden pek bir şey gelmiyor. Emir demiri keser misali yapmak zorunda kalıyorum. Benim yazdırmak istediğim "MESAİ AÇIKLAMA" sayfası değil örnek dosyamda olan (TOPRAK İŞLERİ, BETON İŞLERİ, HAVA HATTI, ELEKTRİK EKİBİ, KAYNAKÇI - TAMİRCİ) v.s. sayfaları sanırım sorunumu tam anlatamadım.
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#15
Makro Mesai açıklama sayfasını mı yazdırıyor? Ben s2 yani FORM sayfasını yazdırsın diye ayarlamıştım.
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#16
Bu arada

For sayfa = 2 To son Step 2

değil

For sayfa = 2 To sonsayfa Step 2

olmalı. Bunu düzeltin bir zahmet.
 
Katılım
6 Mart 2011
Mesajlar
101
Beğeniler
1
Excel Vers. ve Dili
Microsoft Office 2010
#17
Merhaba
Belirttiğiniz düzeltmeyi yaptım. Butonu tıkladığım zaman direk işlem tamamlandı uyarısını veriyor. Daha önce paylaşmış olduğunuz kodda düzeltme yaparak sorunu çözebilirsek çok makbule geçer. Yazdıracağım listede kaç kişi olursa olsun hepsini yazdırsın sayfa adlarını ben tek tek yazarım sorun değil.

Sub mesai_B()
Set s1 = Sheets("BETON İŞLERİ")
Set s2 = Sheets("Form")
son = s2.Cells(Rows.Count, "B").End(3).Row
For kisi = 1 To son
For gun = 5 To 34
If s1.Cells(2, gun) <> "" Then
If s1.Cells(kisi, gun) = 1 Then
s2.[G20] = s1.Cells(kisi, "B")
s2.[G21] = s1.Cells(kisi, "C")
s2.[B15] = s1.Cells(kisi, "D")
s2.[B8] = s1.Cells(2, gun)
s2.[G22] = s1.Cells(2, gun)
s2.PrintOut
End If
End If
Next
Next
MsgBox "İşlem tamamlandı."
ActiveWorkbook.Save
End Sub
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
7,105
Beğeniler
100
Excel Vers. ve Dili
İş : Ofis 2016 - Türkçe
Ev: Ofis 2016 - Türkçe
#18
Makro aşağıdaki şekilde düzgün bir şekilde çalışıyor bende:

PHP:
Sub mesai()
Set s1 = Sheets("MESAİ AÇIKLAMA")
Set s2 = Sheets("Form")
sonsayfa = s1.Cells(Rows.Count, "D").End(3).Row
For sayfa = 2 To sonsayfa Step 2
    a = "yok"
    For grup = 1 To Sheets.Count
        If Sheets(grup).Name = s1.Cells(sayfa, "D") Then
            Sheets(grup).Select
            a = "var"
            son = Sheets(grup).Cells(Rows.Count, "B").End(3).Row
            For kisi = 3 To son
                For gun = 5 To 34
                    If Sheets(grup).Cells(2, gun) <> "" Then
                        If Sheets(grup).Cells(kisi, gun) = 1 And Sheets(grup).Cells(kisi, gun).Interior.Color <> vbBlue Then
                            s2.[G20] = Sheets(grup).Cells(kisi, "B")
                            s2.[G21] = Sheets(grup).Cells(kisi, "C")
                            s2.[B15] = Sheets(grup).Cells(kisi, "D")
                            s2.[B8] = Sheets(grup).Cells(2, gun)
                            s2.[G22] = Sheets(grup).Cells(2, gun)
                            s2.PrintOut
                            Sheets(grup).Cells(kisi, gun).Interior.Color = vbBlue
                            ActiveWorkbook.Save
                        End If
                    End If
                Next
            Next
        End If
    Next
    If a = "yok" Then
        s1.Cells(sayfa, "B") = "Sayfa Bulunamadı"
    End If
Next
End Sub
Sizde çalışmıyorsa Mesai açıklama sayfasının D sütunundaki isimlerle sayfa isimleri aynı olmayabilir. Ya da uyguladığınız dosya yapısı örnek dosyanızla aynı değildir.
 
Üst