• DİKKAT

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

ChatGPT'den tarih çözümü

  • Konbuyu başlatan Konbuyu başlatan besen
  • Başlangıç tarihi Başlangıç tarihi

besen

Altın Üye
Katılım
23 Mart 2007
Mesajlar
808
Excel Vers. ve Dili
Microsoft Office Professional Plus 2019
İngilizce
ChatGPT'ye dedim ki;
Excel’de bir formül lazım.
Şöyle ki:
A1 hücresinde bir tarih var, mesela 25.03.2026. Bu tarihe 90 gün vade koyuyorum, 23.06.2026 oluyor.
Bu yeni tarih eğer o ayın 2’nci Perşembesinden öncesiyse o gün, 2’nci Perşembeden sonra ve 4’ncü Perşembeden önceyse o günü bulmam gerekir.
2026 yılı, Haziran ayı, 2’nci Perşembe günü 11 Haziran 2026, 4’üncü Perşembe günü 25 Haziran 2026.
Benim formül sonucu ulaşmam gereken tarih 25 Haziran 2026 olmalı.

Temmuz ayı için bir örnek yapayım.
A1 hücresinde bir tarih var, mesela 10.04.2026. Bu tarihe 90 gün vade koyuyorum, 09.07.2026 oluyor.
2026 yılı, Temmuz ayı, 2’nci Perşembe günü 09 Temmuz 2026, 4’üncü Perşembe günü 23 Temmuz 2026.
Benim formül sonucu ulaşmam gereken tarih 09 Temmuz 2026 olmalı.

İki formül yazdı, alttakini ilk defa görüyorum.

=IF(A1="";"";IF(A1+90<=DATE(YEAR(A1+90);MONTH(A1+90);1)+MOD(4-WEEKDAY(DATE(YEAR(A1+90);MONTH(A1+90);1);2)+7;7)+7;DATE(YEAR(A1+90);MONTH(A1+90);1)+MOD(4-WEEKDAY(DATE(YEAR(A1+90);MONTH(A1+90);1);2)+7;7)+7;DATE(YEAR(A1+90);MONTH(A1+90);1)+MOD(4-WEEKDAY(DATE(YEAR(A1+90);MONTH(A1+90);1);2)+7;7)+21))

=LET(DUE; A1+90;FIRSTDAY; DATE(YEAR(DUE); MONTH(DUE); 1);FIRSTTHU; FIRSTDAY + MOD(4- WEEKDAY(FIRSTDAY; 2); 7);SECONDTHU; FIRSTTHU + 7;FOURTHTHU; FIRSTTHU + 21;IF(DUE <= SECONDTHU;SECONDTHU; FOURTHTHU))
 
ChatGPT'yle formülü bir yere kadar getirdim, Resmi Tatil işin içine girince hesaplayamadı.
Ekli Tabloda görüleceği üzere diğer bütün seçenekler doğru (şimdilik gördüğüm kadarıyla), resmi tatil hesabında 7 gün fark oluyor.
ChatGPT'ye haddini bildirecek biri vardır muhakkak. 🥰
 

Ekli dosyalar

Merhaba,
... Bu yeni tarih eğer o ayın 2’nci Perşembesinden öncesiyse o gün, 2’nci Perşembeden sonra ve 4’ncü Perşembeden önceyse o günü bulmam gerekir. ..

Burada belirttiğiniz her 2 koşulda yine A1+90 gününe denk gelmiyor mu? Neden 2. ve 4. perşembeye takıldınız?

Ve 4.Perşembeyi geçiyor ise hangi tarih gelecek?
 
Merhaba,


Burada belirttiğiniz her 2 koşulda yine A1+90 gününe denk gelmiyor mu? Neden 2. ve 4. perşembeye takıldınız?

Ve 4.Perşembeyi geçiyor ise hangi tarih gelecek?
Açıklamada yazılı. Ertesi ayın ikinci perşembesi.
 
Sorunuz aslında bu kadar kısa diye düşünüyorum:

- A sütununa girmiş olduğum tarihe vade olarak 90 gün vade eklenecek,
- Varılan tarih ilgili ayın 2.Perşembesinden önce ise 2.Perşembe gününün tarihi,
- 2. Perşembesini geçmiş ve 4. Perşembeyi geçmemiş ise 4.Perşembe gününün tarihi,
- Varılan tarih resmi tatil gününe denk geliyor ise 2 hafta sonraki perşembe gününün tarihini yazdırmak istiyorsunuz

Cevap (Formül):
İç içe geçmiş yığılı bir formül ile olur neden olmasın,
*Ad tanımlaması ile resmi tatiller gruplandırıldı: resmi_tatiller **Örnekte tatil günleri rastgele yazılmıştır.

AI ile alınan formül' Alıntı:
=EĞER(EĞERSAY(resmi_tatiller;EĞER(A1+90<=(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+7);(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+7);EĞER(A1+90<=(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+21);(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+21);(SERİAY(A1+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;0)+1;2);7)+7))))>0;EĞER(A1+90<=(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+7);(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+21);EĞER(A1+90<=(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+21);(SERİAY(A1+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;0)+1;2);7)+7);(SERİAY(A1+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;0)+1;2);7)+21)));EĞER(A1+90<=(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+7);(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+7);EĞER(A1+90<=(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+21);(SERİAY(A1+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;-1)+1;2);7)+21);(SERİAY(A1+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİAY(A1+90;0)+1;2);7)+7))))

Cevap (VBA):
Bu kadar uzun formül ile uğraşmak istemiyorum, daha kısa bir yol arıyorum diyorsanız Kullanıcı Tanımlı Fonksiyon yazabilirsiniz.

Dosyanıza modül ekleyin ve içine bu kodları yazın, kullanmak istediğiniz yerde ilgili hücre için formülü kullanın: (Ör: A90 hücresi) =PersembeHesapla(A90)

AI ile alınan VBA kodları' Alıntı:
Function PersembeHesapla(hucre As Range) As Variant
Dim hedefTarih As Date
Dim P2 As Date, P4 As Date, P2_Gelecek As Date, P4_Gelecek As Date
Dim finalTarih As Date

If Not IsDate(hucre.Value) Then
PersembeHesapla = "Geçersiz Tarih"
Exit Function
End If

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

' 2. Adım: O ayın 2. ve 4. Perşembesini bul
P2 = NinciPersembeBul(Year(hedefTarih), Month(hedefTarih), 2)
P4 = NinciPersembeBul(Year(hedefTarih), Month(hedefTarih), 4)

' 3. Adım: Sonraki ayın 2. ve 4. Perşembesini bul
Dim gelecekAy As Date
gelecekAy = DateAdd("m", 1, hedefTarih)
P2_Gelecek = NinciPersembeBul(Year(gelecekAy), Month(gelecekAy), 2)
P4_Gelecek = NinciPersembeBul(Year(gelecekAy), Month(gelecekAy), 4)

' 4. Adım: Tarih seçim mantığı
If hedefTarih <= P2 Then
finalTarih = P2
ElseIf hedefTarih <= P4 Then
finalTarih = P4
Else
finalTarih = P2_Gelecek
End If

' 5. Adım: Resmi Tatil kontrolü (Eğer tatilse bir sonrakine atla)
' Not: "resmi_tatiller" adında bir alan tanımladığınızdan emin olun
On Error Resume Next ' Liste yoksa hata vermemesi için
If WorksheetFunction.CountIf(Range("resmi_tatiller"), finalTarih) > 0 Then
If finalTarih = P2 Then
finalTarih = P4
ElseIf finalTarih = P4 Then
finalTarih = P2_Gelecek
ElseIf finalTarih = P2_Gelecek Then
finalTarih = P4_Gelecek
End If
End If
On Error GoTo 0

PersembeHesapla = finalTarih
End Function

' Düzenlenmiş Yardımcı Fonksiyon
Function NinciPersembeBul(Yil As Integer, Ay As Integer, N As Integer) As Date
Dim ilkGun As Date
Dim gunFarki As Integer

ilkGun = DateSerial(Yil, Ay, 1)

' Perşembe haftanın 4. günüdür (Pazartesi=1 alırsak)
' (İstediğimizGün - MevcutGün + 7) Mod 7 formülü
gunFarki = (4 - Weekday(ilkGun, vbMonday) + 7) Mod 7

' Ayın ilk Perşembesi + (N-1) hafta
NinciPersembeBul = ilkGun + gunFarki + ((N - 1) * 7)
End Function
Sonuç:
1773855455339.png

İyi çalışmalar.
 
EĞERSAY(resmi_tatiller yerine ne yazacağım, hücre aralığını mı? =($A$8:$A$12)
 
*Ad tanımlaması ile resmi tatiller gruplandırıldı: resmi_tatiller
Ad tanımlaması için kullanacağınız formülü soruyorsanız sayfayı da belirtmeniz gerekir. =Sayfa1!$A$8:$A$12
yada verdiğiniz formülü resmi_tatiller yazan yer ile değiştirebilirsiniz.

=EĞER(EĞERSAY($A$8:$A$12;EĞER(A1+90< ...

*Kullandığınız sürümün ingilizce olduğunu atlayıp türkçe olarak formülü paylaşmış bulundum bu siteden ingilizceye çevirebilirsiniz.

İyi çalışmalar
 
Son düzenleme:
Ad tanımlaması için kullanacağınız formülü soruyorsanız sayfayı da belirtmeniz gerekir. =Sayfa1!$A$8:$A$12
yada verdiğiniz formülü resmi_tatiller yazan yer ile değiştirebilirsiniz.

=EĞER(EĞERSAY($A$8:$A$12;EĞER(A1+90< ...

*Kullandığınız sürümün ingilizce olduğunu atlayıp türkçe olarak formülü paylaşmış bulundum bu siteden ingilizceye çevirebilirsiniz.

İyi çalışmalar
#VALUE! çıktı neyi yanlış yaptım acaba? F1 hücresine bakar mısınız.
 

Ekli dosyalar

#VALUE! çıktı neyi yanlış yaptım acaba? F1 hücresine bakar mısınız.

Yukarıda vermiş olduğum formülü direk kullandığınızda dosyanızın A1 hücresinde tarih olmadığından değer hatası almanız normal.
Örnek dosyanız orijinal dosyanız ile aynı konumda ise; F8 hücresi için bu formülde bulunan A1 referanslarını B8 olarak değiştirmeniz gerekir.

Yani dosyanızda 8.satırda dilediğiniz sütunda (Dosyanızda F8) formülü yapıştırıp aşağı doğru hücre kulpundan çekebilirsiniz.

B8 de işlem tarihi başlıyorsa kullanman gereken formül' Alıntı:
=EĞER(EĞERSAY(resmi;EĞER(B8+90<=(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+7);(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+7);EĞER(B8+90<=(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+21);(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+21);(SERİTARİH(B8+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;0)+1;2);7)+7))))>0;EĞER(B8+90<=(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+7);(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+21);EĞER(B8+90<=(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+21);(SERİTARİH(B8+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;0)+1;2);7)+7);(SERİTARİH(B8+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;0)+1;2);7)+21)));EĞER(B8+90<=(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+7);(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+7);EĞER(B8+90<=(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+21);(SERİTARİH(B8+90;-1)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;-1)+1;2);7)+21);(SERİTARİH(B8+90;0)+1+MOD(4-HAFTANINGÜNÜ(SERİTARİH(B8+90;0)+1;2);7)+7))))
 
Yukarıda vermiş olduğum formülü direk kullandığınızda dosyanızın A1 hücresinde tarih olmadığından değer hatası almanız normal.
Örnek dosyanız orijinal dosyanız ile aynı konumda ise; F8 hücresi için bu formülde bulunan A1 referanslarını B8 olarak değiştirmeniz gerekir.

Yani dosyanızda 8.satırda dilediğiniz sütunda (Dosyanızda F8) formülü yapıştırıp aşağı doğru hücre kulpundan çekebilirsiniz.
Haklısınız dikkatsizlik oldu.
Ancak ilk tarihe göre 11.06.2026 gelmeli, bu formülde de 04.06.2026 geliyor.
 
23.02.2026 tarihine göre sonuç neden 11.06.2026 çıkmalı?

Bu tarihe 90 gün ekleyince sonuç ; 24.05.2026 çıkıyor. Bu tarih MAYIS ayının 2. Perşembe ve 4. Perşembe günü arasında kalıyor. Bu durumda 2. koşul maddeniz geçerli oluyor. Sonuç olarak 28.05.2026 tarihi çıkmalı..

Sanırım burada 4. koşulunuz devreye giriyor.

Koşul 4 ; Çıkan Tarihe göre hesaplanan Perşembe günü, Resmi Tarihe denk geliyorsa ve ikinci Perşembe içinde kalıyorsa, İkinci Perşembe, 4'üncü Perşembe içinde kalıyorsa 4'üncü Perşembe gelmeli.

28.05.2026 tarihi resmi tatile denk geliyor. Burada kırmızı bölümlerde bir karışıklık var sanırım. Hangi ayın 2. ve 4. Perşembe günü kast ediliyor.
 
23.02.2026 tarihine göre sonuç neden 11.06.2026 çıkmalı?

Bu tarihe 90 gün ekleyince sonuç ; 24.05.2026 çıkıyor. Bu tarih MAYIS ayının 2. Perşembe ve 4. Perşembe günü arasında kalıyor. Bu durumda 2. koşul maddeniz geçerli oluyor. Sonuç olarak 28.05.2026 tarihi çıkmalı..

Sanırım burada 4. koşulunuz devreye giriyor.

Koşul 4 ; Çıkan Tarihe göre hesaplanan Perşembe günü, Resmi Tarihe denk geliyorsa ve ikinci Perşembe içinde kalıyorsa, İkinci Perşembe, 4'üncü Perşembe içinde kalıyorsa 4'üncü Perşembe gelmeli.

28.05.2026 tarihi resmi tatile denk geliyor. Burada kırmızı bölümlerde bir karışıklık var sanırım. Hangi ayın 2. ve 4. Perşembe günü kast ediliyor.
23.02.2026'ya 90 gün eklenince 24.05.2026 oluyor, buna göre ödeme günü 4'üncü perşembe olan 28.05.2026'ya denk geliyor, bu tarihte resmi tatil olduğu için valör, bir sonraki ayın ikinci perşembe gününe sarkıyor bu tarihte haziran ayının 11'i, yani sonraki ayın ikinci perşembesinin tarihi
 
Son düzenleme:
Peki 28.05.2026 tarihi için 4. koşulunuzda ki "ikinci Perşembe içinde kalıyorsa" ya da "4. Perşembe içinde kalıyorsa" kısmını anlamadım.
 
Peki 28.05.2026 tarihi için 4. koşulunuzda ki "ikinci Perşembe içinde kalıyorsa" ya da "4. Perşembe içinde kalıyorsa" kısmını anlamadım.

23.02.2026'ya 90 gün eklenince 24.05.2026 oluyor, buna göre ödeme günü 4'üncü perşembe olan 28.05.2026'ya denk geliyor, bu tarihte resmi tatil olduğu için valör, bir sonraki ayın ikinci perşembe gününe sarkıyor bu tarihte haziran ayının 11'i, yani sonraki ayın ikinci perşembesinin tarihi

Bu örneği, 14.05.2026 üzerinden yapalım, 90 gün sonrası 12.08.2026, ikinci perşembe 13.08.2026 ya denk geliyor bunun resmi tatil olduğunu düşünürsek, tarih 27.08.2026'ya, yani dördüncü perşembeye kayıyor.
 
Peki ay içinde 5-6 adet Perşembe varsa durum ne olacak?
 
Merhaba,

Formülü test ettiğim dosyadan bir görüntü ekliyorum, bendeki listede resmi tatiller arasında söz konusu tarih yok. Eklediğim zaman otomatik olarak belirttiğiniz tarihe zaten geliyor. Formül bende kusursuz çalışıyor belirttiğiniz şekilde.

 
Söyleminiz sonrasında yeni oluşan yani 11/06/2026 tarihinide resmi tatil listeme eklediğimde formül sonuçları eşleşenler arasından bazıları değişirken bazıları sabit kalıyor. Bunu Yapay zekaya danıştığımda verilen cevap

Harika bir tespit! Formülün neden "durduğunu" çok net bir şekilde yakalamışsın. Yaşadığın bu durum, Excel formüllerinin "statik" yapısından kaynaklanıyor.

Sorun Neden Kaynaklanıyor?​

Yazdığımız formül şu mantıkla çalışıyordu: "Eğer ilk seçtiğim gün tatilse, bana bir sonrakini ver." Ancak formül orada duruyor. Yani, "Peki, o verdiğin 'bir sonraki' gün de tatilse ne yapayım?" sorusunu sormuyor.

Excel 2019'da bunu çözmek için ya formülü iç içe (matruşka gibi) kat kat büyütmemiz gerekir ya da VBA ile bir döngü (loop) kurmamız gerekir.

1. Çözüm: VBA (Döngü Kullanarak Kesin Çözüm)​

Makro kullanmanın en büyük avantajı budur: "Tarih, tatil listesinde olmayana kadar ilerle" diyebiliriz. Aşağıdaki kod, tarih tatil listesinde olduğu sürece bir sonraki "istasyon"a (2. Perşembe veya 4. Perşembe) atlamaya devam eder.

C++:
...

Vba kodunu vermedim sebebi, önerdiği vba kodunda yaptığım denemelerde doğru sonuçtan uzaklaştığını gördüm. Denemelerim sonucu stabil olursa paylaşacağım.

Ben bulana kadar belki Korhan Bey kestirme bir yoldan çözümleyebilir.:)
 
Son düzenleme:
Geri
Üst