Option Explicit
[b]
Sub SortMatrit() [/b]
Dim Mang, temp, iJ As Integer, iZ As Integer
Mang = Range("A2:A15")
Range("B2:B20").ClearContents
For iZ = 1 To 19
For iJ = 1 To 15 - 2
temp = Mang(iJ, 1)
If temp > Mang(iJ + 1, 1) Then
Mang(iJ, 1) = Mang(iJ + 1, 1)
Mang(iJ + 1, 1) = temp
End If
Next iJ, iZ
For iJ = 1 To 15 - 1
Cells(iJ + 1, 2) = Mang(iJ, 1)
Next iJ [b]
End Sub [/b]
Tôi không hiểu.Mr Okebab đã viết:Vậy có cách nào Sort nó như là lọc 1 range không nhỉ ???
chibi đã viết:Tôi không hiểu.
Option Explicit
Sub SortMatrix()
Dim Mang, temp, iJ, Lrow As Integer
Lrow = Range("A1").End(xlDown).Row
Mang = Range("A1:A" & Lrow)
Range("B1:B" & Lrow).ClearContents
For iJ = 1 To Lrow - 2
temp = Mang(iJ, 1)
If temp > Mang(iJ + 1, 1) Then
Mang(iJ, 1) = Mang(iJ + 1, 1)
Mang(iJ + 1, 1) = temp
End If
Next iJ
For iJ = 1 To Lrow
Cells(iJ, 2) = Mang(iJ, 1)
Next iJ
End Sub
/)/ếu dãy số hay chữ cái í đang được ai đó cố tình đã xếp giảm dần & nhiệm vụ bây chừ phải làm ngược lại thì phải tăng iZ đến một số thích ứng ấy chứ!Biến số iZ không cần trong code này.
Option Explicit: Option Base 1[b]
Sub SortMatrix() [/b]
Dim iDem, Temp, iJ As Integer, iZ As Integer
ReDim Mang(100)
Range("D2:E120").ClearContents
For iJ = 1 To 100
Randomize: iZ = 48 + Int(100 * Rnd())
Mang(iJ) = Chr(iZ): Cells(iJ + 1, 4) = Chr(iZ)
Next iJ
iDem = InputBox("HAY NHAP SO DEM:", , "50")
Cells(2, 3) = iDem
For iZ = 1 To iDem
For iJ = 1 To 99
Temp = Mang(iJ)
If Mang(iJ + 1) < Temp Then
Mang(iJ) = Mang(iJ + 1)
Mang(iJ + 1) = Temp
End If
Next iJ, iZ
For iJ = 1 To 100
Cells(iJ + 1, 5) = Mang(iJ)
Next iJ
[b]
End Sub [/b]
Sub SortAscend()
Dim Mang, temp, iJ, iZ, Lrow As Integer
Lrow = Range("A1").End(xlD wn).Row
Mang = Range("A1:A" & Lrow)
Range("B1:B" & Lrow).ClearContents
For iZ= 0 To Lrow
For iJ = 1 To Lrow - 1
temp = Mang(iJ, 1)
If temp > Mang(iJ + 1, 1) Then
Mang(iJ, 1) = Mang(iJ + 1, 1)
Mang(iJ + 1, 1) = temp
End If
Next iJ
Next iZ
For iJ = 1 To Lrow
Cells(iJ, 2) = Mang(iJ, 1)
Next iJ
End Sub
Sub SortDescend()
Dim Mang, temp, temp2, iJ, Lrow As Integer, i As Integer
Lrow = Range("A1").End(xlDown).Row
Mang = Range("A1:A" & Lrow)
Range("B1:B" & Lrow).ClearContents
For i = 1 To UBound(Mang, 1) - 1
For iJ = i + 1 To UBound(Mang, 1)
If Mang(i, 1) < Mang(iJ, 1) Then
temp = Mang(iJ, 1)
temp2 = Mang(iJ, 1)
Mang(iJ, 1) = Mang(i, 1)
Mang(iJ, 1) = Mang(i, 1)
Mang(i, 1) = temp
Mang(i, 1) = temp2
End If
Next iJ
Next i
For iJ = 1 To Lrow
Cells(iJ, 2) = Mang(iJ, 1)
Next iJ
End Sub
Option Explicit
Dim rngMyRange As Range, ListSort As Range
Dim MyArray()
Dim i As Long, j As Long, x As Long, y As Long
Public Sub SortUniqueArray()
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
Set rngMyRange = Range("A1", Range("A10000").End(xlUp))
j = 0
For i = 1 To rngMyRange.Rows.Count
x = WorksheetFunction.CountIf(Range(rngMyRange.Cells(1, 1), rngMyRange.Cells(i, 1)), rngMyRange.Cells(i, 1))
If x = 1 Then 'neu tim thay 1 lan
j = j + 1
ReDim Preserve MyArray(1 To j)
MyArray(j) = rngMyRange.Cells(i, 1)
End If
Next i
y = UBound(MyArray())
Set ListSort = Range("B1:B" & y)
With ListSort
.ClearContents
.Value = Application.WorksheetFunction.Transpose(MyArray)
.Sort Key1:=.Cells(1, 1), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
End With
Set ListSort = Nothing
Set rngMyRange = Nothing
With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With
End Sub
ThuNghi đã viết:Cái này tôi học từ NVSON và Digita, lấy ds duy nhất -> array - sort và gán lại vào sh, tôi chả biết làm UDF. Không dùng công cụ unique của AF.
[/php] Đính kèm file. Các bạn xem thử liệu có nhanh hơn AF không.
Thì còn gang tất nữa đến thiên đàn thôi mà Bắp;Mr Okebab đã viết:Các bác cho hỏi là cái Sub này có thể biến thành 1 hàm được không ạ ??
VD em hàm của nó là SX(Mang)
Sau đó chỉ cần gọi SX(MangTemp) là mảng temp sẽ được sắp xếp lại.
Hy vọng được gặp 2 bác!!
Thân!
SotMatrix = Temp
Option Explicit: Option Base 1[b]
[COLOR="Blue"]'Hàm này xếp theo cột; mới chỉ là phần tăng dần!
' Thử cung cấp hàm 1 cột dữ liệu có kí tự & kí sô khoảng < 20 đơn vị! [/COLOR]
Function SortMatrix(Rng As Range, Optional Dess As Boolean)[/b]
Dim Mang, temp, iJ As Integer, iZ As Integer
Mang = Rng
SortMatrix = Rng.Rows.Count
ReDim MDLieu(SortMatrix, 1)
For iZ = 1 To 20
For iJ = 1 To SortMatrix - 1
temp = Mang(iJ, 1)
If temp > Mang(iJ + 1, 1) Then
Mang(iJ, 1) = Mang(iJ + 1, 1)
Mang(iJ + 1, 1) = temp
End If
Next iJ, iZ
iZ = SortMatrix
For iJ = 1 To iZ
MDLieu(iJ, 1) = Mang(iJ, 1)
Next iJ
SortMatrix = MDLieu[b]
End Function[/b]
SA_DQ đã viết:Mã:Option Explicit: Option Base 1[B] [COLOR=Blue]'Hàm này xếp theo cột; mới chỉ là phần tăng dần! ' Thử cung cấp hàm 1 cột dữ liệu có kí tự & kí sô khoảng < 20 đơn vị! [/COLOR] Function SortMatrix(Rng As Range, Optional Dess As Boolean)[/B] Dim Mang, temp, iJ As Integer, iZ As Integer Mang = Rng SortMatrix = Rng.Rows.Count ReDim MDLieu(SortMatrix, 1) For iZ = 1 To 20 For iJ = 1 To SortMatrix - 1 temp = Mang(iJ, 1) If temp > Mang(iJ + 1, 1) Then Mang(iJ, 1) = Mang(iJ + 1, 1) Mang(iJ + 1, 1) = temp End If Next iJ, iZ iZ = SortMatrix For iJ = 1 To iZ MDLieu(iJ, 1) = Mang(iJ, 1) Next iJ SortMatrix = MDLieu[B] End Function[/B]
Function DanhSachMSX(MangDL As Range)
Application.ScreenUpdating = False
Dim i As Long, i2, i1 As Long, m As Integer, Tim As Boolean, Ma As Range
Dim MangTemp(1 To 1000, 0) As Variant
Dim Mang(1 To 1000, 0)
If MangDL.Rows.Count = 0 Then Exit Function
For Each Ma In MangDL
i = i + 1
If i = 1 Then
m = m + 1
MangTemp(m, 0) = Ma.Value
Else
For i1 = 1 To m
If UCase(MangTemp(i1, 0)) = UCase(Ma) Then
Tim = True
Exit For
End If
Next i1
If Tim = False Then
m = m + 1
MangTemp(m, 0) = Ma.Value
End If
End If
Tim = False
Next
'Loc Danh Sach
For i = 1 To m
If i = 1 Then ' Gan PT dau tien
Mang(1, 0) = MangTemp(1, 0)
Else
For i1 = 1 To i - 1 ' Xem co nho hon GT nao trong Mang khong ??
If LCase(MangTemp(i, 0)) < LCase(Mang(i1, 0)) Then Tim = True: Exit For
Next i1
If Tim = False Then ' Khong co : Cho xuong duoi Danh Sach
Mang(i, 0) = MangTemp(i, 0)
Else ' Neu co :
For i2 = i To i1 + 1 Step -1
Mang(i2, 0) = Mang(i2 - 1, 0) 'Dich chuyen danh sach xuong 1 nac
Next i2
Mang(i1, 0) = MangTemp(i, 0) ' Cho phan tu vao DS
End If
End If
Tim = False
Next
DanhSachMSX = Mang()
Set Ma = Nothing
Application.ScreenUpdating = True
End Function
Hàm cùa mình xếp toàn bộ danh sách lại mà;Các bác cho hỏi là cái Sub này có thể biến thành 1 hàm được không ạ ?? VD em hàm của nó là SX(Mang) Sau đó chỉ cần gọi SX(MangTemp) là mảng temp sẽ được sắp xếp lại.
Thực ra cũng là cái mảng DS Duy nhất ở trên, em muốn sắp xếp lại nó trước khi gắn vào hàm. Chèn đoạn code vào cũng được, tuy nhiên nếu sử dụng nhiều lần ở những module khác nhau thì viết lại ngại quá, Cảm ơn các bác nhiều. !
[COLOR=green]' Use Quicksort to sort a list.[/COLOR]
[COLOR=green]'[/COLOR]
' This code is from the book "Ready-to-Run
[COLOR=green]' Visual Basic Algorithms" by Rod Stephens.[/COLOR]
[COLOR=green]' [URL="http://www.vb-helper.com/vba.htm"]http://www.vb-helper.com/vba.htm[/URL][/COLOR]
[COLOR=darkblue]Sub[/COLOR] Quicksort(list(), [COLOR=darkblue]ByVal[/COLOR] min [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Long[/COLOR], [COLOR=darkblue]ByVal[/COLOR] max [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Long[/COLOR])
[COLOR=darkblue]Dim[/COLOR] mid_value
[COLOR=darkblue]Dim[/COLOR] hi [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Long[/COLOR]
[COLOR=darkblue]Dim[/COLOR] lo [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Long[/COLOR]
[COLOR=darkblue]Dim[/COLOR] i [COLOR=darkblue]As[/COLOR] [COLOR=darkblue]Long[/COLOR]
[COLOR=green]' If there is 0 or 1 item in the list,[/COLOR]
[COLOR=green]' this sublist is sorted.[/COLOR]
[COLOR=darkblue]If[/COLOR] min >= max [COLOR=darkblue]Then[/COLOR] [COLOR=darkblue]Exit[/COLOR] [COLOR=darkblue]Sub[/COLOR]
[COLOR=green]' Pick a dividing value.[/COLOR]
i = Int((max - min + 1) * Rnd + min)
mid_value = list(i)
[COLOR=green]' Swap the dividing value to the front.[/COLOR]
list(i) = list(min)
lo = min
hi = max
[COLOR=darkblue]Do[/COLOR]
[COLOR=green]' Look down from hi for a value < mid_value.[/COLOR]
[COLOR=darkblue]Do[/COLOR] [COLOR=darkblue]While[/COLOR] list(hi) >= mid_value
hi = hi - 1
[COLOR=darkblue]If[/COLOR] hi <= lo [COLOR=darkblue]Then[/COLOR] [COLOR=darkblue]Exit[/COLOR] [COLOR=darkblue]Do[/COLOR]
[COLOR=darkblue]Loop[/COLOR]
[COLOR=darkblue]If[/COLOR] hi <= lo [COLOR=darkblue]Then[/COLOR]
list(lo) = mid_value
[COLOR=darkblue]Exit[/COLOR] [COLOR=darkblue]Do[/COLOR]
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]If[/COLOR]
[COLOR=green]' Swap the lo and hi values.[/COLOR]
list(lo) = list(hi)
[COLOR=green]' Look up from lo for a value >= mid_value.[/COLOR]
lo = lo + 1
[COLOR=darkblue]Do[/COLOR] [COLOR=darkblue]While[/COLOR] list(lo) < mid_value
lo = lo + 1
[COLOR=darkblue]If[/COLOR] lo >= hi [COLOR=darkblue]Then[/COLOR] [COLOR=darkblue]Exit[/COLOR] [COLOR=darkblue]Do[/COLOR]
[COLOR=darkblue]Loop[/COLOR]
[COLOR=darkblue]If[/COLOR] lo >= hi [COLOR=darkblue]Then[/COLOR]
lo = hi
list(hi) = mid_value
[COLOR=darkblue]Exit[/COLOR] [COLOR=darkblue]Do[/COLOR]
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]If[/COLOR]
[COLOR=green]' Swap the lo and hi values.[/COLOR]
list(hi) = list(lo)
[COLOR=darkblue]Loop[/COLOR]
[COLOR=green]' Sort the two sublists.[/COLOR]
Quicksort list, min, lo - 1
Quicksort list, lo + 1, max
[COLOR=darkblue]End[/COLOR] [COLOR=darkblue]Sub[/COLOR]
Quicksort MangTemp(), [COLOR=darkblue]LBound[/COLOR](MangTemp), [COLOR=darkblue]UBound[/COLOR](MangTemp)
Option Explicit: Option Base 1 [b]
Function SortMatrix(Rng As Range, Optional Dess As Boolean)[/b]
Dim Mang, temp, iJ As Integer, iZ As Integer
Mang = Rng
SortMatrix = Rng.Rows.Count
ReDim MDLieu(SortMatrix, 1)
1 '[COLOR="Blue"]. Sap Xep Danh Sach[/COLOR]
For iZ = 1 To SortMatrix
For iJ = 1 To SortMatrix - 1
temp = Mang(iJ, 1)
If temp > Mang(iJ + 1, 1) Then
Mang(iJ, 1) = Mang(iJ + 1, 1)
Mang(iJ + 1, 1) = temp
End If
Next iJ, iZ
2 '[COLOR="blue"]. Lap Danh Sach Duy Nhat[/COLOR]
iZ = 0: temp = ""
For iJ = 1 To SortMatrix
If temp <> Mang(iJ, 1) Then
iZ = 1 + iZ: temp = Mang(iJ, 1)
MDLieu(iZ, 1) = temp
End If
Next iJ
For iJ = iZ + 1 To SortMatrix
MDLieu(iJ, 1) = ""
Next iJ
SortMatrix = MDLieu [b]
End Function[/b]
SA_DQ đã viết:
Hàm cùa mình xếp toàn bộ danh sách lại mà;
Như ví dụ của Bắp đưa lên, mình đã thử rồi & kết quả như sau:
Lấy cột E còn trống, chọn & kích hoạt các ô từ E2 đến E156; & ínert hàm của mình & kết thúc = tổ hợp 3 fìm là nó sẽ xếp cho Bắp mà!
Mình chưa viết được hàm từ 1 Ds có trùng, xếp lại theo trật tự 1 danh sách duy nhất! (mình nghĩ cũng sẽ viết được luôn!);
Mình sẽ đưa file lên bổ sung sau!
'Loc Danh Sach
For i = 1 To m
If i = 1 Then ' Gan PT dau tien
Mang(1, 0) = MangTemp(1, 0)
Else
For i1 = 1 To i - 1 ' Xem co nho hon GT nao trong Mang khong ??
If LCase(MangTemp(i, 0)) < LCase(Mang(i1, 0)) Then Tim = True: Exit For
Next i1
If Tim = False Then ' Khong co : Cho xuong duoi Danh Sach
Mang(i, 0) = MangTemp(i, 0)
Else ' Neu co :
For i2 = i To i1 + 1 Step -1
Mang(i2, 0) = Mang(i2 - 1, 0) 'Dich chuyen danh sach xuong 1 nac
Next i2
Mang(i1, 0) = MangTemp(i, 0) Cho phan tu vao DS
End If
End If
Tim = False
Next
DanhSachMSX = Mang()