Sort Mảng 2 Chiều | Giải Pháp Excel

Giải Pháp Excel
  • Trang chủ Có gì mới Hoạt động gần nhất Tác giả
  • Diễn đàn Tìm bài viết mới Tìm theo chuyên mục
  • Video New Video về Excel Video về tin học khác Tin tức về tin học chung
  • Thông tin mới Featured content Tìm bài mới Tài Nguyên Mới Hoạt động gần nhất
  • Tài nguyên Đánh giá mới nhất Tìm tài nguyên
  • Facebook
  • Đóng góp
Đăng nhập Đăng Ký Có gì mới? Tìm kiếm

Tìm kiếm

Mọi nơi Đề tài Diễn đàn này Đề tài này Chỉ tìm trong tiêu đề Note Bởi: Tìm kiếm Tìm nâng cao…
  • Tìm bài viết mới
  • Tìm theo chuyên mục
Menu Đăng nhập Đăng Ký Install the app Install How to install the app on iOS

Follow along with the video below to see how to install our site as a web app on your home screen.

Note: This feature may not be available in some browsers.

  • Khách ơi! GPE thông tin đến bạn ấn phẩm "lập trình VBA trong Excel": - Phần cơ bản - Phần Nâng Cao - VBA trong Excel - Cải thiện và tăng tốc
  • Trang chủ
  • Diễn đàn
  • Lập Trình với Excel
You are using an out of date browser. It may not display this or other websites correctly.You should upgrade or use an alternative browser. Sort mảng 2 chiều (1 người xem)
  • Thread starter Thread starter anhtuan1066
  • Ngày gửi Ngày gửi 19/4/11
Liên hệ QC

Người dùng đang xem chủ đề này

Đang trực tuyến: 2 (Thành viên: 0, Khách: 2) anhtuan1066

anhtuan1066

Thành viên gạo cội
Tham gia 10/3/07 Bài viết 5,802 Được thích 6,913 Đầu tiên xin mời các bạn xem qua topic này: http://www.giaiphapexcel.com/forum/showthread.php?38005-Sắp-xếp-mảng-dữ-liệu-không-sử-dụng-vòng-lặp& Ở đây người ta dùng JScript để sort mảng 1 chiều Mượn tạm sự trợ giúp này, tôi xây dụng code sort mảng 2 chiều như sau: PHP: Sao chép. Function Sort1DArray(Arr, Optional isText As Boolean = False, Optional isDESC As Boolean = False) Dim sCommand As String sCommand = "('" & Join(Arr, vbBack) & "').split('" & vbBack & "').sort(" If isText Then sCommand = sCommand & ")" Else sCommand = sCommand & "function(a,b){return (a-b)})" End If If isDESC Then sCommand = sCommand & ".reverse()" sCommand = sCommand & ".join('" & vbBack & "')" With CreateObject("MSScriptControl.ScriptControl") .Language = "JavaScript" Sort1DArray = Split(.Eval(sCommand), vbBack) End With End Function PHP: Sao chép. Function Sort2DArray(sArray, ColIndex As Long, Order As Boolean, HasTitle As Boolean) Dim TmpArr, Title, i As Long, j As Long, Dic, SortArr, SortArr2 Dim Arr, iR As Long, Tmp, Chk As Boolean Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next TmpArr = sArray 'Chk = IsNumeric(TmpArr(LBound(TmpArr, 1) - HasTitle, ColIndex)) For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) Tmp = TmpArr(i, ColIndex) If Dic.Exists(Tmp) Then Tmp = Tmp & vbTab & i TmpArr(i, ColIndex) = Tmp End If Dic.Add Tmp, i Next Arr = TmpArr SortArr = Sort1DArray(Dic.Keys, Not Chk, Order) For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) iR = Dic.Item(SortArr(i + HasTitle - 1)) For j = LBound(sArray, 2) To UBound(sArray, 2) Arr(i, j) = Replace(TmpArr(iR, j), vbTab & iR, "") Next Next Sort2DArray = Arr End Function Code thử nghiệm PHP: Sao chép. Sub TestHasTitle() Dim sArray, Arr sArray = Range("A1:C10000").Value Arr = Sort2DArray(sArray, 2, False, True) Range("E1:G10000").Value = Arr End Sub PHP: Sao chép. Sub TestNoTitle() Dim sArray, Arr sArray = Range("A2:C10000").Value Arr = Sort2DArray(sArray, 2, False, False) Range("I2:K10000").Value = Arr End Sub Sort dữ liệu 10000 dòng, 3 cột, kết quả gần như nháy mắt ---------------------------------------- Tạm thời vẫn chưa biết cách nào để sort được các cột chứa Number (chỉ sort dạng Text mà thôi) Các bạn down file về thử nghiệm và cải tiến giúp những chổ còn thiếu sót nhé. Cảm ơn

File đính kèm

  • Sort_2D_Array_01.rar Sort_2D_Array_01.rar 123.9 KB · Đọc: 524
Sắp xếp theo thời gian sắp xếp theo bầu chọn anhtuan1066

anhtuan1066

Thành viên gạo cội
Tham gia 10/3/07 Bài viết 5,802 Được thích 6,913 Code này cần phải cải tiến lại, có lẽ xác định chỉ số dòng iR như code trên là chưa chính xác! Ngoài ra, cải tiến thêm cho phép sort number PHP: Sao chép. Function Sort2DArray(sArray, ColIndex As Long, Order As Boolean, HasTitle As Boolean) Dim TmpArr, i As Long, j As Long, Dic, SortArr Dim Arr, iR As Long, Tmp, Chk As Boolean Set Dic = CreateObject("Scripting.Dictionary") 'On Error Resume Next TmpArr = sArray ColIndex = ColIndex + LBound(TmpArr, 2) - 1 Chk = IsNumeric(TmpArr(LBound(TmpArr, 1) - HasTitle, ColIndex)) For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) Tmp = TmpArr(i, ColIndex) If Dic.Exists(Tmp) Then If Chk Then Tmp = Tmp + i / (10 ^ 10) Else Tmp = Tmp & vbTab & i End If TmpArr(i, ColIndex) = Tmp End If Dic.Add Tmp, i Next Arr = TmpArr SortArr = Sort1DArray(Dic.Keys, Not Chk, Order) For i = LBound(SortArr, 1) To UBound(SortArr, 1) If Chk Then iR = Dic.Item(CDbl(SortArr(i))) Else iR = Dic.Item(CStr(SortArr(i))) End If For j = LBound(TmpArr, 2) To UBound(TmpArr, 2) If Chk Then If j = ColIndex Then Arr(i + LBound(TmpArr, 1) - HasTitle, j) = TmpArr(iR, j) - iR / (10 ^ 10) Else Arr(i + LBound(TmpArr, 1) - HasTitle, j) = TmpArr(iR, j) End If Else Arr(i + LBound(TmpArr, 1) - HasTitle, j) = Replace(TmpArr(iR, j), vbTab & iR, "") End If Next Next Sort2DArray = Arr End Function Yêu cầu: Cột cần sort hoặc thuộc dạng Number, hoặc thuộc dạng Text (không lộn xộn 2 kiểu dữ liệu) Rắc rối của code này là mảng Base 0 lộn xộn với mảng Base 1, phải làm sao để có thể áp dụng được trên Range hoặc trên mảng bất kỳ (chẳng hạn là List của ListBox) Các bạn vui lòng kiểm tra độ chính xác giúp tôi (vẫn cảm giác có gì đó chưa ổn). Cảm ơn!

File đính kèm

  • Sort_2D_Array_02.rar Sort_2D_Array_02.rar 140.4 KB · Đọc: 267
Lần chỉnh sửa cuối: 20/4/11 Upvote 0 anhtuan1066

anhtuan1066

Thành viên gạo cội
Tham gia 10/3/07 Bài viết 5,802 Được thích 6,913 Tạo ứng dụng Trước đây tôi có làm 1 form hổ trợ tìm kiếm và nhập liệu. Việc tìm kiếm thì dùng AutoFilter, còn sort dữ liệu trên ListBox thì đương nhiên dùng chức năng Sort sẳn có của Excel để làm: Sort trên bảng tính, xong gán dữ liệu từ bảng tính vào ListBox Cảm thấy cách làm đó tuy đơn giản nhưng không mấy chuyên nghiệp, vả lại tốc độ xử lý cũng không cao! Như ta đã biết, việc Filter đối với mảng 1 chiều thì đã có hàm Filter giải quyết. Vậy hôm nay tôi viết thêm hàm Filter2DArray nữa là có thể đưa vào ứng dụng với form hổ trợ tìm kiếm và nhập liệu rồi Hàm Filter2DArray như sau: PHP: Sao chép. Function Filter2DArray(sArray, ColIndex As Long, FindStr As String) Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp Set Dic = CreateObject("Scripting.Dictionary") TmpArr = sArray ColIndex = ColIndex + LBound(TmpArr, 2) - 1 For i = LBound(TmpArr, 1) To UBound(TmpArr, 1) TmpStr = Left(TmpArr(i, ColIndex), Len(FindStr)) If UCase(TmpStr) = UCase(FindStr) Then Dic.Add i, "" Next If Dic.Count > 0 Then Tmp = Dic.Keys ReDim Arr(UBound(Tmp), LBound(TmpArr, 2) To UBound(TmpArr, 2)) For i = LBound(Tmp) To UBound(Tmp) For j = LBound(TmpArr, 2) To UBound(TmpArr, 2) Arr(i, j) = TmpArr(Tmp(i), j) Next Next End If Filter2DArray = Arr End Function Vẫn sử dụng sự trợ giúp của Dictionary Object để định vị chỉ số dòng cần lấy ra kết quả Giao diện Form như sau: untitled.JPG Với form này thì: - Khi bấm vào các tiêu đề của ListBox thì dữ liệu sẽ được sort đúng tại cột này - Gõ vài ký tự gợi nhớ vào TextBox thì List sẽ được thu gọn lại đúng với từ khóa tìm kiếm trên cột mà trước đó ta đã bấm (tức có thể tìm kiếm trên từng cột) - Double Click vào 1 dòng nào đó trên ListBox, đồng nghĩa sẽ gán dữ liệu xuống bảng tính ------------------------------------------- Vẫn là câu nói cũ: Cái khó ở đây là phải tính toán trên Array bất kể nó là Base 0 hay Base 1. Tức có thể làm việc với Range trên bảng tính (dùng Base 1) cũng như các mảng khác như ListBox chẳng hạn (dùng Base 0) Xin các bạn vui lòng tải file về test giúp và góp ý để hoàn thiện hơn Cảm ơn ANH TUẤN

File đính kèm

  • mc_request_05.rar mc_request_05.rar 32.6 KB · Đọc: 344
Upvote 0 T

tam8678

Đời Xá Chi
Tham gia 30/4/09 Bài viết 417 Được thích 301 Nghề nghiệp Kế toán
anhtuan1066 đã viết: Với form này thì: - Gõ vài ký tự gợi nhớ vào TextBox thì List sẽ được thu gọn lại đúng với từ khóa tìm kiếm trên cột mà trước đó ta đã bấm (tức có thể tìm kiếm trên từng cột) ANH TUẤN Nhấp chuột vào đây để mở rộng...
--- Anh đọc code bài củ thì hiểu, hiện đang ứng dụng rất nhiều trong công việc, rất cám ơn chú. Riêng code bài này thì xin thua +-+-+-+, chú có thể làm thêm phần nút chọn tìm kiếm theo cột cho tiện xử dụng hơn là tìm kiếm trên cột mà trước đó ta đã bấm. Trân trọng Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
tam8678 đã viết: --- Anh đọc code bài củ thì hiểu, hiện đang ứng dụng rất nhiều trong công việc, rất cám ơn chú. Riêng code bài này thì xin thua +-+-+-+, chú có thể làm thêm phần nút chọn tìm kiếm theo cột cho tiện xử dụng hơn là tìm kiếm trên cột mà trước đó ta đã bấm. Trân trọng Nhấp chuột vào đây để mở rộng...
Thì anh muốn tìm cột nào, anh chỉ việc bấm vào tiêu đề cột đó rồi hẳn gõ vào TextBox là được rồi Code này làm việc hoàn toàn trên Array, không đụng tí nào ở bảng tính cả nên anh sẽ chẳng thấy nó "giựt giựt" như trước đâu (tốc độ nhanh hơn) Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982 Nhân đây xin đố các bạn 1 vấn đề! Trong file mc_mc_request_05 ở bài #3 có đoạn code sau: Mã: Sao chép. Private Sub CommandButton3_Click() Dim Arr SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, 1, SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16711680 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16744576 [COLOR=red][B]Col = 1[/B][/COLOR] End Sub Mã: Sao chép. Private Sub CommandButton4_Click() Dim Arr SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, 2, SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16711680 CommandButton5.BackColor = 16744576 [COLOR=red][B]Col = 2[/B][/COLOR] End Sub Mã: Sao chép. Private Sub CommandButton5_Click() Dim Arr SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, 3, SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16711680 [COLOR=red][B]Col = 3[/B][/COLOR] End Sub Giá trị Col được đặt ở cuối code. Nếu bây giờ ta đưa Col lên đầu code thì khởi động Form, gõ text vào Texbox sẽ cho kết quả không chính xác Xin hỏi: Tại sao lại như vậy? Ẹc... Ẹc... Upvote 0 huuthang_bd

huuthang_bd

Chuyên gia GPE
Tham gia 10/9/08 Bài viết 8,944 Được thích 11,371 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Thợ đụng
ndu96081631 đã viết: Nhân đây xin đố các bạn 1 vấn đề! Trong file mc_mc_request_05 ở bài #3 có đoạn code sau: Mã: Sao chép. Private Sub CommandButton3_Click() Dim Arr SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, 1, SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16711680 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16744576 [COLOR=red][B]Col = 1[/B][/COLOR] End Sub Mã: Sao chép. Private Sub CommandButton4_Click() Dim Arr SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, 2, SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16711680 CommandButton5.BackColor = 16744576 [COLOR=red][B]Col = 2[/B][/COLOR] End Sub Mã: Sao chép. Private Sub CommandButton5_Click() Dim Arr SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, 3, SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16711680 [COLOR=red][B]Col = 3[/B][/COLOR] End Sub Giá trị Col được đặt ở cuối code. Nếu bây giờ ta đưa Col lên đầu code thì khởi động Form, gõ text vào Texbox sẽ cho kết quả không chính xác Xin hỏi: Tại sao lại như vậy? Ẹc... Ẹc... Nhấp chuột vào đây để mở rộng...
Sao tôi đưa dòng đó lên đầu code nhưng nó vẫn chạy đúng nhỉ? Nhân đây tôi cũng xin hỏi thêm: Hàm Filter chỉ lọc với điều kiện Begins with... (Các ký tự đầu giống với chuỗi cần tìm thì lọc ra). Vậy có cách nào lọc theo kiểu Contains hoặc là Ends with,... hay không (không dùng vòng lặp) Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
huuthang_bd đã viết: Sao tôi đưa dòng đó lên đầu code nhưng nó vẫn chạy đúng nhỉ? Nhân đây tôi cũng xin hỏi thêm: Hàm Filter chỉ lọc với điều kiện Begins with... (Các ký tự đầu giống với chuỗi cần tìm thì lọc ra). Vậy có cách nào lọc theo kiểu Contains hoặc là Ends with,... hay không (không dùng vòng lặp) Nhấp chuột vào đây để mở rộng...
Sửa code thành vầy xem nha: Mã: Sao chép. Private Sub CommandButton3_Click() Dim Arr [COLOR=red][B]Col [/B][/COLOR]= 1 SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, [COLOR=red][B]Col[/B][/COLOR], SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16711680 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16744576 End Sub Mã: Sao chép. Private Sub CommandButton4_Click() Dim Arr [COLOR=red][B]Col[/B][/COLOR] = 2 SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, [COLOR=red][B]Col[/B][/COLOR], SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16711680 CommandButton5.BackColor = 16744576 End Sub Mã: Sao chép. Private Sub CommandButton5_Click() Dim Arr [COLOR=red][B]Col [/B][/COLOR] = 3 SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, [COLOR=red][B]Col[/B][/COLOR], SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16711680 End Sub Đây là bằng chứng untitled.JPG ------------------------------ Ah... bạn đang nói đến hàm Filter nào thế? Hàm Filter có sẳn trong VBA chăng? Lần chỉnh sửa cuối: 22/4/11 Upvote 0 huuthang_bd

huuthang_bd

Chuyên gia GPE
Tham gia 10/9/08 Bài viết 8,944 Được thích 11,371 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Thợ đụng
ndu96081631 đã viết: Sửa code thành vầy xem nha: Mã: Sao chép. Private Sub CommandButton3_Click() Dim Arr [COLOR=red][B]Col [/B][/COLOR]= 1 SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, [COLOR=red][B]Col[/B][/COLOR], SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16711680 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16744576 End Sub Mã: Sao chép. Private Sub CommandButton4_Click() Dim Arr [COLOR=red][B]Col[/B][/COLOR] = 2 SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, [COLOR=red][B]Col[/B][/COLOR], SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16711680 CommandButton5.BackColor = 16744576 End Sub Mã: Sao chép. Private Sub CommandButton5_Click() Dim Arr [COLOR=red][B]Col [/B][/COLOR] = 3 SortOrder = Not SortOrder Arr = Sort2DArray(ListBox1.List, [COLOR=red][B]Col[/B][/COLOR], SortOrder, False) ListBox1.List() = Arr ListBox1.Selected(0) = True CommandButton3.BackColor = 16744576 CommandButton4.BackColor = 16744576 CommandButton5.BackColor = 16711680 End Sub Đây là bằng chứng View attachment 61736 ------------------------------ Ah... bạn đang nói đến hàm Filter nào thế? Hàm Filter có sẳn trong VBA chăng? Nhấp chuột vào đây để mở rộng...
Nếu sửa lại như thế thì khi gọi hàm Sort2DArray biến Col đã bị thay đổi do trong hàm Sort2DArray bạn thay đổi giá trị của biến ColIndex. Do biến Col thay đổi nên khi gọi hàm Filter2DArray ở sự kiện TextBox1_Change() kết quả không còn như mong muốn. Đúng là tôi đang đề cập đến hàm Filter sẵn có trong VBA. Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
huuthang_bd đã viết: Nếu sửa lại như thế thì khi gọi hàm Sort2DArray biến Col đã bị thay đổi do trong hàm Sort2DArray bạn thay đổi giá trị của biến ColIndex. Do biến Col thay đổi nên khi gọi hàm Filter2DArray ở sự kiện TextBox1_Change() kết quả không còn như mong muốn. . Nhấp chuột vào đây để mở rộng...
Đúng lý ra sẽ không có chuyện gì xảy ra cả vì tôi đã cố tình đặt biến Col khác tên với ColIndex rồi Và xin hỏi cách khắc phục TRIỆT ĐỂ sẽ như thế nào? Nên hiểu TRIỆT ĐỂ ở đây là tôi có thể đặt biến chổ nào cũng được cả (đây cũng chỉ là vấn đề cơ bản khi viết code nhưng mọi người ít khi chú ý mà thôi)
huuthang_bd đã viết: Đúng là tôi đang đề cập đến hàm Filter sẵn có trong VBA. Nhấp chuột vào đây để mở rộng...
Tôi thấy nó tìm theo nội dung mà bạn, bất kể chuổi tìm nằm đầu hay giữa hay cuối gì nó cũng tìm được (miễn sao là tìm thấy) Xem ở đây: http://www.giaiphapexcel.com/forum/showthread.php?32598-Xin-gi%E1%BB%9Bi-thi%E1%BB%87u-h%C3%A0m-Filter-trong-VBA. Upvote 0 huuthang_bd

huuthang_bd

Chuyên gia GPE
Tham gia 10/9/08 Bài viết 8,944 Được thích 11,371 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Thợ đụng
ndu96081631 đã viết: Đúng lý ra sẽ không có chuyện gì xảy ra cả vì tôi đã cố tình đặt biến Col khác tên với ColIndex rồi Và xin hỏi cách khắc phục TRIỆT ĐỂ sẽ như thế nào? Nên hiểu TRIỆT ĐỂ ở đây là tôi có thể đặt biến chổ nào cũng được cả (đây cũng chỉ là vấn đề cơ bản khi viết code nhưng mọi người ít khi chú ý mà thôi) Tôi thấy nó tìm theo nội dung mà bạn, bất kể chuổi tìm nằm đầu hay giữa hay cuối gì nó cũng tìm được (miễn sao là tìm thấy) Xem ở đây: http://www.giaiphapexcel.com/forum/showthread.php?32598-Xin-giới-thiệu-hàm-Filter-trong-VBA. Nhấp chuột vào đây để mở rộng...
Có lẽ khai báo ByVal cho biến ColIndex trong Function là được. Thông thường thì đúng là đặt biến khác thì sẽ không có chuyện gì. Vậy Bác có biết lý do tại sao không? Sao lúc trước mình test lại thấy nó chỉ lọc với chuỗi tìm nằm ở đầu thôi. Bây giờ thì lại được. Lâu nay cứ thắc mắc mãi +-+-+-+ Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
huuthang_bd đã viết: Có lẽ khai báo ByVal cho biến ColIndex trong Function là được. Thông thường thì đúng là đặt biến khác thì sẽ không có chuyện gì. Vậy Bác có biết lý do tại sao không? Nhấp chuột vào đây để mở rộng...
Hoàn toàn chính xác về cái vụ ByVal và ByRef này rồi Hàm ta viết vầy: PHP: Sao chép. Function Filter2DArray(sArray, ColIndex As Long, FindStr As String) Chẳng nói gì đến vụ ByVal hay ByRef thì mặc định nó xem như là ByRef Phải sửa lại thành vầy mới là ổn: PHP: Sao chép. Function Filter2DArray(byVal sArray, byVal ColIndex As Long, byVal FindStr As String) Cái này đã từng để cập ở đây: http://www.giaiphapexcel.com/forum/showthread.php?35509-Th%E1%BA%A3o-lu%E1%BA%ADn-m%E1%BB%9F-r%E1%BB%99ng-v%E1%BB%81-Useful-functions-C%C3%A1c-h%C3%A0m-h%E1%BB%AFu-%C3%ADch-c%E1%BB%A7a-L%C3%AA-V%C4%83n-Duy%E1%BB%87t&p=235377#post235377 Nhưng thật sự chưa "bị dính chưởng" thì chưa ngộ ra được vấn đề (mà bạn huuthang_bd nhanh tay quá, phải đợi cho mọi người nghiên cứu chứ.. Ẹc.. Ẹc...) -------------------------------------
huuthang_bd đã viết: Sao lúc trước mình test lại thấy nó chỉ lọc với chuỗi tìm nằm ở đầu thôi. Bây giờ thì lại được. Lâu nay cứ thắc mắc mãi Nhấp chuột vào đây để mở rộng...
Lý ra tôi đã dùng hàm Filter để giải quyết bài này, nhưng cũng vì nó không tìm từ trái sang phải (như từ điển) nên đành phải tự viết lấy Lần chỉnh sửa cuối: 22/4/11 Upvote 0 anhtuan1066

anhtuan1066

Thành viên gạo cội
Tham gia 10/3/07 Bài viết 5,802 Được thích 6,913 Tiếp tục cải tiến! Hôm nay tôi lại tiếp tục cải tiến để hoàn thiện thuật toán Sort mảng 2 chiều - Hàm Sort2DArray ở các bài trước dùng vòng lập duyệt qua cột cần sort rồi add vào Dictionary, nếu có dữ liệu trùng sẽ ghép thêm 1 chuổi tạm (đối với dữ liệu dạng Text) hoặc cộng thêm 1 gia số (đối với dữ liệu dạng Number) - Với dữ liệu dạng Text thì chẳng nói làm gì nhưng còn với dạng Number thì việc cộng thêm 1 gia số là khá nguy hiểm! Ta thừa biết 1 giá trị A sau khi cộng thêm gia số X rồi trừ đi chính gia số X này cũng chưa chắc trả về kết quả là A. Cách tính toán của Excel luôn có những sai số không lường trước - Hàm Sort2DArray cải tiến mới này sẽ không đụng chạm gì đến dữ liệu gốc, chỉ đơn giản là đánh dấu vị trí rồi gán vào mảng mới tại 1 ví trí phù hợp PHP: Sao chép. Function Sort2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal Order As Boolean, ByVal HasTitle As Boolean) Dim TmpArr, i As Long, j As Long, Dic, SortArr, Item1, Item2 Dim Arr, iR As Long, Tmp, Chk As Boolean Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next TmpArr = sArray: Arr = TmpArr ColIndex = ColIndex + LBound(TmpArr, 2) - 1 Chk = IsNumeric(TmpArr(LBound(TmpArr, 1) - HasTitle, ColIndex)) ReDim Tmp(LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)) For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) Tmp(i) = TmpArr(i, ColIndex) Next SortArr = Sort1DArray(Tmp, Not Chk, Order) With CreateObject("Scripting.Dictionary") For i = LBound(SortArr) To UBound(SortArr) If Not .Exists(CStr(SortArr(i))) Then .Add CStr(SortArr(i)), i Next For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) iR = .Item(CStr(TmpArr(i, ColIndex))) .Item(CStr(TmpArr(i, ColIndex))) = iR + 1 For j = LBound(TmpArr, 2) To UBound(TmpArr, 2) Arr(iR, j) = TmpArr(i, j) Next Next End With Sort2DArray = Arr End Function ------------------------------------------------------------- Nhân tiện đọc bài viết của bạn viethoai tại đây: http://www.giaiphapexcel.com/forum/showthread.php?48402-Ứng-dụng-Hàm-Filter-với-ListBox-2-cột Tôi nghĩ rằng người dùng khi filter dữ liệu thường có 3 nhu cầu: Tìm kiếm theo kiểu Begins with, contains và Ends with! Vậy ta cải tiến lại hàm Filter2DArray theo hướng tổng quát để người dùng tùy ý chọn 1 Custom Filter (giống như AutoFilter). Tôi nhận thấy toán tử Like có thể làm được điều này: PHP: Sao chép. Function Filter2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal FindStr As String) Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp Set Dic = CreateObject("Scripting.Dictionary") TmpArr = sArray ColIndex = ColIndex + LBound(TmpArr, 2) - 1 For i = LBound(TmpArr, 1) To UBound(TmpArr, 1) If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, "" Next If Dic.Count > 0 Then Tmp = Dic.Keys ReDim Arr(UBound(Tmp), LBound(TmpArr, 2) To UBound(TmpArr, 2)) For i = LBound(Tmp) To UBound(Tmp) For j = LBound(TmpArr, 2) To UBound(TmpArr, 2) Arr(i, j) = TmpArr(Tmp(i), j) Next Next End If Filter2DArray = Arr End Function Áp dụng: Arr = Filter2DArray(sArray, ColIndex, FindStr & "*" ---> Sẽ tìm theo kiểu Begins with Arr = Filter2DArray(sArray, ColIndex, "*" & FindStr & "*" ---> Sẽ tìm theo kiểu Contains Arr = Filter2DArray(sArray, ColIndex, "*" & FindStr ---> Sẽ tìm theo kiểu Ends with Xem file mới này và kiểm tra độ chính xác nhé

File đính kèm

  • FilterAndSort_2DArray_02.rar FilterAndSort_2DArray_02.rar 37.7 KB · Đọc: 278
Lần chỉnh sửa cuối: 3/5/11 Upvote 0 Hoàng Trọng Nghĩa

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT Moderator Tham gia 17/8/08 Bài viết 8,662 Được thích 16,727 Giới tính Nam
ndu96081631 đã viết: Sort mảng 2 chiều viết rồi mà (cái này thì tôi nhớ chắc vì xài hoài) Nó ở đây: http://www.giaiphapexcel.com/forum/showthread.php?47929-Sort-mảng-2-chiều Tìm mấy bài cuối ấy! Tuy nhiên, theo nhận xét của tôi thì vụ sort xiết này rất khó nhai ---> Phải cải tiến thêm nữa mới xong! (phải có người rảnh rỗi thí nghiệm để tìm cái sai rồi mới biết phải cần cải tiến thứ gì) Nhấp chuột vào đây để mở rộng...
Đúng là cần phải cải tiến thêm rồi Thầy ơi, vì các lý do sau: 1) Kết quả xuất ra mất một Item, ngược lại double 1 đến 2 mục! 2) Theo em nghĩ, đã là mảng 2 chiều thì bao hàm luôn mảng 1 chiều, vì thế nên cải tiến ghép chúng lại thành một. Xin vui lòng xem File để dễ dàng nhận thấy và so sánh. PHP: Sao chép. Private Sub CommandButton1_Click() Dim MyArray [D3:E50].ClearContents ''Sort tu A den Z CÓ tieu de: MyArray = Sort2DArray(Range([B2], [B65536].End(xlUp)), 1, False, True) [D3].Resize(UBound(MyArray)) = MyArray ''Sort tu A den Z KHÔNG tieu de: MyArray = Sort2DArray(Range([B3], [B65536].End(xlUp)), 1, False, False) [E3].Resize(UBound(MyArray)) = MyArray End Sub ''================================================================================================================== Private Sub CommandButton2_Click() Dim MyArray [G3:H20].ClearContents ''Sort tu Z den A CÓ tieu de: MyArray = Sort2DArray(Range([B2], [B65536].End(xlUp)), 1, True, True) [G3].Resize(UBound(MyArray)) = MyArray ''Sort tu Z den A KHÔNG tieu de: MyArray = Sort2DArray(Range([B3], [B65536].End(xlUp)), 1, True, False) [H3].Resize(UBound(MyArray)) = MyArray End Sub

File đính kèm

  • Sort2DArray.xls Sort2DArray.xls 53.5 KB · Đọc: 79
Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
minhthien321 đã viết: Đúng là cần phải cải tiến thêm rồi Thầy ơi, vì các lý do sau: 1) Kết quả xuất ra mất một Item, ngược lại double 1 đến 2 mục! 2) Theo em nghĩ, đã là mảng 2 chiều thì bao hàm luôn mảng 1 chiều, vì thế nên cải tiến ghép chúng lại thành một. Xin vui lòng xem File để dễ dàng nhận thấy và so sánh. Nhấp chuột vào đây để mở rộng...
Hàm này chỉ sort mảng chứa dữ liệu hoặc là Number hoặc là Text thôi ---> Lộn xộn 2 loại dữ liệu, tôi chưa đủ sức làm nổi đâu Ngoài ra hàm còn 1 tí xíu trục trặc cần cải tiến... để từ từ tôi nghiên cứu xem (có thể sẽ là 1 giải thuật hoàn toàn khác) (Mấy trò này rất trừu tượng... phải tưởng tưởng đến vỡ đầu mới mong nghĩ ra được) Upvote 0 Hoàng Trọng Nghĩa

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT Moderator Tham gia 17/8/08 Bài viết 8,662 Được thích 16,727 Giới tính Nam
ndu96081631 đã viết: Hàm này chỉ sort mảng chứa dữ liệu hoặc là Number hoặc là Text thôi ---> Lộn xộn 2 loại dữ liệu, tôi chưa đủ sức làm nổi đâu Ngoài ra hàm còn 1 tí xíu trục trặc cần cải tiến... để từ từ tôi nghiên cứu xem (có thể sẽ là 1 giải thuật hoàn toàn khác) (Mấy trò này rất trừu tượng... phải tưởng tưởng đến vỡ đầu mới mong nghĩ ra được) Nhấp chuột vào đây để mở rộng...
Nếu dữ liệu hoặc là chữ, hoặc là số vẫn bị mất 1 mục và đúp nhiều mục. Thầy thử sẽ thấy ạ! Nếu mà được bộ 3 Sort2DArray, Filter2DArray & Unique2DArray hoàn chỉnh thì việc xử lý dữ liệu không những không khó khăn mà còn cải thiện tốc độ đáng kể vì không phải thực hiện trên sheet nữa. Lần chỉnh sửa cuối: 12/10/11 Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
minhthien321 đã viết: Nếu dữ liệu hoặc là chữ, hoặc là số vẫn bị mất 1 mục và đúp nhiều mục. Thầy thử sẽ thấy ạ! Nếu mà được bộ 3 Sort2DArray, Filter2DArray & Unique2DArray hoàn chỉnh thì việc xử lý dữ liệu không những không khó khăn mà còn cải thiện tốc độ đáng kể vì không phải thực hiện trên sheet nữa. Nhấp chuột vào đây để mở rộng...
Tôi đang trong quá trình nghiên cứu... Riêng phần Sort tôi đang hướng tới việc sort chuổi tiếng Việt Unicode ---> Cái này có đầy rồi nhưng tôi muốn làm khác hơn: Tất cả thực thi tính toán trên Array, đương nhiên tốc độ tính toán sẽ cực nhanh (có điều độ khó cũng tăng thêm) Upvote 0 sealand

sealand

Thành viên gạo cội
Tham gia 16/5/08 Bài viết 4,882 Được thích 7,687 Giới tính Nam Nghề nghiệp Kế Toán
ndu96081631 đã viết: Tôi đang trong quá trình nghiên cứu... Riêng phần Sort tôi đang hướng tới việc sort chuổi tiếng Việt Unicode ---> Cái này có đầy rồi nhưng tôi muốn làm khác hơn: Tất cả thực thi tính toán trên Array, đương nhiên tốc độ tính toán sẽ cực nhanh (có điều độ khó cũng tăng thêm) Nhấp chuột vào đây để mở rộng...
Xin Bravo, thật khốn khổ với việc Sort tiếng Việt. Hy vọng sớm có võ mới.....Cố lên NDU!!!! Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
sealand đã viết: Xin Bravo, thật khốn khổ với việc Sort tiếng Việt. Hy vọng sớm có võ mới.....Cố lên NDU!!!! Nhấp chuột vào đây để mở rộng...
Ý đồ cùa em thế này: - Tạo trước 1 mảng bao gồm tất cả các ký tự, kể cả ký tự đặc biết, ký tự số, ký tự tiếng Việt có dấu - Mảng này được sort trước từ nhỏ đến lớn (tự ta sắp xếp bằng tay trước) - Tách từ ký tự trong chuổi rồi so với mảng xem ký tự vừa tách ra nằm ở Index mấy - vân vân... ......................... Đại khái là thế nhưng còn cả đống quy trình tính toán sau đó nữa Để hôm nào đầu óc thật thanh thản, em sẽ bắt tay "mần" vụ này... Tuy nhiên, nếu có thể được, xin anh em giúp sức với em với (Quá khó, vì dù đã có giải thuật cũng chưa chắc thực hiện được) Upvote 0 sealand

sealand

Thành viên gạo cội
Tham gia 16/5/08 Bài viết 4,882 Được thích 7,687 Giới tính Nam Nghề nghiệp Kế Toán Mình cũng từng định làm vấn đề này nhưng bận mải rồi bỏ bê. Mình nêu sơ bộ dự kiến phương án của mình nha: 1/Tạo mảng có n cột: Cột 1 đến n-1 là dữ liệu gốc 2/Côt n chứa kết quả dùng code có nhiệm vụ dưới chuyển data từ cột cần sort -Chia x ký tự trong cột sort thành x*2 phần tử. Mỗi ký tự có 2 phần tử 1 ký tự: ký tự không dấu và phần tử chứa thứ tự dấu tiếng Việt. Sau đó ta ghép tất thành chuỗi x*2 ký tự . 3/Sort lại mảng dựa trên data cột n theo nguyên tắc so sánh bình thường 4/Đưa kết quả về vị trí cần thiết Chưa làm nên chũng chưa biết có gì vướng mắc đằng sau nó không? Upvote 0 anhtuan1066

anhtuan1066

Thành viên gạo cội
Tham gia 10/3/07 Bài viết 5,802 Được thích 6,913
minhthien321 đã viết: Đúng là cần phải cải tiến thêm rồi Thầy ơi, vì các lý do sau: 1) Kết quả xuất ra mất một Item, ngược lại double 1 đến 2 mục! Nhấp chuột vào đây để mở rộng...
Hàm Sort2DArray đúng là bị dính chiêu này mà đến này mới biết sai chổ nào (sai ở 3 chổ) Xin sửa lại như sau: Mã: Sao chép. Function Sort2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal Order As Boolean, ByVal HasTitle As Boolean) Dim TmpArr, i As Long, j As Long, SortArr, Item1, Item2, firstVal As Double Dim Arr, iR As Long, Tmp(), n As Long, Chk As Boolean On Error Resume Next TmpArr = sArray: Arr = TmpArr ColIndex = ColIndex + LBound(TmpArr, 2) - 1 firstVal = CDbl(TmpArr(LBound(TmpArr, 1) - HasTitle, ColIndex)) Chk = firstVal > 0 For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) [COLOR=#ff0000] [B]ReDim Preserve Tmp(n)[/B][/COLOR] If Chk Then Tmp(n) = CDbl(TmpArr(i, ColIndex)) Else Tmp(n) = CStr(TmpArr(i, ColIndex)) End If [COLOR=#ff0000] [B] n = n + 1[/B][/COLOR] Next SortArr = Sort1DArray(Tmp, Not Chk, Order) With CreateObject("Scripting.Dictionary") For i = LBound(SortArr) To UBound(SortArr) If Chk Then If Not .Exists(CDbl(SortArr(i))) Then .Add CDbl(SortArr(i)), i [COLOR=#ff0000][B]+ LBound(TmpArr, 1) - HasTitle[/B][/COLOR] Else If Not .Exists(CStr(SortArr(i))) Then .Add CStr(SortArr(i)), i [COLOR=#ff0000][B]+ LBound(TmpArr, 1) - HasTitle[/B][/COLOR] End If Next For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) [B][COLOR=#ff0000] If Chk Then[/COLOR][/B] [B][COLOR=#ff0000] iR = .Item(CDbl(TmpArr(i, ColIndex)))[/COLOR][/B] [B][COLOR=#ff0000] Else[/COLOR][/B] [B][COLOR=#ff0000] iR = .Item(CStr(TmpArr(i, ColIndex)))[/COLOR][/B] [B][COLOR=#ff0000] End If[/COLOR][/B] For j = LBound(TmpArr, 2) To UBound(TmpArr, 2) Arr(iR, j) = TmpArr(i, j) Next [COLOR=#ff0000] [B]If Chk Then[/B][/COLOR] [COLOR=#ff0000][B] .Item(CDbl(TmpArr(i, ColIndex))) = iR + 1[/B][/COLOR] [COLOR=#ff0000][B] Else[/B][/COLOR] [COLOR=#ff0000][B] .Item(CStr(TmpArr(i, ColIndex))) = iR + 1[/B][/COLOR] [COLOR=#ff0000][B] End If[/B][/COLOR] Next End With Sort2DArray = Arr End Function Các bạn test giúp tôi nhé (những chổ màu đò là những chổ đã chỉnh sửa)

File đính kèm

  • FilterAndSort_2DArray_02.rar FilterAndSort_2DArray_02.rar 42.7 KB · Đọc: 286
Upvote 0 T

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất Tham gia 16/8/06 Bài viết 3,808 Được thích 4,449
anhtuan1066 đã viết: Hàm Sort2DArray đúng là bị dính chiêu này mà đến này mới biết sai chổ nào (sai ở 3 chổ) Xin sửa lại như sau: Các bạn test giúp tôi nhé (những chổ màu đò là những chổ đã chỉnh sửa) Nhấp chuột vào đây để mở rộng...
Cám ơn anhtuan1066 nhiều, tiện đây nhờ anhtuan viết luôn 1 UDF để lọc duy nhất theo 1 cột bất kỳ luôn. Tựa như UniqueArr(sArr,ColIndex) Cám ơn nhiều. Upvote 0 Hoàng Trọng Nghĩa

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT Moderator Tham gia 17/8/08 Bài viết 8,662 Được thích 16,727 Giới tính Nam
ThuNghi đã viết: Cám ơn anhtuan1066 nhiều, tiện đây nhờ anhtuan viết luôn 1 UDF để lọc duy nhất theo 1 cột bất kỳ luôn. Tựa như UniqueArr(sArr,ColIndex) Cám ơn nhiều. Nhấp chuột vào đây để mở rộng...
Anh tham khảo bài này của Thầy Anh Tuấn luôn nè! http://www.giaiphapexcel.com/forum/...mắc-về-hàm-UDF-UniqueList&p=338234#post338234 Upvote 0 Hoàng Trọng Nghĩa

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT Moderator Tham gia 17/8/08 Bài viết 8,662 Được thích 16,727 Giới tính Nam
anhtuan1066 đã viết: Hàm Sort2DArray đúng là bị dính chiêu này mà đến này mới biết sai chổ nào (sai ở 3 chổ) Xin sửa lại như sau: Các bạn test giúp tôi nhé (những chổ màu đò là những chổ đã chỉnh sửa) Nhấp chuột vào đây để mở rộng...
Với hàm này, Thầy đã cải tiến được rất nhiều, không còn đúp hoặc sót mục nữa, sort cũng đã ngon lành hơn. Tuy nhiên, nếu đem so sánh với sort của excel thì vẫn chưa trật tự lắm. cụ thể là mình thử sửa vài mục thành a, b, c, ... 1, 2, 3 ... (mỗi hàng 1 ký tự chữ và 1 ký số) thì sẽ thấy nó vẫn chưa trật tự lắm. Ý nói rằng nó Sort theo từng cụm từ hay sao đấy! nhóm chuỗi gồm 1 ký tự thì tách riêng, nhóm 2 ký tự tách riêng v.v... Nhưng hàm này cũng giải quyết được cơ bản nhiều vấn đề về xử lý chuỗi. Cám ơn Thầy rất nhiều! Chỉnh sửa lần cuối bởi điều hành viên: 23/11/11 Upvote 0 T

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất Tham gia 16/8/06 Bài viết 3,808 Được thích 4,449
Function Sort2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal Order As Boolean, ByVal HasTitle As Boolean) Nhấp chuột vào đây để mở rộng...
Nhờ NDU giải thích cụ thể các tham số theo UDF trên.Trước mắt chỉ hiểu đượcByVal sArray: Mảng cần sortByVal ColIndex As Long: Sort theo cột ...Còn 2 tham số kia thì chưa hiểu lắm.Cám ơn! Upvote 0 ndu96081631

ndu96081631

Huyền thoại GPE
Thành viên BQT Super Moderator Tham gia 5/6/08 Bài viết 30,703 Được thích 53,982
minhthien321 đã viết: Với hàm này, Thầy đã cải tiến được rất nhiều, không còn đúp hoặc sót mục nữa, sort cũng đã ngon lành hơn. Tuy nhiên, nếu đem so sánh với sort của excel thì vẫn chưa trật tự lắm. cụ thể là mình thử sửa vài mục thành a, b, c, ... 1, 2, 3 ... (mỗi hàng 1 ký tự chữ và 1 ký số) thì sẽ thấy nó vẫn chưa trật tự lắm. Ý nói rằng nó Sort theo từng cụm từ hay sao đấy! nhóm chuỗi gồm 1 ký tự thì tách riêng, nhóm 2 ký tự tách riêng v.v... Nhưng hàm này cũng giải quyết được cơ bản nhiều vấn đề về xử lý chuỗi. Cám ơn Thầy rất nhiều! Nhấp chuột vào đây để mở rộng...
Đã nói từ trước là chưa có khả năng sort dữ liệu chứa cà Number và Text mà ---> Nó dựa trên hàm Sort mảng 1 chiều và hàm này có có nhược điểm thế Sắp tới tôi sẽ tính đến vấn đề này (thậm chí là sort luôn tiếng Việt Unicode)... Giải thuật đã có rồi, chỉ là.. hơi lười Ẹc... Ẹc... -------------------------------
ThuNghi đã viết: Nhờ NDU giải thích cụ thể các tham số theo UDF trên.Trước mắt chỉ hiểu đượcByVal sArray: Mảng cần sortByVal ColIndex As Long: Sort theo cột ...Còn 2 tham số kia thì chưa hiểu lắm.Cám ơn! Nhấp chuột vào đây để mở rộng...
Order là tùy chọn xem sort tăng hay giảm dần HasTitle là tùy chọn xem dữ liệu có tiêu đề hay không Giống như chức năng Sort của Excel thôi mà thunghi Upvote 0 langtuchungtinh360

langtuchungtinh360

Thành viên đã dừng hoạt động
Tham gia 7/10/13 Bài viết 1,062 Được thích 334
ndu96081631 đã viết: Đã nói từ trước là chưa có khả năng sort dữ liệu chứa cà Number và Text mà ---> Nó dựa trên hàm Sort mảng 1 chiều và hàm này có có nhược điểm thế Sắp tới tôi sẽ tính đến vấn đề này (thậm chí là sort luôn tiếng Việt Unicode)... Giải thuật đã có rồi, chỉ là.. hơi lười Ẹc... Ẹc... ------------------------------- Order là tùy chọn xem sort tăng hay giảm dần HasTitle là tùy chọn xem dữ liệu có tiêu đề hay không Giống như chức năng Sort của Excel thôi mà thunghi Nhấp chuột vào đây để mở rộng...
Code cuối cùng hoàn thiện nhất ở bài mấy vậy thầy? em thử dùng hết mấy code ở các bài mà nó cứ chạy ra sai sao ấy, chắc không biết dùng nên áp dụng sai quá em cần nó chỉ sort thôi chứ không cần lọc, dữ liệu bị trùng nên dùng dic chắc không được. Upvote 0 H

hic1802

Thành viên tiêu biểu
Tham gia 16/2/13 Bài viết 545 Được thích 34 Giới tính Nam Mình nghĩ trong phần tìm kiếm textbox1 tìm kiếm được cả Machina name và tên máy nữa thì tuyệt.
anhtuan1066 đã viết: Trước đây tôi có làm 1 form hổ trợ tìm kiếm và nhập liệu. Việc tìm kiếm thì dùng AutoFilter, còn sort dữ liệu trên ListBox thì đương nhiên dùng chức năng Sort sẳn có của Excel để làm: Sort trên bảng tính, xong gán dữ liệu từ bảng tính vào ListBox Cảm thấy cách làm đó tuy đơn giản nhưng không mấy chuyên nghiệp, vả lại tốc độ xử lý cũng không cao! Như ta đã biết, việc Filter đối với mảng 1 chiều thì đã có hàm Filter giải quyết. Vậy hôm nay tôi viết thêm hàm Filter2DArray nữa là có thể đưa vào ứng dụng với form hổ trợ tìm kiếm và nhập liệu rồi Hàm Filter2DArray như sau: PHP: Sao chép. Function Filter2DArray(sArray, ColIndex As Long, FindStr As String) Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp Set Dic = CreateObject("Scripting.Dictionary") TmpArr = sArray ColIndex = ColIndex + LBound(TmpArr, 2) - 1 For i = LBound(TmpArr, 1) To UBound(TmpArr, 1) TmpStr = Left(TmpArr(i, ColIndex), Len(FindStr)) If UCase(TmpStr) = UCase(FindStr) Then Dic.Add i, "" Next If Dic.Count > 0 Then Tmp = Dic.Keys ReDim Arr(UBound(Tmp), LBound(TmpArr, 2) To UBound(TmpArr, 2)) For i = LBound(Tmp) To UBound(Tmp) For j = LBound(TmpArr, 2) To UBound(TmpArr, 2) Arr(i, j) = TmpArr(Tmp(i), j) Next Next End If Filter2DArray = Arr End Function Vẫn sử dụng sự trợ giúp của Dictionary Object để định vị chỉ số dòng cần lấy ra kết quả Giao diện Form như sau: View attachment 61663 Với form này thì: - Khi bấm vào các tiêu đề của ListBox thì dữ liệu sẽ được sort đúng tại cột này - Gõ vài ký tự gợi nhớ vào TextBox thì List sẽ được thu gọn lại đúng với từ khóa tìm kiếm trên cột mà trước đó ta đã bấm (tức có thể tìm kiếm trên từng cột) - Double Click vào 1 dòng nào đó trên ListBox, đồng nghĩa sẽ gán dữ liệu xuống bảng tính ------------------------------------------- Vẫn là câu nói cũ: Cái khó ở đây là phải tính toán trên Array bất kể nó là Base 0 hay Base 1. Tức có thể làm việc với Range trên bảng tính (dùng Base 1) cũng như các mảng khác như ListBox chẳng hạn (dùng Base 0) Xin các bạn vui lòng tải file về test giúp và góp ý để hoàn thiện hơn Cảm ơn ANH TUẤN Nhấp chuột vào đây để mở rộng...
Upvote 0 Hieu.ewh

Hieu.ewh

Thành viên mới
Tham gia 12/7/18 Bài viết 6 Được thích 0 Sao mình chạy hàm này nó không đưa lên vị trí đầu tiên của bảng Upvote 0 M

Miccpro

Thành viên thường trực
Tham gia 9/12/10 Bài viết 236 Được thích 10
anhtuan1066 đã viết: Hàm Sort2DArray đúng là bị dính chiêu này mà đến này mới biết sai chổ nào (sai ở 3 chổ) Xin sửa lại như sau: Mã: Sao chép. Function Sort2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal Order As Boolean, ByVal HasTitle As Boolean) Dim TmpArr, i As Long, j As Long, SortArr, Item1, Item2, firstVal As Double Dim Arr, iR As Long, Tmp(), n As Long, Chk As Boolean On Error Resume Next TmpArr = sArray: Arr = TmpArr ColIndex = ColIndex + LBound(TmpArr, 2) - 1 firstVal = CDbl(TmpArr(LBound(TmpArr, 1) - HasTitle, ColIndex)) Chk = firstVal > 0 For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) [COLOR=#ff0000] [B]ReDim Preserve Tmp(n)[/B][/COLOR] If Chk Then Tmp(n) = CDbl(TmpArr(i, ColIndex)) Else Tmp(n) = CStr(TmpArr(i, ColIndex)) End If [COLOR=#ff0000] [B] n = n + 1[/B][/COLOR] Next SortArr = Sort1DArray(Tmp, Not Chk, Order) With CreateObject("Scripting.Dictionary") For i = LBound(SortArr) To UBound(SortArr) If Chk Then If Not .Exists(CDbl(SortArr(i))) Then .Add CDbl(SortArr(i)), i [COLOR=#ff0000][B]+ LBound(TmpArr, 1) - HasTitle[/B][/COLOR] Else If Not .Exists(CStr(SortArr(i))) Then .Add CStr(SortArr(i)), i [COLOR=#ff0000][B]+ LBound(TmpArr, 1) - HasTitle[/B][/COLOR] End If Next For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1) [B][COLOR=#ff0000] If Chk Then iR = .Item(CDbl(TmpArr(i, ColIndex))) Else iR = .Item(CStr(TmpArr(i, ColIndex))) End If[/COLOR][/B] For j = LBound(TmpArr, 2) To UBound(TmpArr, 2) Arr(iR, j) = TmpArr(i, j) Next [COLOR=#ff0000] [B]If Chk Then .Item(CDbl(TmpArr(i, ColIndex))) = iR + 1 Else .Item(CStr(TmpArr(i, ColIndex))) = iR + 1 End If[/B][/COLOR] Next End With Sort2DArray = Arr End Function Các bạn test giúp tôi nhé (những chổ màu đò là những chổ đã chỉnh sửa) Nhấp chuột vào đây để mở rộng...
Anh anh chị giúp em, hàm này chỉ chạy trên Office 32 bit, còn với 64 bit thì không được ạ Upvote 0 Cá ngừ F1

Cá ngừ F1

( ͡° ͜ʖ ͡°)
Thành viên BQT Moderator Tham gia 1/1/08 Bài viết 2,580 Được thích 3,723 Donate (Momo) Donate Giới tính Nam Nghề nghiệp Quan hệ.. và quan hệ..
Miccpro đã viết: Anh anh chị giúp em, hàm này chỉ chạy trên Office 32 bit, còn với 64 bit thì không được ạ Nhấp chuột vào đây để mở rộng...
Chạy báo lỗi gì vậy bạn? như tôi đang dùng bản 64bit vẫn chạy bình thường Upvote 0 M

Miccpro

Thành viên thường trực
Tham gia 9/12/10 Bài viết 236 Được thích 10
Cá ngừ F1 đã viết: Chạy báo lỗi gì vậy bạn? như tôi đang dùng bản 64bit vẫn chạy bình thường Nhấp chuột vào đây để mở rộng...
Dạ, cảm ơn anh. Em vừa cài đặt lại 1 tý office là chạy được rồi ạ Upvote 0 Bạn phải đăng nhập hoặc đăng ký để trả lời bài viết tại đây.

Bài viết mới nhất

HeSanbi
  • Đã giải quyết
FitRowXL v1.0 - Giãn dòng tự động và bổ trợ in ấn Excel (*01/2026 mới)
    • Thích
    • Yêu thích
  • HeSanbi
  • 18/4/21
  • Lập Trình với Excel
Trả lời 67 Đọc 30K Hôm nay lúc 20:17 HeSanbi HeSanbi HeSanbi
  • Question Question
Tạo Add-in, tệp Excel, Word, Access tự động cập nhật phiên bản mới từ Cloud cho chính nó
  • HeSanbi
  • Hôm nay lúc 20:14
  • Lập Trình với Excel
Trả lời 0 Đọc 22 Hôm nay lúc 20:14 HeSanbi HeSanbi SA_DQ Copilot bình luận các ván cờ vua từng ngày.
    • Thích
  • SA_DQ
  • 3/11/25
  • Chia sẻ
Trả lời 55 Đọc 2K Hôm nay lúc 19:53 SA_DQ SA_DQ V Một Excel add-in vibe coding
    • Thích
  • vietdang170
  • Thứ tư lúc 12:55
  • Các Add-ins cho excel
Trả lời 14 Đọc 443 Hôm nay lúc 18:14 vietdang170 V H Xin giúp đặt điều kiện trong Conditional Formating (1 người xem)
  • hoanglocphat
  • Hôm nay lúc 14:23
  • Hỏi đáp những vấn đề khác
Trả lời 5 Đọc 48 Hôm nay lúc 17:41 DeTong D Nguyễn Duy Tuân
  • Dán lên cao
Phiên bản mới Add-in A-Tools AI v10 (2024)
    • Thích
  • Nguyễn Duy Tuân
  • 13/9/24
  • BLUESOFTS: A-Excel, A-Tools
Trả lời 61 Đọc 12K Hôm nay lúc 15:13 Nguyễn Duy Tuân Nguyễn Duy Tuân ongke0711
  • Question Question
Tải hóa đơn điện tử (https://hoadondientu.gdt.gov.vn/) Excel Vba
    • Thích
    • Yêu thích
    • Cảm ơn
  • ongke0711
  • 6/10/24
  • Lập Trình với Excel
5 6 7 Trả lời 613 Đọc 90K Hôm nay lúc 10:00 pycckuu410 pycckuu410 mrjun80 Xin giúp hàm excel để tìm 1 số trong số có 2 chữ số
  • mrjun80
  • Thứ bảy lúc 23:43
  • Hàm và công thức Excel
Trả lời 4 Đọc 106 Hôm qua, lúc 08:38 Gà Con yêu VBA Gà Con yêu VBA N Vấn đề về hiệu năng khi thực hiện ghép chuỗi trong VBA với tần suất lớn
    • Thích
    • Cảm ơn
  • nguyendang95
  • 23/1/26
  • Excel và các ngôn ngữ lập trình khác
Trả lời 36 Đọc 916 Thứ bảy lúc 21:11 ptm0412 ptm0412 ongke0711
  • Question Question
Tra cứu thông tin mã số thuế (cập nhật lại code cũ)
    • Thích
    • Cảm ơn
    • Yêu thích
  • ongke0711
  • 24/7/25
  • Lập Trình với Excel
Trả lời 16 Đọc 2K Thứ bảy lúc 17:46 tuyethao T phuongnam366377 VNFastSearch – DLL tìm kiếm tiếng Việt tốc độ cao cho Excel VBA
  • phuongnam366377
  • Thứ bảy lúc 14:41
  • Excel và các ngôn ngữ lập trình khác
Trả lời 0 Đọc 98 Thứ bảy lúc 14:41 phuongnam366377 phuongnam366377 N
  • Question Question
Tạo khung viền ô theo số trong ô
    • Thích
  • Nguyễn Xuân Sơn
  • Thứ năm lúc 13:44
  • Lập Trình với Excel
Trả lời 9 Đọc 181 Thứ bảy lúc 12:25 Mr.hieudoanxd Mr.hieudoanxd J Đừng chỉ "Cập nhật" dữ liệu. Hãy "Xếp chồng" chúng lên.
    • Thích
  • jack nt
  • Thứ năm lúc 17:19
  • Excel và các ngôn ngữ lập trình khác
Trả lời 5 Đọc 239 Thứ bảy lúc 10:27 ptm0412 ptm0412 T gửi email đến nhân viên công ty
  • tuantv9
  • 26/1/26
  • Excel và các ngôn ngữ lập trình khác
Trả lời 2 Đọc 226 Thứ sáu lúc 09:28 nguyendang95 N H
  • Question Question
Code trích lọc mặt hàng theo thuế suất GTGT
  • hoanglocphat
  • Thứ năm lúc 10:36
  • Lập Trình với Excel
Trả lời 4 Đọc 195 Thứ sáu lúc 09:25 Maika8008 Maika8008 Nguyenkhang2404 Hỏi cách tổng hợp dữ liệu
  • Nguyenkhang2404
  • Thứ ba lúc 20:24
  • Hàm và công thức Excel
Trả lời 12 Đọc 328 Thứ năm lúc 14:22 ptm0412 ptm0412 giaiphap Add-Ins cho Excel 2007 -2016 32bit và 64bit
    • Thích
    • Yêu thích
    • Ngạc nhiên
  • giaiphap
  • 8/8/15
  • Các Add-ins cho excel
4 5 6 Trả lời 517 Đọc 225K Thứ năm lúc 09:51 Gà Công Nghệ Gà Công Nghệ Nguyễn Duy Tuân
  • Dán lên cao
Hướng dẫn lập trình VBA với Google Sheets và Excel Online | Add-in A-Tools v10
    • Thích
  • Nguyễn Duy Tuân
  • 28/11/24
  • BLUESOFTS: A-Excel, A-Tools
Trả lời 12 Đọc 2K Thứ tư lúc 23:38 Nguyễn Duy Tuân Nguyễn Duy Tuân Q Tính Tổng Có Điều Kiện Từ Nhiều Sheet
  • quydangktk
  • 20/1/11
  • Hàm và công thức Excel
Trả lời 32 Đọc 34K Thứ tư lúc 17:46 87kilua 87kilua phuongnam366377 StringCore – Thư viện COM StringBuffer hiệu năng cao (Free Binary)
  • phuongnam366377
  • 26/1/26
  • Excel và các ngôn ngữ lập trình khác
Trả lời 2 Đọc 247 Thứ ba lúc 16:15 phuongnam366377 phuongnam366377 Xem thêm… Chia sẻ: Facebook X Bluesky LinkedIn Reddit Pinterest Tumblr WhatsApp Email Chia sẻ Link

Thành viên có số lượng bài viết cao nhất tháng

  • chothadiem 4
  • hoanglocphat 3
  • Gà Công Nghệ 2
  • pycckuu410 2
  • DeTong 2
  • vietdang170 2
  • HeSanbi 2
  • HUONGHCKT 1
  • Phuocam 1
  • Gà Con yêu VBA 1

Thành viên có điểm tương tác cao nhất tháng

  • Phuocam 3
  • Gà Con yêu VBA 3
  • pycckuu410 3
  • DeTong 3
  • HUONGHCKT 2
  • vietdang170 2

Thời gian đếm ngược.

000 Ngày 00 Giờ 00 phút 00 giây Thân mời tham dự sự kiện sinh nhật GPE 2025
  • Trang chủ
  • Diễn đàn
  • Lập Trình với Excel
  • Website này sử dụng cookies. Tiếp tục sử dụng trang này, đồng nghĩa với việc bạn chấp nhận website sử dụng cookies. Chấp nhận Tìm hiểu thêm.…
Back Top Bottom

Từ khóa » Khai Báo Mảng 2 Chiều Trong Vba