• DİKKAT

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

Soru Gün Sayısından Yıl Ay Gün bulma

sirkülasyon

Altın Üye
Katılım
10 Temmuz 2012
Mesajlar
2,543
Excel Vers. ve Dili
2021 LTSC TR
E5 : E30 arasında bulunan hücrelere gün sayısını girdiğim zaman hemen yan hücreye anında ... Yıl ... Ay ... Gün yazacak vba koduna ihtiyacım bulunmaktadır. Yardımcı olabilir misiniz?
 
Yılı 360, ayı 30 gün kabul ederek aşağıdaki kodu kullanabilirsiniz. 360 ve 30 olmazsa koddaki sayıları isteğinize göre değiştirin. Kodlar ilgili sayfanın kod bölümüne yapıştırılacak:

Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [E5:E30]) Is Nothing Then Exit Sub
If Selection.Count > 1 Then Exit Sub
If Target = "" Then
    Target.Offset(0, 1) = ""
ElseIf IsNumeric(Target) = False Then
    Target.Offset(0, 1) = ""
Else
    Target.Offset(0, 1) = WorksheetFunction.RoundDown(Target / 360, 0) & " yıl " & WorksheetFunction.RoundDown(Target Mod 360 / 30, 0) & " ay " & Target Mod 30 & " gün "
End If
End Sub
 
Yusuf Hocam
E sütununa 22 yazdığım zaman F sütununa 0 yıl 10 ay 22 gün yazıyor.
850 gün yazdığım zaman 2 yıl 10 ay 10 gün yazıyor.
 
Öyleymiş maalesef, nedenini çözemedim. Aşağıdaki gibi yapınca sıkıntı olmuyor:

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [E5:E30]) Is Nothing Then Exit Sub
If Selection.Count > 1 Then Exit Sub
If Target = "" Then
    Target.Offset(0, 1) = ""
ElseIf IsNumeric(Target) = False Then
    Target.Offset(0, 1) = ""
Else
    Target.Offset(0, 1).FormulaR1C1 = _
        "=ROUNDDOWN(RC[-1]/360,0)&"" yıl ""&ROUNDDOWN(MOD(RC[-1],360)/30,0)&"" ay ""&MOD(RC[-1],30)&"" gün"""
    Target.Offset(0, 1) = Target.Offset(0, 1).Value
End If
End Sub
 
Alternatif olarak.
Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [E5:E30]) Is Nothing Then Exit Sub
If Selection.Count > 1 Then Exit Sub
If Target = "" Then
    Target.Offset(0, 1) = ""
ElseIf IsNumeric(Target) = False Then
    Target.Offset(0, 1) = ""
Else
Target.Offset(0, 1).FormulaLocal = "=Etarihli(0 " & ";" & Target.Address & ";" & """y"")& "" Yıl ""& " _
   & " Etarihli(0 " & ";" & Target.Address & ";" & """ym"")& "" Ay ""& " _
   & "Etarihli(0 " & ";" & Target.Address & ";" & """md"")& "" Gün"""
  End If
End Sub
 
Daha doğru sonuç için
Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [E5:E30]) Is Nothing Then Exit Sub
If Selection.Count > 1 Then Exit Sub
If Target = "" Then
    Target.Offset(0, 1) = ""
ElseIf IsNumeric(Target) = False Then
    Target.Offset(0, 1) = ""
Else
Target.Offset(0, 1).FormulaLocal = "=ETARİHLİ(BUGÜN()" & "-" & Target.Address & ";" & "BUGÜN()" & ";" & """y"")& "" Yıl ""& " _
   & "ETARİHLİ(BUGÜN()" & "-" & Target.Address & ";" & "BUGÜN()" & ";" & """ym"")& "" Ay ""& " _
   & "ETARİHLİ(BUGÜN()" & "-" & Target.Address & ";" & "BUGÜN()" & ";" & """md"")& "" Gün """
  End If
End Sub
 
Bilgilendirme için yazıyorum. Hücreye 43911 yazdığımda hatalı sonuç verdi.
 
Merhaba Arkadaşım,
Acaba bu işinizi görür mü?
İyi çalışmalar
 

Ekli dosyalar

Bilgilendirme için yazıyorum. Hücreye 43911 yazdığımda hatalı sonuç verdi.
Sanıyorum bunun sebebi bugünün (20/03/2020) exceldeki karşılığının 43910 olması. Formül -1. günü bulup, ona göre işlem yaptığından bu hata çıkıyor. Malum excelde tarihler 01/01/1900'den itibaren başlar ve bu tarihin karşılığı 1'dir. Tabi siz daha iyi biliyorsunuz bu durumu :)
 
Merhaba Arkadaşım,
Bu da alternatifi.
Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
   Application.Calculate
    If Intersect(Target, [E5:E30]) Is Nothing Then Exit Sub
    If Target = "" Then
        Target.Offset(0, 1) = ""
            Else
        Target.Offset(0, 1) = Target.Offset(0, 0)
            ActiveCell.FormulaR1C1 = "=DATE(YEAR(RC[-1]),MONTH(RC[-1]),DAY(RC[-1]))"
            Selection.Copy
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
    End If
End Sub
İyi çalışmalar
 
Son düzenleme:
Allah cümlenizden razı olsun. Hepinize ayrı ayrı teşekkür eder, saygılarımı sunarım
 
Sanırım şimdi sorun çıkmaz.
Kod:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [E5:E30]) Is Nothing Then Exit Sub
If Selection.Count > 1 Then Exit Sub
If Target = "" Then
    Target.Offset(0, 1) = ""
ElseIf IsNumeric(Target) = False Then
    Target.Offset(0, 1) = ""
Else
Target.Offset(0, 1).FormulaLocal = "=ETARİHLİ( Bugün()" & ";" & "BUGÜN()" & "+" & Target.Address & ";" & """y"")& "" Yıl ""& " _
   & "ETARİHLİ( Bugün()" & ";" & "BUGÜN()" & "+" & Target.Address & ";" & """ym"")& "" Ay ""& " _
   & "ETARİHLİ( Bugün()" & ";" & "BUGÜN()" & "+" & Target.Address & ";" & """md"")& "" Gün """
End If
End Sub
 
[TR][TD]

150 Gün için = 0 Yıl 4 Ay 28 Gün​
[/TD][/TR]
[TR][TD]
200 Gün İçin = 0 Yıl 6 Ay 16 Gün
olarak veriyor
[/TD][/TR]
 
Sayın sirkülasyon hangi sonucu vermesi gerektiğini ve nasıl hesaplandığını gösterseniz daha iyi olmaz mı?
 
Sayın Hocam;
150 Gün 5 ay
200 Gün 6 Ay 20 gün diye biliyorum.
 
O zaman benim verdiğim kodun çözmesi gerekir. Çözmüyor mu?
 
Yusuf Hocam
Benim mesajım Sayın ÇITIR' ın 13 nolu mesajdaki koda istinaden yazılmıştı.
150 gün ya da 200 gün böyle çıkıyor bilginiz olsun demek istedim. 12 nolu mesajdan sonra yazılan bir mesaj.
 
Soruyu detaylı sormanın önemi burada belli oluyor.

İlk mesajınızda bir iki örnek vererek ve talep ettiğiniz hesaplama yöntemini de izah ederek sorunuzu sorsaydınız konu bu kadar uzamazdı.
 
Sayın sirkülasyon;
150 gün bulunulan ay ve hesap edilen ay arasındaki ayların gün sayısına göre değişebilir.150 günün 5 ay çıkmasını tüm ayların 30 gün olarak kabul edilmesine bağlıdır.Benim verdiğim formüllerde tüm aylar 30 gün değildir.Gerçekde olduğu gibi aylar 30 ve 31 gün şeklinde hesaplama yapılır ve yıl 360 gün değildir.Siz istediğiniz hesaplama yöntemini kullanabilirsiniz.Benimkisi alternatif olsun.
 
Geri
Üst