Bir diziyi Sıralamak Mümkünmüdür?

Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
Sayın Ferhat Hocamın yapmış olduğu benzersiz kayıtları bulan diziyi biraz değiştirerek kendi ihtiyaçlarım doğrultusunda geliştirdim.

Fonksiyon bir aralıktaki benzersiz kayıtları diziye alıyor mesala

a1:a10 aralığındaki verilerimiz
Mustafa Iş., Ali KARAT…, Hüseyin KAP…, Hasan GEÇ……, Elif KO….., İsmet Yaş.. OKÇ……., Hasan KAP….., Hüseyin KAR………, Mehmet ÖZ…., Hasan GAÇ……,

ise diziye alındığındaki görüntü
Ali KARAT…, Elif KO….., Hasan GAÇ……, Hasan GEÇ……, Hasan KAP….., Hüseyin KAP…, Hüseyin KAR………, İsmet Yaş.. OKÇ……., Mehmet ÖZ…., Mustafa Iş.,

bu şekilde alfabetik sıralama yapılabilirmi

Kod:
Function Benzersiz_Kayit(Aralik As Range, Sira As Integer, _
                    Optional ByVal Kayıtlar As Boolean = True)
'Elemanları hücreye yazmak için
    'VBA   da    : Benzersiz_Kayit(Aralik, i + 1) şeklinde kullanmalısınız. Sırano 1 den başlar.
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;SATIR()-1) şeklinde kullanabilirsiniz.
    'Dikkat Aralığın son hücresini diekkate almıyor Sayfa3!$C$3:$C$23 yazımı aslında Sayfa3!$C$3:$C$22 ye kadar ?????
 
 
''Eleman sayısını öğrenmek için
    'VBA   da    : Benzersiz_Kayit(Aralik, 1, False) şeklinde kullanmalısınız. Sıra no olarak 1 kullanın
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;1;0) şeklinde kullanbilirsiniz.
 
 
 
Dim hcr As Range
Dim arrVeri()
Dim i&, j&, x&, y&
For Each hcr In Aralik.Cells
    i = i + 1
    If i = 1 Then
       ReDim Preserve arrVeri(y)
       arrVeri(y) = ucasetr(hcr)
    Else
       For j = 0 To UBound(arrVeri)
           If ucasetr(hcr) = arrVeri(j) Then: x = x + 1
       Next j
       If x = 0 Then
          y = y + 1
          ReDim Preserve arrVeri(y)
          arrVeri(y) = ucasetr(hcr)
       End If
       x = 0
    End If
Next
 
If Kayıtlar = True Then
    If Sira > UBound(arrVeri) Then
        'Exit Sub
        Benzersiz_Kayit = ""
    Else
        Benzersiz_Kayit = arrVeri(Sira - 1)
    End If
Else
    Benzersiz_Kayit = UBound(arrVeri)
End If
End Function
Kod:
Function UCaseTr(ByVal metin As String)
    UCaseTr = UCase(Replace(Replace(metin, "ı", "I"), "i", "İ"))
End Function
 
Son düzenleme:
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
GÜnaydın.
Güncel yardım edebilirseniz sevinirim.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
iyi akşamlar.
Güncel yardım edebilirseniz sevinirim.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
GÜnaydın.
Güncel yardım edebilirseniz sevinirim.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
GÜnaydın.
Güncel yardım edebilirseniz sevinirim.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
Sayın Ferhat Hocamın yapmış olduğu benzersiz kayıtları bulan diziyi biraz değiştirerek kendi ihtiyaçlarım doğrultusunda geliştirdim.

Fonksiyon bir aralıktaki benzersiz kayıtları diziye alıyor mesala

a1:a10 aralığındaki verilerimiz
Mustafa Iş., Ali KARAT…, Hüseyin KAP…, Hasan GEÇ……, Elif KO….., İsmet Yaş.. OKÇ……., Hasan KAP….., Hüseyin KAR………, Mehmet ÖZ…., Hasan GAÇ……,

ise diziye alındığındaki görüntü
Ali KARAT…, Elif KO….., Hasan GAÇ……, Hasan GEÇ……, Hasan KAP….., Hüseyin KAP…, Hüseyin KAR………, İsmet Yaş.. OKÇ……., Mehmet ÖZ…., Mustafa Iş.,

bu şekilde alfabetik sıralama yapılabilirmi

Kod:
Function Benzersiz_Kayit(Aralik As Range, Sira As Integer, _
                    Optional ByVal Kayıtlar As Boolean = True)
'Elemanları hücreye yazmak için
    'VBA   da    : Benzersiz_Kayit(Aralik, i + 1) şeklinde kullanmalısınız. Sırano 1 den başlar.
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;SATIR()-1) şeklinde kullanabilirsiniz.
    'Dikkat Aralığın son hücresini diekkate almıyor Sayfa3!$C$3:$C$23 yazımı aslında Sayfa3!$C$3:$C$22 ye kadar ?????
 
 
''Eleman sayısını öğrenmek için
    'VBA   da    : Benzersiz_Kayit(Aralik, 1, False) şeklinde kullanmalısınız. Sıra no olarak 1 kullanın
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;1;0) şeklinde kullanbilirsiniz.
 
 
 
Dim hcr As Range
Dim arrVeri()
Dim i&, j&, x&, y&
For Each hcr In Aralik.Cells
    i = i + 1
    If i = 1 Then
       ReDim Preserve arrVeri(y)
       arrVeri(y) = ucasetr(hcr)
    Else
       For j = 0 To UBound(arrVeri)
           If ucasetr(hcr) = arrVeri(j) Then: x = x + 1
       Next j
       If x = 0 Then
          y = y + 1
          ReDim Preserve arrVeri(y)
          arrVeri(y) = ucasetr(hcr)
       End If
       x = 0
    End If
Next
 
If Kayıtlar = True Then
    If Sira > UBound(arrVeri) Then
        'Exit Sub
        Benzersiz_Kayit = ""
    Else
        Benzersiz_Kayit = arrVeri(Sira - 1)
    End If
Else
    Benzersiz_Kayit = UBound(arrVeri)
End If
End Function
Kod:
Function UCaseTr(ByVal metin As String)
    UCaseTr = UCase(Replace(Replace(metin, "ı", "I"), "i", "İ"))
End Function
Güncel yardım edebilirseniz sevinirim.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
Güncel yardım edebilirseniz sevinirim.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
Hocam dediğiniz yöntemi denedim ama değer hatası veriyor hatam nerede acaba
Kod:
Function Benzersiz_Kayit(Aralik As Range, Sira As Integer, _
                    Optional ByVal Kayıtlar As Boolean = True)
'Elemanları hücreye yazmak için
    'VBA   da    : Benzersiz_Kayit(Aralik, i + 1) şeklinde kullanmalısınız. Sırano 1 den başlar.
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;SATIR()-1) şeklinde kullanabilirsiniz.
    'Dikkat Aralığın son hücresini diekkate almıyor Sayfa3!$C$3:$C$23 yazımı aslında Sayfa3!$C$3:$C$22 ye kadar ?????
 
 
''Eleman sayısını öğrenmek için
    'VBA   da    : Benzersiz_Kayit(Aralik, 1, False) şeklinde kullanmalısınız. Sıra no olarak 1 kullanın
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;1;0) şeklinde kullanbilirsiniz.
Dim hcr As Range
Dim arrVeri()
Dim i&, j&, x&, y&
For Each hcr In Aralik.Cells
    i = i + 1
    If i = 1 Then
       ReDim Preserve arrVeri(y)
       arrVeri(y) = ucasetr(hcr)
    Else
       For j = 0 To UBound(arrVeri)
           If ucasetr(hcr) = arrVeri(j) Then: x = x + 1
       Next j
       If x = 0 Then
          y = y + 1
          ReDim Preserve arrVeri(y)
          arrVeri(y) = ucasetr(hcr)
       End If
       x = 0
    End If
Next
'======================
 For i = 0 To UBound(arrVeri) - 1
    For j = i + 1 To UBound(arrVeri) - 1
        If arrVeri(i) > arrVeri(j) Then
           x = arrVeri(i)
           arrVeri(i) = arrVeri(j)
           arrVeri(j) = x
        End If
    Next j
Next i
'======================
If Kayıtlar = True Then
    If Sira > UBound(arrVeri) Then
        'Exit Sub
        Benzersiz_Kayit = ""
    Else
        Benzersiz_Kayit = arrVeri(Sira - 1)
    End If
Else
    Benzersiz_Kayit = UBound(arrVeri)
End If
End Function
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Long olarak tanımladığınız bir değişkene; String türünde bir değer yüklemeye çalışmışsınız (x değişkeni)

Kodunuzun belirtilen kısmını değiştirin.

Kod:
Dim [COLOR=red]eleman[/COLOR] as string
..........
..........
For i = 0 To UBound(arrVeri) - 1
    For j = i + 1 To UBound(arrVeri) - 1
        If arrVeri(i) > arrVeri(j) Then
           [COLOR=red]eleman[/COLOR] = arrVeri(i)
           arrVeri(i) = arrVeri(j)
           arrVeri(j) = [COLOR=red]eleman
[/COLOR]        End If
    Next j
Next i
.......
.......
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
teşekkürler hocam.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
Hocam tekrar teşekkür ederim yalnız bu işte bir terslik var Ç,Ş,Ö,İ gibi Türk Alfabesinde kullanılan sesler sıralamada Y den Sonra Z Den önce yer alıyor.. bir şey yapılabilirmi?

Gerçi benim aklıma Diziyi IV1 e atıp sıralamak ve diziye tekrar almak geldi ama
Range("H1").Resize(UBound(arrVeri) + 1).Value = arrVeri ' veriyi hücreler yaz. (Not: H görebilmek için kulladım)
satırında takıldım. eğer geçersem Normal excel sıralaması yaptırıp
ArrVeri = Range("H1:H" & [H65536].End(3).Row).Value 'Veri aralığını geri al
şeklinde düşünüyorum ama olmadı
 
Son düzenleme:
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
teşekkür ederim
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
SN VeyselEmre nin kodlarında metin fromatlı olmayan hücrelerde hata veriyordu
aşmak için kendisini kodlarında küçük bir yeniden düzenleme yaptım.
Ancak kırmızı satırları açıklyabilirseniz sevinirim.
Ayrıca
For Each B In arrVeri
Satırnda b nin veri tipi nedir?
Kod:
Sub deneme()
On Error Resume Next


Dim arrVeri():  arrVeri = Range("a1:B" & [a65536].End(3).Row).Value
[C:C].ClearContents

Dim col As New Collection
For Each [COLOR=Red]B[/COLOR] In arrVeri
    col.Add B, Format(B, "@")
Next

say = col.Count
ReDim arrVeri(1 To say)
For y = 1 To say
    arrVeri(y) = col(y)
Next y
Set col = Nothing

'Sırala=====================================================================\\
For y = 1 To say - 1                                                       'II
    For z = y + 1 To say                                                   'II
       [COLOR=Red] If StrComp(arrVeri(y), arrVeri(z), vbTextCompare) [/COLOR]= 1 Then         'II
            Ara = arrVeri(y)                                               'II
            arrVeri(y) = arrVeri(z)                                        'II
            arrVeri(z) = Ara                                               'II
        End If                                                             'II
    Next                                                                   'II
Next                                                                       'II
'__________________________________________________________________________'//

Range("C1").Resize(UBound(arrVeri)).Value = [COLOR=Red]WorksheetFunction.Transpose(arrVeri)
[/COLOR] 
End Sub
 
Son düzenleme:
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
....................... Sorun çözüldü.18. mesajı bakabilirsiniz.
 
Son düzenleme:
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
Sn. Ferhat Pazarçevirdi ve Sn. Veysel Emrenin Bilgilerinden derlenmiştir.
kendilerine tekrar teşekkür ederim.

Başka Bir kitaptaki benzersiz kayıtları bir sayfaya getirmek ve osütunda sıralı olarak Göstermek için aşağıdaki fonksiyonu kullanabilirsiniz.
Benzersiz kayıtları satır olarak getimekte mümkün.

Kod:
=Benzersiz_Kayıtlar([COLOR=Red]Aralık[/COLOR];[COLOR=DarkGreen]SıraNo[/COLOR])
Kod:
=Benzersiz_Kayıtlar([COLOR=Red][Kitap2]Sayfa1!$G$4:$K$10[/COLOR];[COLOR=DarkGreen]B22[/COLOR])
Kod:
Option Explicit
Function Benzersiz_Kayıtlar(Aralik As Range, Sira As Integer, _
                    Optional ByVal Kayıtlar As Boolean = True)
'Sn. Ferhat Pazarçevirdi ve Sn. Veysel Emrenin Bilgilerinden derlenmiştir.
'Yazar: HSayar-Excel.web.tr
'Elemanları hücreye yazmak için
    'VBA   da    : Benzersiz_Kayit(Aralik, i) şeklinde kullanmalısınız. Sırano 1 den başlar.
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;SATIR()-1) şeklinde kullanabilirsiniz.
''Eleman sayısını öğrenmek için
    'VBA   da    : Benzersiz_Kayit(Aralik, 1, False) şeklinde kullanmalısınız. Sıra no olarak 1 kullanın
    'Excel de    : =Benzersiz_Kayit(Sayfa3!$C$3:$C$23;1;0) şeklinde kullanbilirsiniz.
Dim y&, z&
Dim arrVeri(), colVeri, Ara         As Variant
Dim col                             As New Collection


'Bir Hücre Aralığını Diziye Al====================================================================='\\
arrVeri = Aralik.Value                                                                              'II
'__________________________________________________________________________________________________'//


'ArrVerideki Benzersiz Kayıtları Koleksiyona Al===================================================='\\
On Error Resume Next                                            'Değer koleksiyona alınmışsa diğerine geç
For Each colVeri In arrVeri                                     'Dizideki Benzersizleri
    If colVeri <> "" Then col.Add colVeri, (Format(colVeri, "@"))
Next                                                            'Di&#287;er elamana ge&#231;
On Error GoTo 0                                                 'Hata olursa s&#246;yle
'__________________________________________________________________________________________________'//

'ArrVeriyi yeniden olu&#351;tur.========================================================================'\\
ReDim arrVeri(1 To col.Count)                                                                      'II
For y = 1 To col.Count:         arrVeri(y) = UCaseTr(col(y)):    Next y                            'II
Set col = Nothing:              y = 0                                                              'II
'__________________________________________________________________________________________________'//

[COLOR=Red] 'S&#305;rala (0 dan Z'ye================================================================================'\\[/COLOR]
For y = 1 To UBound(arrVeri) - 1                                                                   'II
    For z = y + 1 To UBound(arrVeri)                                                               'II
        If StrComp(arrVeri(y), arrVeri(z), vbTextCompare) = 1 Then                                 'II
            Ara = arrVeri(y)                                                                       'II
            arrVeri(y) = arrVeri(z)                                                                'II
            arrVeri(z) = Ara                                                                       'II
        End If                                                                                     'II
    Next                                                                                           'II
Next                                                                                               'II
Set Ara = Nothing:              y = 0:                           z = 0                             'II
'__________________________________________________________________________________________________'//

'Sonucu H&#252;creye veya de&#287;i&#351;kene ver '==============================================================='\\
If Kay&#305;tlar = True Then                                                                            'II
    If Sira > UBound(arrVeri) Then                                                                 'II
        Benzersiz_Kay&#305;tlar = ""                                                                    'II
    Else                                                                                           'II
        Benzersiz_Kay&#305;tlar = arrVeri(Sira)                                                         'II
    End If                                                                                         'II
Else                                                                                               'II
    Benzersiz_Kay&#305;tlar = UBound(arrVeri)                                                           'II
End If                                                                                             'II
'__________________________________________________________________________________________________'//
End Function
Sn veysel hocam S&#305;ralama K&#305;sm&#305;n&#305; 0,1,2...A,B,C,&#199;..........V,Y,Z &#351;eklinde hallettik.
peki tam tersiini isteseydik (z,y,...........c,b,a,9,8,7,......0 ) gibi ne yapmal&#305;yd&#305;k.
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Strcomp de&#287;erini 2'ye e&#351;itleyerek, ko&#351;ulu revize ediniz.
 
Katılım
2 Mart 2005
Mesajlar
2,960
Excel Vers. ve Dili
ev: Ofis 2007- Win Xp
iş: Ofis 2010- Win Vista
te&#351;ekk&#252;r ederim hocam
 
Üst