+ - değer gözetmeden sayı sıralama

Katılım
24 Eylül 2010
Mesajlar
164
Excel Vers. ve Dili
2010 tr
arkadaşlar elimde büyük bir tablo var D sütununda Sütun4 deki gibi - ve + değerlere sahip çok sayıda sayı var bunları normal şartlarda sıralayınca Sütun4 gibi oluyor bunu

Sütun7 gibi sayıların değer gözetmeden yalnızca küçükten büyüğe sıralamak mümkün olur mu

bütün işlem Sütun4 üzerinde olacak Sütun7 örnek olarak verilmiştir





Sütun1

Sütun2

Sütun3

Sütun4

Sütun5

Sütun6

Sütun7

   

-1200

  

-10

   

-150

  

20

   

-50

  

30

   

-10

  

-50

   

20

  

70

   

30

  

90

   

70

  

-150

   

90

  

450

   

450

  

-1200

 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,646
Excel Vers. ve Dili
Pro Plus 2021
Kod:
Sub test()
    Dim i, son
    son = Cells(Rows.Count, 4).End(3).Row
    For i = 2 To son
        If Cells(i, 4).Value < 0 Then
            Cells(i, 4).Font.Bold = True
            Cells(i, 4).Value = Abs(Cells(i, 4).Value)
        End If
    Next i
    Range("A1:F" & son).Sort Range("D1"), xlAscending, , , , , , xlYes
    For i = 2 To son
        If Cells(i, 4).Font.Bold = True Then
            Cells(i, 4).Value = -1 * (Cells(i, 4).Value)
            Cells(i, 4).Font.Bold = False
        End If
    Next i
End Sub
 
Son düzenleme:

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Excel'in yerleşik sıarlama fonksiyonuyla yapmak için; hemen yanındaki sütunda verilerin mutlak değerleri (İng. versiyonda ABS, Türkçe versiyonda MUTLAK) hesaplanır, bu 2 sütun seçildikten sonra mutlak değerlerin hesaplandığı sütuna göre sıralama yaptırılır.

.
 
Katılım
24 Eylül 2010
Mesajlar
164
Excel Vers. ve Dili
2010 tr
Kod:
Sub test()
    Dim i, son
    son = Cells(Rows.Count, 4).End(3).Row
    For i = 2 To son
        If Cells(i, 4).Value < 0 Then
            Cells(i, 4).Font.Bold = True
            Cells(i, 4).Value = Abs(Cells(i, 4).Value)
        End If
    Next i
    Range("A1:F" & son).Sort Range("D1"), xlAscending, , , , , , xlYes
    For i = 2 To son
        If Cells(i, 4).Font.Bold = True Then
            Cells(i, 4).Value = -1 * (Cells(i, 4).Value)
            Cells(i, 4).Font.Bold = False
        End If
    Next i
End Sub
hocam çok güzel çalışıyor fakat 1500 satır olduğundan dolayı çok yavaş bunu hızlandırmanın yolu yok mu
 
Katılım
24 Eylül 2010
Mesajlar
164
Excel Vers. ve Dili
2010 tr
Excel'in yerleşik sıarlama fonksiyonuyla yapmak için; hemen yanındaki sütunda verilerin mutlak değerleri (İng. versiyonda ABS, Türkçe versiyonda MUTLAK) hesaplanır, bu 2 sütun seçildikten sonra mutlak değerlerin hesaplandığı sütuna göre sıralama yaptırılır.

.

hocam anlatım ve çözdüm öncelikle teşekkürler yalnız aynı sütunda işaretler kaybolmadan nasıl bir çözüm üretilebilir
 

veyselemre

Özel Üye
Katılım
9 Mart 2005
Mesajlar
3,646
Excel Vers. ve Dili
Pro Plus 2021
Kod:
Sub test()

    Dim strCon$, strSql$, rs As Object
 
    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & ThisWorkbook.FullName & _
             "';Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"

    Set rs = CreateObject("Adodb.RecordSet")

    strSql = " SELECT * FROM [Sheet1$A:F] WHERE [Sütun1] IS NOT NULL ORDER BY ABS([Sütun4])"
    rs.Open strSql, strCon

    Range("A2").CopyFromRecordset rs

End Sub
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
hocam anlatım ve çözdüm öncelikle teşekkürler yalnız aynı sütunda işaretler kaybolmadan nasıl bir çözüm üretilebilir
Ömer üstadın çözümünde iş bitince ilave sütunu silebilir ya da gizleyebilirsiniz. En pratik ve hızlı yöntem budur.
 
Katılım
24 Eylül 2010
Mesajlar
164
Excel Vers. ve Dili
2010 tr
Kod:
Sub test()

    Dim strCon$, strSql$, rs As Object

    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & ThisWorkbook.FullName & _
             "';Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"

    Set rs = CreateObject("Adodb.RecordSet")

    strSql = " SELECT * FROM [Sheet1$A:F] WHERE [Sütun1] IS NOT NULL ORDER BY ABS([Sütun4])"
    rs.Open strSql, strCon

    Range("A2").CopyFromRecordset rs

End Sub


hocam maalesef her şeyi denedim ama beklentilerimizi karşılamıyor diğeri çok iyi ama çok yavaş
 
Katılım
24 Eylül 2010
Mesajlar
164
Excel Vers. ve Dili
2010 tr
Ömer üstadın çözümünde iş bitince ilave sütunu silebilir ya da gizleyebilirsiniz. En pratik ve hızlı yöntem budur.
hocam bende benzer bir yöntem kullanıyorum daha pratik ve kolay bir yöntem arayışındayım veysel emre beyin 1. verdiği makro güzel çalışıyor ama çok yavaş
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Aşağıdaki gibi bir kod dener misiniz?

(Koddaki sayfa ismini -Sayfa1- ve sütun ismini -d- kendi dosyanıza göre uyarlayın)

PHP:
Sub sirala()
Set s1 = Sheets("Sayfa1")

Set con = VBA.CreateObject("adodb.Connection")
con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
ThisWorkbook.FullName & ";extended properties=""Excel 12.0;hdr=yes"""

sorgu = "select * from [Sayfa1$] where d is not null order by abs(d) asc"
Set rs = con.Execute(sorgu)

s1.[A2].CopyFromRecordset rs

End Sub
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Kendi dosyanıza göre düzeltmeniz gerekenler aşağıdaki koyu olan yerlerdir:

Set s1 = Sheets("Sayfa1")

sorgu = "select * from [Sayfa1$] where d is not null order by abs(d) asc"
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
hocam maalesef her şeyi denedim ama beklentilerimizi karşılamıyor diğeri çok iyi ama çok yavaş
Ben de 11. mesajda aynı yöntemi önerdim. Beklentinizi karşılamayan kısmı nedir?
 

Necdet

Moderatör
Yönetici
Katılım
4 Haziran 2005
Mesajlar
15,372
Excel Vers. ve Dili
Ofis 365 Türkçe
Alternatif olsun, şansımı deneyim :)

Kod:
Sub SortArray()
'https://www.mrexcel.com/board/threads/vba-to-sort-an-array-of-numbers.690718/

Dim MyArray As Variant, i As Long
i = Cells(Rows.Count, "E").End(3).Row
MyArray = Range("E1:E" & i).Value
MyArray = BubbleSrt(MyArray, 1) '0 Büyükten Küçüğe, 1 Küçükten Büyüğe Sıralar
Range("F1").Resize(UBound(MyArray, 1), 1) = MyArray

End Sub

Public Function BubbleSrt(ArrayIn, Ascending As Boolean)
Dim SrtTemp As Variant
Dim i As Long
Dim j As Long
If Ascending = True Then
  For i = LBound(ArrayIn) To UBound(ArrayIn)
    For j = i + 1 To UBound(ArrayIn)
      If Abs(ArrayIn(i, 1)) > Abs(ArrayIn(j, 1)) Then
        SrtTemp = ArrayIn(j, 1)
        ArrayIn(j, 1) = ArrayIn(i, 1)
        ArrayIn(i, 1) = SrtTemp
      End If
    Next j
  Next i
Else
  For i = LBound(ArrayIn) To UBound(ArrayIn)
    For j = i + 1 To UBound(ArrayIn)
      If Abs(ArrayIn(i, 1)) < Abs(ArrayIn(j, 1)) Then
        SrtTemp = ArrayIn(j, 1)
        ArrayIn(j, 1) = ArrayIn(i, 1)
        ArrayIn(i, 1) = SrtTemp
      End If
    Next j
   Next i
End If
BubbleSrt = ArrayIn
End Function
 
Katılım
24 Eylül 2010
Mesajlar
164
Excel Vers. ve Dili
2010 tr
Aşağıdaki gibi bir kod dener misiniz?

(Koddaki sayfa ismini -Sayfa1- ve sütun ismini -d- kendi dosyanıza göre uyarlayın)

PHP:
Sub sirala()
Set s1 = Sheets("Sayfa1")

Set con = VBA.CreateObject("adodb.Connection")
con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
ThisWorkbook.FullName & ";extended properties=""Excel 12.0;hdr=yes"""

sorgu = "select * from [Sayfa1$] where d is not null order by abs(d) asc"
Set rs = con.Execute(sorgu)

s1.[A2].CopyFromRecordset rs

End Sub
hocam teşekkürler gayet güzel çalışıyor
 
Katılım
24 Eylül 2010
Mesajlar
164
Excel Vers. ve Dili
2010 tr
Alternatif olsun, şansımı deneyim :)

Kod:
Sub SortArray()
'https://www.mrexcel.com/board/threads/vba-to-sort-an-array-of-numbers.690718/

Dim MyArray As Variant, i As Long
i = Cells(Rows.Count, "E").End(3).Row
MyArray = Range("E1:E" & i).Value
MyArray = BubbleSrt(MyArray, 1) '0 Büyükten Küçüğe, 1 Küçükten Büyüğe Sıralar
Range("F1").Resize(UBound(MyArray, 1), 1) = MyArray

End Sub

Public Function BubbleSrt(ArrayIn, Ascending As Boolean)
Dim SrtTemp As Variant
Dim i As Long
Dim j As Long
If Ascending = True Then
  For i = LBound(ArrayIn) To UBound(ArrayIn)
    For j = i + 1 To UBound(ArrayIn)
      If Abs(ArrayIn(i, 1)) > Abs(ArrayIn(j, 1)) Then
        SrtTemp = ArrayIn(j, 1)
        ArrayIn(j, 1) = ArrayIn(i, 1)
        ArrayIn(i, 1) = SrtTemp
      End If
    Next j
  Next i
Else
  For i = LBound(ArrayIn) To UBound(ArrayIn)
    For j = i + 1 To UBound(ArrayIn)
      If Abs(ArrayIn(i, 1)) < Abs(ArrayIn(j, 1)) Then
        SrtTemp = ArrayIn(j, 1)
        ArrayIn(j, 1) = ArrayIn(i, 1)
        ArrayIn(i, 1) = SrtTemp
      End If
    Next j
   Next i
End If
BubbleSrt = ArrayIn
End Function

hocam gayet güzel çalışıyor teşekkürler
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Ömer Üstad'ın çözümü hangisi ? Göremedim de....

.
Pardon üstadım. Bugünlerde dengesizliğim üzerimde. Kusura bakmayın.
 
Üst