Fonsiyonlarda seri tanımlama

Katılım
19 Mayıs 2012
Mesajlar
9
Excel Vers. ve Dili
Excel 2007
Bazı formüllerde aralık şeklinde değilde seçtiğim hücrelerden oluşan bir seri tanımlamak istiyorum. Bunun için aşağıdaki fonksiyonu yazdım. Ama çok uzun bunu daha kısa yazabilme imkanı var mıdır?

Kod:
Function seri_olustur(Değer1, Değer2, Optional Değer3, Optional Değer4, Optional Değer5, Optional Değer6, Optional Değer7, Optional Değer8, Optional Değer9, Optional Değer10)
If IsNull(Değer2) = True Or IsMissing(Değer2) = True Then
seri_olustur = Array(Değer1)
Else
If IsNull(Değer3) = True Or IsMissing(Değer3) = True Then
seri_olustur = Array(Değer1, Değer2)
Else
If IsNull(Değer4) = True Or IsMissing(Değer4) = True Then
seri_olustur = Array(Değer1, Değer2, Değer3)
Else
If IsNull(Değer5) = True Or IsMissing(Değer5) = True Then
seri_olustur = Array(Değer1, Değer2, Değer3, Değer4)
Else
If IsNull(Değer6) = True Or IsMissing(Değer6) = True Then
seri_olustur = Array(Değer1, Değer2, Değer3, Değer4, Değer5)
Else
If IsNull(Değer7) = True Or IsMissing(Değer7) = True Then
seri_olustur = Array(Değer1, Değer2, Değer3, Değer4, Değer5, Değer6)
Else
If IsNull(Değer8) = True Or IsMissing(Değer8) = True Then
seri_olustur = Array(Değer1, Değer2, Değer3, Değer4, Değer5, Değer6, Değer7)
Else
If IsNull(Değer9) = True Or IsMissing(Değer9) = True Then
seri_olustur = Array(Değer1, Değer2, Değer3, Değer4, Değer5, Değer6, Değer7, Değer8)
Else
If IsNull(Değer10) = True Or IsMissing(Değer10) = True Then
seri_olustur = Array(Değer1, Değer2, Değer3, Değer4, Değer5, Değer6, Değer7, Değer8, Değer9)
Else
seri_olustur = Array(Değer1, Değer2, Değer3, Değer4, Değer5, Değer6, Değer7, Değer8, Değer9, Değer10)
End If
End If
End If
End If
End If
End If
End If
End If
End If
End Function
 
Son düzenleme:

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,374
Excel Vers. ve Dili
Ofis 365 Türkçe
Merhaba,

Ne yaptığınızı değil de ne yapmak istediğinizi anlatırsanız çözüme daha çabuk ulaşırsınız.

Örneğin A1,A3 ve A5 hücrelerini seçtiğinizi varsayalım.

Seriden kastınız ne? 1, 2 ve 3 mü yazılacak? Yoksa Ocak, Şubat Mart mı? vs vs vs.

Örneğin önce hücreleri seçip aşağıdaki kodları çalıştırırsanız 1 den başlayarak hücreleri 1, 2, 3 ... 99 diye doldurur.

Kod:
Sub SeriYaz()

    Dim i   As Integer, _
        Hcr As Range
    
    For Each Hcr In Selection
        i = i + 1
        Hcr = i
    Next Hcr
    
End Sub
 
Katılım
19 Mayıs 2012
Mesajlar
9
Excel Vers. ve Dili
Excel 2007
Necdet bey merhaba;

Örneğin; ANBD Fonksiyonunu düşünelim.

ANBD(0.09, A2:A6, B2:B6) şeklinde değerler ve tarihler seri şeklinde girilmekte. Değerleri ele alalım. A2:A6 aralığını seçtik diyelim. Bu seçimimiz bir seri Excel işlem yaparken {10/11/15/16/18} şeklinde seçimimizi işleme alıyor. Burada sorun şu, ben bir aralık değil {A2;A4;A6} hücre değerlerini YANİ {10/15/18} seçmek istiyorum. Excel bu duruma müsaade etmiyor. Bu durumu aşmak için ANBD fonksiyonu içindeki değerler alanına yukarıda girdiğim şekli ile seri oluştur fonksiyonu tanımladım. Bununla meselemi hallediyorum. Sorun fonksiyon çok uzun daha kısa yazabilir miyim?
 
Son düzenleme:

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,374
Excel Vers. ve Dili
Ofis 365 Türkçe
Merhaba,

Hiç bir şey anlamadım.

A1 = 1
A2 = 2
A3 = 3
A4 = 4
A5 = 5 Değerleri var ve siz A1,A3 ve A5'i seçtiğinizde aslında 1, 3 ve 5 değerlerini mi almak istiyorsunuz?
 
Katılım
19 Mayıs 2012
Mesajlar
9
Excel Vers. ve Dili
Excel 2007
Necdet bey;

ANBD fonksiyonunda değerler kısmına A1,A3 ve A5 hücrelerini (1, 3 ve 5 değerlerini) seçmeyi deneyin konuyu anlayacaksınız.
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,374
Excel Vers. ve Dili
Ofis 365 Türkçe
Merhaba,

A1=1
A2=2
A3=3
A4=4
A5=5
A6=6
A7=7
A8=8 ese

siz A1, A3 ve A5'i seçtiğinizde {1\3\5},

ya da A1:A3' seçtiğinizde {1\2\3}
yada

A1:A3,A5'i seçtiğinizde {1\2\3\5} olmasını istiyorsunuz sanırım

İstediğiniz hücreleri seçip fonksiyonda kullandığımda örneğin A1:A5 seçildiğinde sorun yaşamadım ama A1;A3;A5 seçtiğimde fonksiyon içinde kullanamadım.

Bunun için fonksiyonu çağırırken =SeriD(
dedikten sonra istediğiniz hücreleri gerek A1:A3 gibi yada karışık
A1:A3;a6;A8 gibi seçtiğinizde seçtikten sonra değerlerin başına ve sonuna ÇİFT TIRNAK koyarak fonksiyonu tamamlarsanız size sonucu üretecektir.

yani =SERID("A1:A4;A7")
Olarak fonksiyonu çağırdığınızda size {1\2\3\4\7} sonucunu üretecektir.

Umarım doğru anlamışımdır.

Kod:
Function SeriD(Deger As String) As String
    
    Dim Txt As String, _
        i   As Integer, _
        j   As Integer, _
        Hcr As Range, _
        d
        
    d = Split(Deger, ";")
    Txt = "{"
    
    For i = 0 To UBound(d)
        If InStr(d(i), ":") > 0 Then
            For Each Hcr In Range(d(i))
                Txt = Txt & "\" & Hcr
            Next Hcr
        Else
            Txt = Txt & "\" & Range(d(i))
        End If
    Next i

    If Txt = "{" Then
        SeriD = ""
    Else
        SeriD = Txt & "}"
    End If
    
End Function
 
Katılım
19 Mayıs 2012
Mesajlar
9
Excel Vers. ve Dili
Excel 2007
Necdet bey merhaba;

Size de zahmet verdim kusura bakmayın. Yazdığınız fonksiyon {1\2\3\4\7} şeklinde görüntü olarak seriye benzer sonuç veriyor. Fakat fonksiyon içinde kullanıldığında string bir değer olduğu için hesaplama yapmıyor.

Sizden ricam benim yukarıda yazdığım seri fonksiyonunu koyalayıp ANBD fonksiyonu içerisinde kullanın. Yazdığım fonksiyon sorunsuz çalışıyor. Sadece çok uzun.

faiz oranı 0,10%

tarih değer
01.12.2016 100
28.12.2016 101
24.01.2017 102
20.02.2017 103
19.03.2017 104
15.04.2017 105

#DEĞER! sizin yazdığınız fonksiyon
305,9541656 benim yazdığım fonksiyon
 
Katılım
19 Mayıs 2012
Mesajlar
9
Excel Vers. ve Dili
Excel 2007
Necdet bey merhaba;

Size de zahmet verdim kusura bakmayın. Yazdığınız fonksiyon {1\2\3\4\7} şeklinde görüntü olarak seriye benzer sonuç veriyor. Fakat fonksiyon içinde kullanıldığında string bir değer olduğu için hesaplama yapmıyor.

Sizden ricam benim yukarıda yazdığım seri fonksiyonunu koyalayıp ANBD fonksiyonu içerisinde kullanın. Yazdığım fonksiyon sorunsuz çalışıyor. Sadece çok uzun.

faiz oranı 0,10%

tarih değer
01.12.2016 100
28.12.2016 101
24.01.2017 102
20.02.2017 103
19.03.2017 104
15.04.2017 105

#DEĞER! sizin yazdığınız fonksiyon
305,9541656 benim yazdığım fonksiyon
 

Merhum İdris SERDAR

Moderatör
Yönetici
Katılım
21 Ekim 2005
Mesajlar
17,094
Excel Vers. ve Dili
Excel, 365 - İngilizce
Necdet bey merhaba;

Örneğin; ANBD Fonksiyonunu düşünelim.

ANBD(0.09, A2:A6, B2:B6) şeklinde değerler ve tarihler seri şeklinde girilmekte. Değerleri ele alalım. A2:A6 aralığını seçtik diyelim. Bu seçimimiz bir seri Excel işlem yaparken {10/11/15/16/18} şeklinde seçimimizi işleme alıyor. Burada sorun şu, ben bir aralık değil {A2;A4;A6} hücre değerlerini YANİ {10/15/18} seçmek istiyorum. Excel bu duruma müsaade etmiyor. Bu durumu aşmak için ANBD fonksiyonu içindeki değerler alanına yukarıda girdiğim şekli ile seri oluştur fonksiyonu tanımladım. Bununla meselemi hallediyorum. Sorun fonksiyon çok uzun daha kısa yazabilir miyim?
.

Söz konusu ANBD işlevi ise, şu şekilde kullanmak işinize yarayabilir.

http://s3.dosya.tc/server9/cc5akp/ANBD-XNPV.xlsx.html


.
 
Katılım
19 Mayıs 2012
Mesajlar
9
Excel Vers. ve Dili
Excel 2007
İdris bey teşekkür ederim.

Fakat seri tanımlama sadece ANBD fonksiyonunda değil birçok fonksiyonda gerekli. Fonksiyonu aşağıdaki şekilde kısa hale getirdim.
Kod:
Function seri_olustur(Değer1, Değer2, Optional Değer3, Optional Değer4, Optional Değer5, Optional Değer6, Optional Değer7, Optional Değer8, Optional Değer9, Optional Değer10)
dizi = Array(Değer1, Değer2, Değer3, Değer4, Değer5, Değer6, Değer7, Değer8, Değer9, Değer10)
For i = 0 To 9
 If IsNull(dizi(i)) = True Or IsMissing(dizi(i)) = True Then
 Exit For
 Else
 sayı = i
 End If
Next i
ReDim yenidizi(sayı) As Double
For j = 0 To sayı
 yenidizi(j) = dizi(j)
Next j
seri_olustur = yenidizi
End Function
 
Katılım
19 Mayıs 2012
Mesajlar
9
Excel Vers. ve Dili
Excel 2007
Seri oluştur fonksiyonunda aşağıdaki şekli ile ile daha kullanışlı oldu. Çünkü bazen hem aralık hem de hücre seçimi yapılması gerekebilir. Yapılan tüm seçimlerin seri olarak tanımlanmasına imkan tanıyan aşağıdaki fonksiyon birçok kişinin işine yarayabilir. Fonksiyonun son hali aşağıda.
Kod:
Function seri_olustur(Değer1, Optional Değer2, Optional Değer3, Optional Değer4, Optional Değer5, Optional Değer6, Optional Değer7, Optional Değer8, Optional Değer9, Optional Değer10)
tum_seri = Array(Değer1, Değer2, Değer3, Değer4, Değer5, Değer6, Değer7, Değer8, Değer9, Değer10)
'İlk olarak hangi değerlerin seri olduğu bulunup yeni serinin toplam büyüklüğü saptanacak
dizielemansayısı_s = 0
sondeger = -1
For t = 0 To 9
  If IsArray(tum_seri(t)) Then
  dizielemansayısı_s = dizielemansayısı_s + WorksheetFunction.Count(tum_seri(t))
  sondeger = sondeger + 1
  Else
    If IsNull(tum_seri(t)) = True Or IsMissing(tum_seri(t)) = True Then
    Else
    dizielemansayısı_s = dizielemansayısı_s + 1
    sondeger = sondeger + 1
    End If
  End If
Next t
ReDim yenidizi(dizielemansayısı_s - 1) As Double
yenidizielemansayısı = (dizielemansayısı_s - 1)
'Bu noktadan sonra önce seri olanlar sonra seri olmayanlara değer atanacak
yeniseri_sırano = 0
For x = 0 To dizielemansayısı_s - 1
  If IsArray(tum_seri(x)) Then
   aradizi_elemansayısı = WorksheetFunction.Count(tum_seri(x))
   For w = 1 To aradizi_elemansayısı
   yenidizi(yeniseri_sırano) = tum_seri(x)(w)
   yeniseri_sırano = yeniseri_sırano + 1
   Next w
  Else
   For q = x To sondeger
   If IsArray(tum_seri(q)) Then
   GoTo devam
   Else
   yenidizi(yeniseri_sırano) = tum_seri(q)
   yeniseri_sırano = yeniseri_sırano + 1
     If yeniseri_sırano > yenidizielemansayısı Then GoTo tamam
   End If
   Exit For
   Next q
  End If
devam:
Next x
tamam:
seri_olustur = yenidizi
End Function
 
Son düzenleme:
Üst