[Yardım]  Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

VBA Makrolar ile ilgili sormak istedikleriniz, yapmak istedikleriniz hakkında yardım alabileceğiniz bölümdür.

Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#1)  hizmeteozel » 14 Eyl 2018 19:11

Merhaba,

Forumun yeni bir üyesi olarak böyle bir platformu hayata geçiren ve değerli zamanını ayırarak katkılarını sunan tüm arkadaşlara teşekkürlerimi sunmayı bir borç bilirim. Sağolun, varolun.

Benim bir konuda yardıma ihtiyacım var. Yapmak istediğim şeye ilişkin dosyayı mesajıma ekliyorum. Özetle bir parametre sayfası (sayfa1) var. Bu sayfada istenen verileri (ki bunlar zaman/tarih başlangıç bitiş aralığından ibaret olup renkli gösterilmiştir) girerek sayfa2, sayfa3 ve sayfa4'de yer alan dizileri elde etmeliyim. Bir nevi otomasyon. Bunu formül yada vba/makro kodları ile nasıl yapabilim?

Yardımcı olabilirseniz sevinirim. Teşekkür ederim.
Bu iletideki ekleri görmek için gerekli yetkilere sahip değilsiniz.
Kullanıcı avatarı
hizmeteozel
 
Kayıt: 14 Eyl 2018 11:28
Meslek: Avukat
Yaş: 44
İleti: 7
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Manisa

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#2)  elfinito » 15 Eyl 2018 02:27

Merhaba,

Örnek dosyanıza yazdığınız açıklamalardan yola çıkarak yaptığım çalışmayı ekledim, inceleyiniz. İyi çalışmalar.

parametre.zip
Bu iletideki ekleri görmek için gerekli yetkilere sahip değilsiniz.
Kullanıcı avatarı
elfinito
Yeni Başlamış
 
Adı Soyadı:Erhan AKKAYA
Kayıt: 09 Ekm 2011 19:03
İleti: 67
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#3)  metehan8001 » 15 Eyl 2018 13:59

Bu da benden alternatif olsun.
Kod: Tümünü seç
Sub hazirla_exceldepo()
'www.exceldepo.com metehan8001@gmail.com
Dim s1 As Worksheet
Dim s2 As Worksheet
Dim wf As WorksheetFunction
Dim s3 As Worksheet
Dim s4 As Worksheet
Set s1 = Sheets("sayfa1")
Set s2 = Sheets("sayfa2")
Set wf = WorksheetFunction
Set s3 = Sheets("sayfa3")
Set s4 = Sheets("sayfa4")
'bilinen dönem =======================
strh = Year(s1.Cells(3, 3)) - Year(s1.Cells(2, 3))
yil = Year(s1.Cells(2, 3))
s2.Range("a2:c" & s2.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' temizleme
For i = 2 To strh + 2
s2.Cells(i, 1) = Format("01." & "01" & "." & yil, "yyyy.mm.dd")
s2.Cells(2, 1) = Format(s1.Cells(2, 3) + 1, "yyyy.mm.dd")
s2.Cells(i, 2) = Format("31." & "12" & "." & yil, "yyyy.mm.dd")
s2.Cells(strh + 2, 2) = Format(s1.Cells(3, 3), "yyyy.mm.dd")
gunfark = CDate(s2.Cells(i, 2)) - CDate(s2.Cells(i, 1))
If gunfark = 364 Then gunfark = 365
s2.Cells(i, 3) = gunfark
yil = yil + 1
Next i
'aktif dönem =============================
ilkaktif = Format(s1.Cells(3, 3) + 1, "yyyy.mm.dd")
yil = Year(ilkaktif)
sonay = s1.Cells(5, 5)
s3.Range("a2:c" & s3.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' temizleme
For i = 2 To s1.Cells(5, 4).Value + 2 'Aktif dönem yıl parametresi
s3.Cells(i, 1) = Format("01." & "01" & "." & yil, "yyyy.mm.dd")
s3.Cells(i, 2) = Format("31." & "12" & "." & yil, "yyyy.mm.dd")
If yil = Year(ilkaktif) + s1.Cells(5, 4) Then
trh = CDate("01." & sonay & "." & yil)
s3.Cells(i, 2) = Format(wf.EoMonth(trh, 0), "yyyy.mm.dd")
End If
s3.Cells(i, 3) = Month(s3.Cells(i, 2)) - Month(s3.Cells(i, 1)) + 1
yil = yil + 1
Next i
'pasif dönem ========================
ilkpasif = Format(wf.EoMonth(trh, 0) + 1, "yyyy.mm.dd")
yil = Year(wf.EoMonth(trh, 0) + 1)
sonay = s1.Cells(6, 5)
s4.Range("a2:c" & s4.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' temizleme
For i = 2 To s1.Cells(6, 4) + 2 'pasif dönem yıl parametresi
s4.Cells(i, 1) = Format("01." & "01" & "." & yil, "yyyy.mm.dd")
s4.Cells(2, 1) = ilkpasif
s4.Cells(i, 2) = Format("31." & "12" & "." & yil, "yyyy.mm.dd")
If yil = Year(ilkpasif) + s1.Cells(6, 4) Then
trh = CDate("01." & sonay & "." & yil)
s4.Cells(i, 2) = Format(wf.EoMonth(trh, 0), "yyyy.mm.dd")
End If
s4.Cells(i, 3) = Month(s4.Cells(i, 2)) - Month(s4.Cells(i, 1)) + 1
yil = yil + 1
Next i
MsgBox "İşlem Başarılı", vbInformation + vbMsgBoxRtlReading, "Www.ExcelDepo.Com"
End Sub
Bu iletideki ekleri görmek için gerekli yetkilere sahip değilsiniz.
Kullanıcı avatarı
metehan8001
Siteye Alışmış
 
Adı Soyadı:mete han
Kayıt: 18 Ekm 2011 10:30
İleti: 393
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: OSMANİYE

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#4)  hizmeteozel » 15 Eyl 2018 17:34

Sayın elfinito ve sayın metehan8001

Emekleriniz için teşekkür ederim. Her iki kod sonucu elde edilen son verilerde verilerde bir kısım aksaklıklar var. Şöyle ki;

Parametreleri şu şekilde alacak olursak; bilinen dönem için 30.07.2006 - 31.12.2016, aktif dönem için 14 yıl 1 ay ve pasif dönem için 7 yıl 11 ay

Sayın elfinito'nun kodlamasına göre sayfa2'de doğru bir şekilde 30.07.2006 'dan başlayan zaman aralığı olması gerektiği gibi 31.12.2006'da bitip yıl döngüsüne giriyor, gün farkı da 154 olarak çıkıyor. Buradaki sıkıntı bitiş tarihindeki günün eklenmemesi sebebi ile gün farkının 155 yerine 1 eksik olarak 154 çıkması. Yine bu kodlamada diğer bir sorun sayfa3'de başlangıcın parametreye uygun olması ancak bitiş tarihinin 14 yıl 1 aylık parametreye göre 31.01.2031 olması gerekirken 01.02.2031 olması. Buna bağlı olarak da sayfa4 başlangıcının 01.02.2031 olması gerekirken 02.02.2031 şeklinde olması. Yine bu sayfada diğer bir aksaklık ise parametreye (7 yıl 11 ay) uygun bitiş zamanının da 31.12.2038 olması ve ay farkının da 12 olması gerekirken dizinin 01.12.2038 ve ay farkının da 11 olarak sonlanması.

Sayın metehan8001'in kodlamasına göre 30.07.2006 'dan başlaması gereken zaman aralığı 31.07.2006'dan başlıyor ve olması gerektiği gibi 31.12.2006'da bitip yıl döngüsüne giriyor, gün farkı da 153 olarak çıkıyor. Buradaki sıkıntı başlangıcın 30.07.2006 olmaması ve gün farkının hem bu sebeple hem de bitiş tarihindeki günün eklenmemesi sebebi ile 155 yerine 153 şeklinde 2 gün eksik çıkması. Verilen parametrelere (14 yıl 1 ay) göre sayfa3 sorunsuz, olması gerektiği gibi. Sayfa4 ise doğru bir başlangıç yapmış, parametreye (7 yıl 11 ay) uygun ilerlemiş ancak bitiş tarihi 30.11.2018 ile sonlanarak toplam ilerlenen zaman 7 yıl 10 ayda kalmış. Burada döngünün bitiş tarihi 31.12.2038 olmalı ki 01.02.2031 tarihinden itibaren 7 yıl 11 ay ilerlenmiş olsun.

Ben kodlarda oynayarak aksaklıkları giderebilmeyi denedim ama yapabildiğim şimdilik sadece sayın metehan8001'in yyyy.mm.dd şeklindeki tarih kodlamasını dd.mm.yyyy şeklinde yeniden uyarlayabilmek oldu :oops:

Değerli arkadaşlarım yukarıdakileri dikkate alarak kodları bir elden geçirmeniz mümkün müdür? Teşekkür eder, saygılarımı sunarım.
Kullanıcı avatarı
hizmeteozel
 
Kayıt: 14 Eyl 2018 11:28
Meslek: Avukat
Yaş: 44
İleti: 7
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Manisa

REKLAM
Excel Logo XML Oluşturucu
Logo Object Designer ile Uyarlama

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#5)  metehan8001 » 15 Eyl 2018 18:13

Aşağıdaki kodu deneyiniz.

Kod: Tümünü seç
Sub hazirla_exceldepo()
'www.exceldepo.com metehan8001@gmail.com
Dim s1 As Worksheet
Dim s2 As Worksheet
Dim wf As WorksheetFunction
Dim s3 As Worksheet
Dim s4 As Worksheet
Set s1 = Sheets("sayfa1")
Set s2 = Sheets("sayfa2")
Set wf = WorksheetFunction
Set s3 = Sheets("sayfa3")
Set s4 = Sheets("sayfa4")
'bilinen dönem =======================
strh = Year(s1.Cells(3, 3)) - Year(s1.Cells(2, 3))
yil = Year(s1.Cells(2, 3))
s2.Range("a2:c" & s2.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' temizleme
For i = 2 To strh + 2
s2.Cells(i, 1) = Format("01." & "01" & "." & yil, "yyyy.mm.dd")
s2.Cells(2, 1) = Format(s1.Cells(2, 3), "yyyy.mm.dd")
s2.Cells(i, 2) = Format("31." & "12" & "." & yil, "yyyy.mm.dd")
s2.Cells(strh + 2, 2) = Format(s1.Cells(3, 3), "yyyy.mm.dd")
gunfark = CDate(s2.Cells(i, 2)) - CDate(s2.Cells(i, 1)) + 1
If gunfark = 366 Then gunfark = 365
s2.Cells(i, 3) = gunfark
yil = yil + 1
Next i
'aktif dönem =============================
ilkaktif = Format(s1.Cells(3, 3) + 1, "yyyy.mm.dd")
yil = Year(ilkaktif)
sonay = s1.Cells(5, 5)
s3.Range("a2:c" & s3.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' temizleme
For i = 2 To s1.Cells(5, 4).Value + 2 'Aktif dönem yıl parametresi
s3.Cells(i, 1) = Format("01." & "01" & "." & yil, "yyyy.mm.dd")
s3.Cells(i, 2) = Format("31." & "12" & "." & yil, "yyyy.mm.dd")
If yil = Year(ilkaktif) + s1.Cells(5, 4) Then
trh = CDate("01." & sonay & "." & yil)
s3.Cells(i, 2) = Format(wf.EoMonth(trh, 0), "yyyy.mm.dd")
End If
s3.Cells(i, 3) = Month(s3.Cells(i, 2)) - Month(s3.Cells(i, 1)) + 1
yil = yil + 1
Next i
'pasif dönem ========================
ilkpasif = Format(wf.EoMonth(trh, 0) + 1, "yyyy.mm.dd")
yil = Year(wf.EoMonth(trh, 0) + 1)
sonay = s1.Cells(6, 5)
s4.Range("a2:c" & s4.Cells(Rows.Count, 1).End(xlUp).Row).ClearContents ' temizleme
For i = 2 To s1.Cells(6, 4) + 2 'pasif dönem yıl parametresi
s4.Cells(i, 1) = Format("01." & "01" & "." & yil, "yyyy.mm.dd")
s4.Cells(2, 1) = ilkpasif
s4.Cells(i, 2) = Format("31." & "12" & "." & yil, "yyyy.mm.dd")
If yil = Year(ilkpasif) + s1.Cells(6, 4) Then
trh = CDate("01." & sonay & "." & yil)
s4.Cells(i, 2) = Format(wf.EoMonth(trh, 1), "yyyy.mm.dd")
End If
s4.Cells(i, 3) = Month(s4.Cells(i, 2)) - Month(s4.Cells(i, 1)) + 1
yil = yil + 1
Next i
MsgBox "İşlem Başarılı", vbInformation + vbMsgBoxRtlReading, "Www.ExcelDepo.Com"
End Sub
Kullanıcı avatarı
metehan8001
Siteye Alışmış
 
Adı Soyadı:mete han
Kayıt: 18 Ekm 2011 10:30
İleti: 393
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: OSMANİYE

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#6)  metehan8001 » 15 Eyl 2018 18:18

hizmeteozel yazdı:metehan8001'in yyyy.mm.dd şeklindeki tarih kodlamasını dd.mm.yyyy şeklinde yeniden uyarlayabilmek oldu


Ayrıca 1.nolu mesajda bulunan örnek dosyanızda tarih formatı yyyy.mm.dd bu şekilde olduğundan, yapmış olduğum çalışmayı da buna göre yapmıştım.

Siz istediğiniz formatta ayarlayın.
Kullanıcı avatarı
metehan8001
Siteye Alışmış
 
Adı Soyadı:mete han
Kayıt: 18 Ekm 2011 10:30
İleti: 393
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: OSMANİYE

REKLAM
ETA - Excel Konsolide Raporlama
ETA Excel Personel Entegre Raporu

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#7)  elfinito » 16 Eyl 2018 00:00

Merhaba,
Güncellenmiş hali ektedir, iyi çalışmalar.

parametre.zip
Bu iletideki ekleri görmek için gerekli yetkilere sahip değilsiniz.
Kullanıcı avatarı
elfinito
Yeni Başlamış
 
Adı Soyadı:Erhan AKKAYA
Kayıt: 09 Ekm 2011 19:03
İleti: 67
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#8)  hizmeteozel » 16 Eyl 2018 18:22

Sayın elfinito ve metehan8001 verdiğiniz kodlamaları inceledim, önceki aksaklıklar düzelmiş ama başka bazı sıkıntılar var. Şöyle ki;

Sayın elfinito'nun yeni düzenlemesinde tüm diziler doğru ama sayfa2'de yer alan yıl dizilerinde 365 günlük bazı diziler (C4, C8 ve C12 hücreleri) 366 gün olarak hesaplanmış. Bunun sebebi muhtemelen şubat ayının 29 çektiği artık yıllar. Buna yıl farkını 365 edecek şekilde bir çözüm bulunabilir mi? Çünkü bir takvim yılı 365 gün olarak kabul ediliyor ve artık yıllardaki +1 gün dikkate alınmıyor.

Sayın metehan8001'in yeni düzenlemesinde ise mevcut parametrelere göre (bilinen dönem için 30.07.2006 - 31.12.2016, aktif dönem için 14 yıl 1 ay ve pasif dönem için 7 yıl 11 ay) herhangi bir sorun yok ancak eğer parametreleri değiştirdiğimizde sayfa4'de elde ettiğimiz veriler parametre değişikliğine göre farklı sayıda ay eksiği ile hesaplanıyor. Örneğin sayfa1'de aktif dönem verisini 7 yıl 8 ay ve pasif dönem verisini 7 yıl 10 ay aldığımızda 94 ay ileri gitmesi gerekirken 87 ay ileri gidiyor, yine sayfa1'de aktif dönem verisini 7 yıl 8 ay ve pasif dönem verisini 5 yıl 2 ay aldığımızda 62 ay ileri gitmesi gerekirken 59 ay ileri gidiyor.

Ben biraz uğraştım düzeltebilir miyim diye ama maalesef :( Bir bakabilmeniz mümkün mü? Teşekkür ederim.
Kullanıcı avatarı
hizmeteozel
 
Kayıt: 14 Eyl 2018 11:28
Meslek: Avukat
Yaş: 44
İleti: 7
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Manisa

Cevap: Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluştur

İleti#9)  hizmeteozel » 16 Eyl 2018 18:27

hizmeteozel yazdı: Örneğin sayfa1'de aktif dönem verisini 7 yıl 8 ay ve pasif dönem verisini 7 yıl 10 ay aldığımızda 94 ay ileri gitmesi gerekirken 87 ay ileri gidiyor, yine sayfa1'de aktif dönem verisini 7 yıl 8 ay ve pasif dönem verisini 5 yıl 2 ay aldığımızda 62 ay ileri gitmesi gerekirken 59 ay ileri gidiyor.


Yukarıda alıntıladığım kısımda ikinci örneklem için aktif dönem verisi 7 yıl 8 ay değil 3 yıl 4 ay olacaktı. Düzeltirim.
Kullanıcı avatarı
hizmeteozel
 
Kayıt: 14 Eyl 2018 11:28
Meslek: Avukat
Yaş: 44
İleti: 7
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Manisa

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#10)  elfinito » 16 Eyl 2018 21:54

Merhaba, Module1 ilgili kod bloğunu (.. Enf If ile i=i+1 arasında kalan yer) aşağıdaki gibi düzenlerseniz fark olarak 365 yazacaktır. İyi çalışmalar.

Kod: Tümünü seç
ThisWorkbook.Sheets("Sayfa2").Cells(i, 2).Value = yilsonu
gunfarki = DateDiff("d", baslangic, yilsonu, 0) + 1
If gunfarki > 365 Then gunfarki = 365
ThisWorkbook.Sheets("Sayfa2").Cells(i, 3).Value = gunfarki
Kullanıcı avatarı
elfinito
Yeni Başlamış
 
Adı Soyadı:Erhan AKKAYA
Kayıt: 09 Ekm 2011 19:03
İleti: 67
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul

Cevap: Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluştur

İleti#11)  hizmeteozel » 17 Eyl 2018 14:40

elfinito yazdı:Merhaba, Module1 ilgili kod bloğunu (.. Enf If ile i=i+1 arasında kalan yer) aşağıdaki gibi düzenlerseniz fark olarak 365 yazacaktır. İyi çalışmalar.

Kod: Tümünü seç
ThisWorkbook.Sheets("Sayfa2").Cells(i, 2).Value = yilsonu
gunfarki = DateDiff("d", baslangic, yilsonu, 0) + 1
If gunfarki > 365 Then gunfarki = 365
ThisWorkbook.Sheets("Sayfa2").Cells(i, 3).Value = gunfarki


Dediğinizi yaptım, son verdiğiniz kod bloğunu Module1 End If ile i=i+1 arasındaki eski bloğu kaldırıp yapıştırdım ama "overflow" hatası verdi.
Kullanıcı avatarı
hizmeteozel
 
Kayıt: 14 Eyl 2018 11:28
Meslek: Avukat
Yaş: 44
İleti: 7
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Manisa

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#12)  hizmeteozel » 17 Eyl 2018 14:56

Eski kod aralığına aşağıdaki şekilde bir kod yazdım, düzeldi ama genel kod çalışma sistemine negatif bir etkisi olmaz umarım.

Kod: Tümünü seç
If ThisWorkbook.Sheets("Sayfa2").Cells(i, 3).Value > 365 Then ThisWorkbook.Sheets("Sayfa2").Cells(i, 3).Value = 365
Kullanıcı avatarı
hizmeteozel
 
Kayıt: 14 Eyl 2018 11:28
Meslek: Avukat
Yaş: 44
İleti: 7
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Manisa

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#13)  elfinito » 17 Eyl 2018 16:08

Merhaba, şart eklenmiş dosya ektedir, deneyiniz.

parametre.zip
Bu iletideki ekleri görmek için gerekli yetkilere sahip değilsiniz.
Kullanıcı avatarı
elfinito
Yeni Başlamış
 
Adı Soyadı:Erhan AKKAYA
Kayıt: 09 Ekm 2011 19:03
İleti: 67
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: İstanbul

Cevap: Parametreye Dayalı Zaman/Tarih Aralığı Oluşturmak

İleti#14)  hizmeteozel » 25 Eyl 2018 10:26

Her ikinize de çok teşekkür ederim emek ve yardımlarınız için.


Son güncel tutan hizmeteozel, 25 Eyl 2018 10:26.
Kullanıcı avatarı
hizmeteozel
 
Kayıt: 14 Eyl 2018 11:28
Meslek: Avukat
Yaş: 44
İleti: 7
 
Cinsiyet: Bay
Bulunduğunuz İl / Semt: Manisa


Forum Genel Makro Soruları

Online Kullanıcılar

Bu forumu görüntüleyenler: AhrefsBot, Yandex[Bot] ve 6 misafir

Bumerang - Yazarkafe