• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

ChatGPT'den tarih çözümü

Korhan Bey,

Akış şeması olarak böyle görünüyor arkadaşımızın isteği, belki daha net anlaşılır.
Düzeltme: ** Koşul1 > Evet den sonra çizgiyi yanlış çizmiş tatil kontorülüne gitmesi gerekiyordu düzeltilmiş görseli ekledim.

1773878963082.png

Yeni KTF' Alıntı:
Option Explicit

' ANA FONKSİYON: Hücrede =PersembeSorgula(A1) olarak kullanılır
Function PersembeSorgula(hucre As Range) As Variant
Dim hedefTarih As Date
Dim adayTarih As Date
Dim tatilAraligi As Range
Dim sayac As Integer

' Giriş Kontrolü
If Not IsDate(hucre.Value) Then
PersembeSorgula = "Hatalı Tarih"
Exit Function
End If

' Şema Adım 1: A1 + 90 Gün
hedefTarih = hucre.Value + 90

' Şema Adım 2: Durakları Belirle ve Başlangıç Adayını Seç
adayTarih = IlkDuragiSec(hedefTarih)

' Şema Adım 3: Tatil Kontrolü ve Zıplama Döngüsü
' Sayfada "resmi_tatiller" adında bir alan tanımlanmış olmalıdır.
On Error Resume Next
Set tatilAraligi = Range("resmi_tatiller")
On Error GoTo 0

sayac = 0
' Şemadaki "Evet" oku: Tatil listesinde olduğu sürece zıpla
Do While TatilListesindeVarMi(adayTarih, tatilAraligi) And sayac < 15
adayTarih = BirSonrakiDuragaZıpla(adayTarih)
sayac = sayac + 1
Loop

' Şema Adım 4: Bitiş ve Sonuç
PersembeSorgula = adayTarih
End Function

' Şemadaki Koşul 1 ve Koşul 2 Karar Mekanizması
Private Function IlkDuragiSec(t As Date) As Date
Dim P2 As Date, P4 As Date
P2 = NPersembeBul(Year(t), Month(t), 2)
P4 = NPersembeBul(Year(t), Month(t), 4)

If t <= P2 Then
IlkDuragiSec = P2
ElseIf t <= P4 Then
IlkDuragiSec = P4
Else
' Sonraki Ay P2
IlkDuragiSec = NPersembeBul(Year(DateAdd("m", 1, t)), Month(DateAdd("m", 1, t)), 2)
End If
End Function

' Şemadaki "Değiştir: Bir Sonraki Durağa Atla" İşlemi
Private Function BirSonrakiDuragaZıpla(mevcut As Date) As Date
' Eğer mevcut gün ayın 15'inden küçükse (2. Perşembedir), 4. Perşembeye geç
If Day(mevcut) < 15 Then
BirSonrakiDuragaZıpla = NPersembeBul(Year(mevcut), Month(mevcut), 4)
Else
' 4. Perşembedeysek sonraki ayın 2. Perşembesine geç
Dim sonraki As Date
sonraki = DateAdd("m", 1, DateSerial(Year(mevcut), Month(mevcut), 1))
BirSonrakiDuragaZıpla = NPersembeBul(Year(sonraki), Month(sonraki), 2)
End If
End Function

' Yardımcı: N. Perşembe Gününü Hesaplar
Private Function NPersembeBul(Yil As Integer, Ay As Integer, N As Integer) As Date
Dim ilk As Date
Dim fark As Integer
ilk = DateSerial(Yil, Ay, 1)
fark = (4 - Weekday(ilk, vbMonday) + 7) Mod 7
NPersembeBul = ilk + fark + ((N - 1) * 7)
End Function

' Yardımcı: Tatil Kontrolü
Private Function TatilListesindeVarMi(t As Date, r As Range) As Boolean
If r Is Nothing Then
TatilListesindeVarMi = False
Else
TatilListesindeVarMi = WorksheetFunction.CountIf(r, t) > 0
End If
End Function
 
Son düzenleme:
Ayrıca dediğiniz gibi 11.06.2026 tarihi de resmi tatil olsaydı. Bu sefer sonuç ne olacaktı?

18.06.2026 ya da 25.06.2026
Korhan Bey, varılmak istenen tarih ilgili ayın 2. ve 4. Perşembe günü. Aşıyorsa 4.perşembeyi takip eden ayın 2.perşembesi resmi tatile denk geldikçe 2.perşembe 4.perşeme olarak ilerleyecek şekilde resmi tatil olmayana kadar kontrol etmesi sonucu her koşula uygun bir tarihe ulaşılması istenmiş.
 
Yardımcı sütunlarla hazırladığım çözümü ekliyorum. Zaten temel kurgu sizin paylaştığınız formül gibi.

Ben sadece sütunlara parçalayarak okunur olmasını sağlamaya çalıştım. Umarım mantık hatası olmamıştır.
 

Ekli dosyalar

Ayrıca dediğiniz gibi 11.06.2026 tarihi de resmi tatil olsaydı. Bu sefer sonuç ne olacaktı?

18.06.2026 ya da 25.06.2026
25.06.2026
Çünkü firma sadece ayın 2’nci ve 4’üncü perşembeleri ödeme yapıyor.
 
Yardımcı sütunlarla hazırladığım çözümü ekliyorum. Zaten temel kurgu sizin paylaştığınız formül gibi.

Ben sadece sütunlara parçalayarak okunur olmasını sağlamaya çalıştım. Umarım mantık hatası olmamıştır.
Korhan kardeşim, öncelikle emeğine, beynine sağlık.
Gece yarısı vakit ayırıp, uğraştığın için şahsım ve tüm forum adına sonsuz teşekkürlerimi sunarım.
Rapor tamamdır, yüzde yüz doğru çalışıyor. Ancak sizin de belirttiğiniz gibi bu kadar uzun bir formül yapısı, böyle bir seferlik bir hesaplama için olabilir ama bu tabloyu kullanıcılara veremeyiz.

Selam, sevgi ve saygı.
 
ChatGPT'ye verdim gazı, sonunda yaptı. Korhan Hocanın çözümleriyle kontrol ettim, yüzde yüz doğru.
:)
 

Ekli dosyalar

Son düzenleme:
LET fonksiyonu yeni nesil fonksiyondur. Eski sürümlerde çalışmaz. Bu sebeple eski nesil fonksiyonlar ile çözüm arayışındaydım.

Linkte bu fonksiyonun 2021 sürüm itibariyle çalıştığı belirtilmiş.

LET işlevi - Microsoft Desteği https://share.google/uHuHFkJSzhp39hYKL

Benim çözüm yönteminde amacım işlem adımlarını göstermekti. Uygun tekniklerle formüller tek hücrede birleştirilebilir kanısındayım.
 
LET fonksiyonu yeni nesil fonksiyondur. Eski sürümlerde çalışmaz. Bu sebeple eski nesil fonksiyonlar ile çözüm arayışındaydım.

Linkte bu fonksiyonun 2021 sürüm itibariyle çalıştığı belirtilmiş.

LET işlevi - Microsoft Desteği https://share.google/uHuHFkJSzhp39hYKL

Benim çözüm yönteminde amacım işlem adımlarını göstermekti. Uygun tekniklerle formüller tek hücrede birleştirilebilir kanısındayım.
Sizin emeğiniz, bilginiz, katkılarınız tartışılmaz.
🙏
 
Madem LET işleviyle çözüm kullanılabiliyor, o halde en az Excel2021 sürümü mevcut.
Bu durumda, bir çözüm önerisi de benden olsun...
Formülde kullanılan, SIRALI, LET, FİLTRE ve ÇAPRAZARA işlevleri Excel 2021 de mevcuttur.

Not : Ne dosyaları ve ne de resimleri göremem. O nedenle aşağıdaki gibi bir çözüm üretildi...



TarihVade (Tarih+90)Ödeme Tarihi (2. veya 4. Perşembe)
23.02.202625.05.202611 Haziran 2026 Perşembe

A2 hücresinde Tarih mevcut
B2 hücresi önemsiz bir hücre ama Bilgi amaölı olarak, 90 gün sonrası vade tarihi yazıyor
E2 : E103 aralığında 2025 yılından 2030 yılına kadarki resmi tatiller yazılı.

Formül (C2 hücresi)
Kod:
=LET(a;A2+90;b;KÜÇÜK(İŞGÜNÜ.ULUSL(SERİAY(a;SIRALI(25;;-1));{2;4};"1110111");SIRALI(50));c;FİLTRE(b;EĞERSAY(E2:E103;b)=0);ÇAPRAZARA(a;c;c;"";1))

Formül kısaca şöyle çalışıyor.
a parametresi ile A2 deki tarihe 90 ekleniyor.
b parametresi içerisinde, 1110111 kodu ile sadece Perşembe günleri değerlendiriliyor. {2;4} dizisi ile 2. ve 4. Perşembeler alınıyor..İŞGÜNÜ.ULUSL ile a parametresinden bir önceki ayın son gününden önceki aydan itibaren, 25 aylık bir periyot için 2. ve 4. perşembeler yazdırılıyor. KÜÇÜK işleviyle de bu Perşembeler sıralı bir kolonlu bir dizi elde edilmesi sağlanıyor.
c parametresi ile FİLTRE işlevi ile, b parametresinde elde edilen dizi, Resmi Tatil olmayanlara dönüştürülüyor.
Son olarak da, ÇAPRAZARA işleviyle, Tam ya da eşlenen bir büyük değer olarak, Ödeme Tarihi bulunuyor....
 
Madem LET işleviyle çözüm kullanılabiliyor, o halde en az Excel2021 sürümü mevcut.
Bu durumda, bir çözüm önerisi de benden olsun...
Formülde kullanılan, SIRALI, LET, FİLTRE ve ÇAPRAZARA işlevleri Excel 2021 de mevcuttur.

Not : Ne dosyaları ve ne de resimleri göremem. O nedenle aşağıdaki gibi bir çözüm üretildi...



TarihVade (Tarih+90)Ödeme Tarihi (2. veya 4. Perşembe)
23.02.202625.05.202611 Haziran 2026 Perşembe

A2 hücresinde Tarih mevcut
B2 hücresi önemsiz bir hücre ama Bilgi amaölı olarak, 90 gün sonrası vade tarihi yazıyor
E2 : E103 aralığında 2025 yılından 2030 yılına kadarki resmi tatiller yazılı.

Formül (C2 hücresi)
Kod:
=LET(a;A2+90;b;KÜÇÜK(İŞGÜNÜ.ULUSL(SERİAY(a;SIRALI(25;;-1));{2;4};"1110111");SIRALI(50));c;FİLTRE(b;EĞERSAY(E2:E103;b)=0);ÇAPRAZARA(a;c;c;"";1))

Formül kısaca şöyle çalışıyor.
a parametresi ile A2 deki tarihe 90 ekleniyor.
b parametresi içerisinde, 1110111 kodu ile sadece Perşembe günleri değerlendiriliyor. {2;4} dizisi ile 2. ve 4. Perşembeler alınıyor..İŞGÜNÜ.ULUSL ile a parametresinden bir önceki ayın son gününden önceki aydan itibaren, 25 aylık bir periyot için 2. ve 4. perşembeler yazdırılıyor. KÜÇÜK işleviyle de bu Perşembeler sıralı bir kolonlu bir dizi elde edilmesi sağlanıyor.
c parametresi ile FİLTRE işlevi ile, b parametresinde elde edilen dizi, Resmi Tatil olmayanlara dönüştürülüyor.
Son olarak da, ÇAPRAZARA işleviyle, Tam ya da eşlenen bir büyük değer olarak, Ödeme Tarihi bulunuyor....
Formülleri İngilizce olarak düzelttim ama #NAME? hatası verdi, hangisi hatalı oldu.

=LET(a;A2+90;b;SMALL(WORKDAY.INT(EDATE(a;SEQUENCE(25;;-1));2;4};"1110111");SEQUENCE(50));c;FILTER(b;COUNTIF(E2:E103;b)=0);XLOOKUP(a;c;c;"";1))
 
SERİAY = EOMONTH olmalı...
 
Profilinizde 2019 sürümü bilgisi var. Verilen çözüm mesajında 2021 sürümü bilgisi verilmiş.
 
İngilizce olarak, ; ayracı ile...
Kod:
=LET(a;A2+90;b;SMALL(WORKDAY.INTL(EOMONTH(a;SEQUENCE(25;;-1));{2,4};"1110111");SEQUENCE(50));c;FILTER(b;COUNTIF(E2:E103;b)=0);XLOOKUP(a;c;c;"";1))

sizin yazdığınız tercümede, {2;4} dizisinin ilk parantezi EKSİKti.

Eki incelersiniz...
 
Geri
Üst