Giúp code đảo ngược dữ liệu trong 1 vùng (1 người xem)

Liên hệ QC

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

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả nhà GPE ! Em cần 1 đoạn code để đảo ngược từ dưới lên trên như hình bên dưới. Xin chân thành cảm ơn

1540300202795.png
 

File đính kèm

Chào cả nhà GPE ! Em cần 1 đoạn code để đảo ngược từ dưới lên trên như hình bên dưới. Xin chân thành cảm ơn

View attachment 206224
bạn lắp code này vào xem thế nào nhé
Mã:
Sub daonguoc()
Dim i, j, a As Long
Dim arr, arr1
arr = Sheets(1).Range("c5:e11").Value
ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
For i = UBound(arr, 1) To 1 Step -1
a = a + 1
  For j = 1 To UBound(arr, 2)
  arr1(a, j) = arr(i, j)
  Next j
Next i
Sheets(1).Range("l5").Resize(a, UBound(arr, 2)).Value = arr1
End Sub
 
Upvote 0
bạn lắp code này vào xem thế nào nhé
Mã:
Sub daonguoc()
Dim i, j, a As Long
Dim arr, arr1
arr = Sheets(1).Range("c5:e11").Value
ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
For i = UBound(arr, 1) To 1 Step -1
a = a + 1
  For j = 1 To UBound(arr, 2)
  arr1(a, j) = arr(i, j)
  Next j
Next i
Sheets(1).Range("l5").Resize(a, UBound(arr, 2)).Value = arr1
End Sub
Cách dùng 1 mảng thôi:
i1 = 1
i2 = UBound(arr)
jj = UBound(arr,2)
Do While i2 > i1
For j = 1 to jj
tmp = arr(i1, j)
arr(i1,j) = arr(i2,j)
arr(i2,j) = tmp
i1 = i1 + 1
i2 = i2 - 1
Next j1
Loop
 
Upvote 0
Cách dùng 1 mảng thôi:
i1 = 1
i2 = UBound(arr)
jj = UBound(arr,2)
Do While i2 > i1
For j = 1 to jj
tmp = arr(i1, j)
arr(i1,j) = arr(i2,j)
arr(i2,j) = tmp
i1 = i1 + 1
i2 = i2 - 1
Next j1
Loop

Xin chào bác VetMini, cháu thử viết theo gợi ý của Bác.
Code báo lỗi ở dòng: Next j1 ,cháu sửa lại Next j
Nhưng kết quả không giống với kết quả minh họa tại bài 1:
Mã:
Sub daonguoc2()
    Dim i1, i2, jj, tmp, arr
    arr = Sheets(1).Range("C5:E11").Value
        i1 = 1
        i2 = UBound(arr)
        jj = UBound(arr, 2)
    Do While i2 > i1
        For j = 1 To jj
            tmp = arr(i1, j)
            arr(i1, j) = arr(i2, j)
            arr(i2, j) = tmp
            i1 = i1 + 1
            i2 = i2 - 1
        Next j 'j1
    Loop
    Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr
End Sub

Nhờ bác chỉ giúp cháu chỗ sai ạ.
 
Upvote 0
Xin chào bác VetMini, cháu thử viết theo gợi ý của Bác.
Code báo lỗi ở dòng: Next j1 ,cháu sửa lại Next j
Nhưng kết quả không giống với kết quả minh họa tại bài 1:
Mã:
Sub daonguoc2()
    Dim i1, i2, jj, tmp, arr
    arr = Sheets(1).Range("C5:E11").Value
        i1 = 1
        i2 = UBound(arr)
        jj = UBound(arr, 2)
    Do While i2 > i1
        For j = 1 To jj
            tmp = arr(i1, j)
            arr(i1, j) = arr(i2, j)
            arr(i2, j) = tmp
            i1 = i1 + 1
            i2 = i2 - 1
        Next j 'j1
    Loop
    Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr
End Sub
Nhờ bác chỉ giúp cháu chỗ sai ạ.
Tham gia ngoài lề
Có lẽ phải chuyển
Mã:
i1 = i1 + 1
i2 = i2 - 1
ra ngoài vòng lặp for ... next
Thay i1 thành Ubound(arr) trong câu lệnh dưới
Mã:
Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr
 
Upvote 0
Với dữ liệu như của bạn chủ bài đăng, ta có thể xài:
PHP:
Sub LatDuLieu()
Dim Rng As Range
Dim Col As Byte, Dg As Long
Set Rng = [c5].CurrentRegion
' MsgBox Rng.Columns.Count, , Rng.Rows.Count    '
ReDim Arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count)
For Col = 1 To Rng.Columns.Count
    For Dg = 1 To Rng.Rows.Count
        Arr(Rng.Rows.Count - Dg + 1, Col) = Rng.Cells(Dg, Col)
    Next Dg
Next Col
[l5].Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Arr()
End Sub
 
Upvote 0
Tham gia ngoài lề
Có lẽ phải chuyển
Mã:
i1 = i1 + 1
i2 = i2 - 1
ra ngoài vòng lặp for ... next
Thay i1 thành Ubound(arr) trong câu lệnh dưới
Mã:
Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr

Xin chào CHAOQUAY,
Cảm ơn bạn đã chỉ giáo, thì ra: thay i1 thành Ubound(arr)
 
Upvote 0
Xin chào bác VetMini, cháu thử viết theo gợi ý của Bác.
Code báo lỗi ở dòng: Next j1 ,cháu sửa lại Next j
Nhưng kết quả không giống với kết quả minh họa tại bài 1:
Mã:
Sub daonguoc2()
    Dim i1, i2, jj, tmp, arr
    arr = Sheets(1).Range("C5:E11").Value
        i1 = 1
        i2 = UBound(arr)
        jj = UBound(arr, 2)
    Do While i2 > i1
        For j = 1 To jj
            tmp = arr(i1, j)
            arr(i1, j) = arr(i2, j)
            arr(i2, j) = tmp
            i1 = i1 + 1
            i2 = i2 - 1
        Next j 'j1
    Loop
    Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr
End Sub

Nhờ bác chỉ giúp cháu chỗ sai ạ.
Xin lỗi, tối buồn ngủ quá, viết tùm lum hết
Do While i2 > i1
For j = 1 To jj
tmp = arr(i1, j)
arr(i1, j) = arr(i2, j)
arr(i2, j) = tmp
Next j
i1 = i1 + 1
i2 = i2 - 1
Loop
 
Upvote 0
Xin lỗi, tối buồn ngủ quá, viết tùm lum hết
Do While i2 > i1
For j = 1 To jj
tmp = arr(i1, j)
arr(i1, j) = arr(i2, j)
arr(i2, j) = tmp
Next j
i1 = i1 + 1
i2 = i2 - 1
Loop

Cảm ơn bác VetMini, code OK rồi ạ.
Bác giữ gìn sức khỏe ạ,chúc bác ngủ ngon!
 
Upvote 0
Đảo nghịch mảng là bài kinh điển (classic) của giáo khoa lập trình.
Hầu hết các giải thuật đều cho hai con trỏ từ hai đầu chạy về hội tụ ở giữa.
 
Upvote 0
Với dữ liệu như của bạn chủ bài đăng, ta có thể xài:
PHP:
Sub LatDuLieu()
Dim Rng As Range
Dim Col As Byte, Dg As Long
Set Rng = [c5].CurrentRegion
' MsgBox Rng.Columns.Count, , Rng.Rows.Count    '
ReDim Arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count)
For Col = 1 To Rng.Columns.Count
    For Dg = 1 To Rng.Rows.Count
        Arr(Rng.Rows.Count - Dg + 1, Col) = Rng.Cells(Dg, Col)
    Next Dg
Next Col
[l5].Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Arr()
End Sub
Xin chào bác SA_DQ,
Nhờ bác giải thích giúp cháu hiểu thêm 2 vấn đề này với ạ:
Set Rng = [c5].CurrentRegion
MsgBox Rng.Columns.Count, , Rng.Rows.Count
Kết quả trả về 3, và 7

Vấn đề 1. Nhưng khi gán Rng.Columns.Count, Rng.Rows.Count vào biến thì không được.
Mã:
    Dim i1 As Integer, i2 As Integer, arr ()
    i1 = Rng.Rows.Count
    i2 = Rng.Columns.Count
    arr(1 To i1, 1 To i2)
Có phải khi đưa Rng.Columns.Count, Rng.Rows.Count thông qua MsgBox thì
Rng = [c5].CurrentRegion bắt đầu được gọi ra, con khi gán cho 2 biến i1,i2 thì Rng = [c5].CurrentRegion chưa được gọi ?

Vấn đề 2. Khai báo
ReDim arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count)
hoặc:
Dim arr(1 To 7, 1 To 3)
thì kết quả vẫn OK. Vậy 2 cách khai báo này có gì giống và khác nhau ? Nhờ bác giải thích giúp cháu về ReDim với ạ.
 
Upvote 0
Như bác VetMini nói, nguyên tắc hoán vị 2 phần tử là người ta nhớ "phần tử 1" ra "chỗ tạm thời" -> cho phần tử 1 bằng phần tử 2 -> cho phần tử 2 = "chỗ tạm thời". Ví dự điển hình là ta dùng hoán vị trong thuật toán QuickSort (6 năm trước tôi đã phải chiến đấu với nhiều người khi họ không hiểu ý nghĩa QuickSort của tôi
https://www.giaiphapexcel.com/diend...g-nhờ-test-hộ-và-góp-ý.71326/post-437489

https://www.giaiphapexcel.com/diendan/threads/bàn-về-thuật-toán-sort-mảng.83744/post-521122)
.
Phần tử 1 nằm ở nửa trên, phần tử 2 nằm ở nửa dưới. Chỉ cần duyệt FOR ở nửa trên (hoặc dưới). Tổng chỉ số dòng của 2 phần tử luôn không đổi và bằng Ubound(Arr) + 1
Mã:
Sub reverse()
Dim r As Long, c As Long, k As Long
Dim Arr, tmp
    Arr = ThisWorkbook.Worksheets("Sheet1").Range("C5:E11").Value
    k = UBound(Arr) + 1
    For r = 1 To UBound(Arr) \ 2
        For c = 1 To UBound(Arr, 2)
            tmp = Arr(r, c)
            Arr(r, c) = Arr(k - r, c)
            Arr(k - r, c) = tmp
        Next c
    Next r
    ThisWorkbook.Worksheets("Sheet1").Range("H5").Resize(UBound(Arr), UBound(Arr, 2)).Value = Arr
End Sub
 
Upvote 0
Sau khi đọc bài của Batman1, mình thấy cần viết thử lại macro của mình;
Tuy nhiên do bạn hỏi cụ thể 2 lệnh:
Nhờ bác giải thích giúp cháu hiểu thêm 2 vấn đề này với ạ:
Set Rng = [c5].CurrentRegion
MsgBox Rng.Columns.Count, , Rng.Rows.Count
Kết quả trả về 3, và 7
thì mình xin giải thích tỉ mĩ cho bạn:

Thứ nhất ta cần hiểu fương thức CurrentRegion (dịch nôm na là 1 vùng ô liên tục)
Để vậy bạn thử 2 câu lệnh này:
Mã:
Set Rng = [c5].CurrentRegion
MsgBox Rng.Address
& tự rút ra kết luận cần thiết; Ví dụ dữ liệu tại #1 mà ta bỏ thử lần lượt các cột F & G bạn sẽ thấy vấn đề của fương thức này thôi!

Thứ 2, câu lệnh sau mình đã vô hiệu hóa rồi & chỉ là để đó để ai (giống như bạn,. . . ) cần thì đem ra kiểm tra mà thôi

Còn viết như bạn:
PHP:
 Dim i1 As Integer, i2 As Integer, arr ()
    i1 = Rng.Rows.Count
    i2 = Rng.Columns.Count
    arr(1 To i1, 1 To i2)
Cần kiểm tra thử xem 2 tham biến i1 & i2 đang chứa trị có như bạn mong mõi hay không?

Chúc ngày làm việc hôm nay hiệu quả mĩ mãm!
 
Lần chỉnh sửa cuối:
Upvote 0
Lỡ đảo rồi thì đảo ngang đảo dọc cho vui
Mã:
Sub test_revs2D()
    Dim arr: arr = revs2D(Range("C5:E11"), True, True)
    Znew.Range("E13").Resize(UBound(arr), UBound(arr, 2)).ClearContents
    Znew.Range("E13").Resize(UBound(arr), UBound(arr, 2)).Value = arr
End Sub
    Function revs2D(ByVal rng As Range, Optional ByVal TOtoBO As Boolean, Optional ByVal BeToAf As Boolean) As Variant
        If Not IsArray(rng) Then revs2D = rng: Exit Function
        Dim i As Long, j As Long, V As Long, H As Long,  revsH, revsV, arr, dArr
        arr = rng.Value
        revsV = UBound(arr) + 1
        revsH = UBound(arr, 2) + 1
        ReDim dArr(1 To UBound(arr), 1 To UBound(arr, 2))
        For i = 1 To UBound(arr)
            V = i: If TOtoBO Then V = revsV - i
            For j = 1 To UBound(arr, 2)
                H = j: If BeToAf Then H = revsH - j
                dArr(V, H) = arr(i, j)
            Next j
        Next i
        revs2D = dArr
    End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Chào cả nhà GPE ! Em cần 1 đoạn code để đảo ngược từ dưới lên trên như hình bên dưới. Xin chân thành cảm ơn

View attachment 206224
Chủ thớt này thật là vô tâm. mỗi lần nhờ mọi người viết code đều như vậy....! có code ôm đi là chạy mất dép. không có một lời cảm ơn người khác. Không biết mọi người có ý kiến gì không?
 
Upvote 0
Chủ thớt này thật là vô tâm. mỗi lần nhờ mọi người viết code đều như vậy....! có code ôm đi là chạy mất dép. không có một lời cảm ơn người khác. Không biết mọi người có ý kiến gì không?

Có thể chủ thớt chưa biết "like'. Mình vô GPE từ 2008 mà mỗi lần nhờ xong cũng chỉ biết trả lời cám ơn chứ không biết vụ like, sau này mới biết thôi. hihi
 
Upvote 0
Thuật toán của bác batman1 ở bài #13 đúng là hữu hiệu nhất ở đây. Vì thực tế vòng lặp chỉ cần xét lặp qua phân nửa số phần tử đầu và mỗi phần tử tự liên hệ đến phần tử tương ứng của nó trong nửa còn lại.

Ỏ trên, bài #11, tôi nói về thuật toán 2 đầu chạy về nhau là vì tôi lẫn với ngôn ngữ C (quả là tối qua buồn ngủ thật). C dùng con trỏ mảng và toán tử tự tăng/giảm (auto increment/decrement) cho nên code rất gọn và hữu hiệu.
 
Upvote 0
Upvote 0
Có thể chủ thớt chưa biết "like'. Mình vô GPE từ 2008 mà mỗi lần nhờ xong cũng chỉ biết trả lời cám ơn chứ không biết vụ like, sau này mới biết thôi. hihi
Chuẩn bị có 1 phần mềm mới xuất xưởng tung ra thị trường với phiên bản "Vơ Sình Niu"
 
Upvote 0
Như bác VetMini nói, nguyên tắc hoán vị 2 phần tử là người ta nhớ "phần tử 1" ra "chỗ tạm thời" -> cho phần tử 1 bằng phần tử 2 -> cho phần tử 2 = "chỗ tạm thời".
..
Phần tử 1 nằm ở nửa trên, phần tử 2 nằm ở nửa dưới. Chỉ cần duyệt FOR ở nửa trên (hoặc dưới). Tổng chỉ số dòng của 2 phần tử luôn không đổi và bằng Ubound(Arr) + 1
Mã:
Sub reverse()
Dim r As Long, c As Long, k As Long
Dim Arr, tmp
    Arr = ThisWorkbook.Worksheets("Sheet1").Range("C5:E11").Value
    k = UBound(Arr) + 1
    For r = 1 To UBound(Arr) \ 2
        For c = 1 To UBound(Arr, 2)
            tmp = Arr(r, c)
            Arr(r, c) = Arr(k - r, c)
            Arr(k - r, c) = tmp
        Next c
    Next r
    ThisWorkbook.Worksheets("Sheet1").Range("H5").Resize(UBound(Arr), UBound(Arr, 2)).Value = Arr
End Sub

Cháu chào bác Siwtom.
Cảm ơn Bác đã đưa ra thêm một cách nữa ạ.
Cả buổi tối qua cháu bỏ bê mọi việc chỉ dành thời gian debug các đoạn code trong ví dụ này.
Qua đó cũng hiểu thêm chút xíu thế nào là mảng chiều dọc và chiều ngang của mảng và hình dung dữ liệu nó hoạt động lật qua lật lại như 1 tấm rèm.
Tối nay về cháu tiếp tục debug code của Bác và các code khác để hiểu thêm vấn đề ạ (khả năng thời gian tới cháu được tụi nhỏ sắp xếp hành lý cho lên Núi ở chỉ để ăn với luyện code bác ạ :))
 
Upvote 0
Qua đó cũng hiểu thêm chút xíu thế nào là mảng chiều dọc và chiều ngang của mảng và hình dung dữ liệu nó hoạt động lật qua lật lại như 1 tấm rèm.
Làm gì có khái niệm mảng dọc, mảng ngang?
Bạn liên tưởng đến sheet nên bạn tự bịa ra khái niệm như thế? Vd. bạn nhập một đoạn hàng (một đoạn cột) nhiều ô vào mảng thì bạn cho đó là mảng ngang (dọc)? Thực ra chúng đều là mảng 2 chiều: 1 dòng nhiều cột (1 cột nhiều dòng).
Chỉ có khái niệm mảng n chiều, với n >= 1. Ngay cả mảng 1 chiều thì là một chiều chứ đâu là ngang hay dọc? Mà nếu chỉ có mảng dọc, ngang thì mảng 3 chiều là dọc hay ngang?
 
Upvote 0
Làm gì có khái niệm mảng dọc, mảng ngang?
Bạn liên tưởng đến sheet nên bạn tự bịa ra khái niệm như thế? Vd. bạn nhập một đoạn hàng (một đoạn cột) nhiều ô vào mảng thì bạn cho đó là mảng ngang (dọc)? Thực ra chúng đều là mảng 2 chiều: 1 dòng nhiều cột (1 cột nhiều dòng).
Chỉ có khái niệm mảng n chiều, với n >= 1. Ngay cả mảng 1 chiều thì là một chiều chứ đâu là ngang hay dọc? Mà nếu chỉ có mảng dọc, ngang thì mảng 3 chiều là dọc hay ngang?

Xin chào bác Siwtom.,
Dạ vâng, cháu sẽ tìm hiểu thêm về các tên gọi và các khái niệm liên quan đến vba ạ.
Cháu cảm ơn bác Siwtom.
 
Upvote 0
Chủ thớt này thật là vô tâm. mỗi lần nhờ mọi người viết code đều như vậy....! có code ôm đi là chạy mất dép. không có một lời cảm ơn người khác. Không biết mọi người có ý kiến gì không?
Không hẳn vậy. Thớt này thường tét cốt kỹ lắm. Có khi cả tuần lễ mới có kết quả.
 
Upvote 0
Làm gì có khái niệm mảng dọc, mảng ngang?
Ý Bác batman là mảng chỉ có mảng 1 chiều và 2 chiều đó chị Oanh Thơ, mảng 2 chiều duyệt ngang duyệt dọc, nên ý của chị cũng khá đúng đấy.
Còn cái mảng 3D (chiều x , y , z) của Bác batman trong excel chưa thấy bao giờ, nên chưa dám chạm. Bác batman có thể giải thích về mảng 3D giúp em. Có phải 3 vòng lặp lòng nhau không Bác, và có phải mảng nằm trong mảng. và một ví dụ cụ thể để giúp em thoát khỏi sự tò mò
 
Lần chỉnh sửa cuối:
Upvote 0
Ý Bác batman là mảng chỉ có mảng 1 chiều và 2 chiều đó chị Oanh Thơ, mảng 2 chiều duyệt ngang duyệt dọc, nên ý của chị cũng khá đúng đấy.
Còn cái mảng 3D (chiều x , y , z) của Bác batman trong excel chưa thấy bao giờ, nên chưa dám chạm. Bác batman có thể giải thích về mảng 3D giúp em. Có phải 3 vòng lặp lòng nhau không Bác
Trên diễn đàn này đã có thành viên sử dụng mảng 4 chiều rồi bạn.
Chiều của mảng với vòng lặp có liên quan gì ở đây đâu bạn
 
Upvote 0
Upvote 0
Upvote 0
Upvote 0
OK đúng là có mảng 3 chiều thật nhưng 3 vòng lặp lồng nhau cũng không sai
https://docs.microsoft.com/en-us/do...ide/language-features/arrays/array-dimensions

Ý Bác batman là mảng chỉ có mảng 1 chiều và 2 chiều đó chị Oanh Thơ, mảng 2 chiều duyệt ngang duyệt dọc, nên ý của chị cũng khá đúng đấy.
Còn cái mảng 3D (chiều x , y , z) của Bác batman trong excel chưa thấy bao giờ, nên chưa dám chạm. Bác batman có thể giải thích về mảng 3D giúp em. Có phải 3 vòng lặp lòng nhau không Bác
Có nói bạn sai gì đâu.
Chỉ có nói là mảng nhiều chiều là một việc, nhiều vòng lặp là một việc khác thôi mà bạn
 
Upvote 0
Tiếng dùng thông dụng cho mảng trong lập trình:
chiều thứ nhất: dòng (row)
chiều thứ hai: cột (column)
chiều thứ ba: trang, hoặc lớp (page)

Khái niệm mảng ở hầu hết các bài trong thớt này là khái niệm mảng của lập trình. VBA là một ngôn ngữ lập trình. Dùng trong môi trường Excel thì nó được mặc định để sử dụng các đối tượng của Excel (Workbook, Worksheet, Range,... là điển hình của các đối tượng này). Nhưng khái niệm mảng của VBA cũng vẫn là khái niệm mảng của lập trình.

Excel là hiện thân của bảng tính trải rộng cho nên chủ yếu nó chỉ dùng 2 chiều. Nhưng "chủ yếu" không có nghĩa là luôn luôn. Sheets là thể hiện của chiều thứ ba. (lưu ý là nghĩa của page tương đối gần với sheet). Đối tượng loại Range của Excel có một số hàm để ngầm chuyển đổi giữa Range và mảng 2 chiều. Đối tượng loại WorksheetFunction cũng có khả năng tự chuyển đổi giữa mảng và Range. Tùy theo hàm mà nó chuyển 1 dòng/cột qua mảng 1 chiều, hay nhiều dòng và cột qua mảng 2 chiều. Hiện tại thì tôi chưa biết cách chuyển nhiều sheets thành mảng 3 chiều.

Người hởi ở bài #25 và #27 hiển nhiên là chưa phân biệt được VBA và Excel.
 
Lần chỉnh sửa cuối:
Upvote 0
Tiếng dùng thông dụng cho mảng trong lập trình:
chiều thứ nhất: dòng (row)
chiều thứ hai: cột (column)
chiều thứ ba: trang, hoặc lớp (page)

Khái niệm mảng ở hầu hết các bài trong thớt này là khái niệm mảng của lập trình. VBA là một ngôn ngữ lập trình. Dùng trong môi trường Excel thì nó được mặc định để sử dụng các đối tượng của Excel (Workbook, Worksheet, Range,... là điển hình của các đối tượng này). Nhưng khái niệm mảng của VBA cũng vẫn là khái niệm mảng của lập trình.

Excel là hiện thân của bảng tính trải rộng cho nên chủ yếu nó chỉ dùng 2 chiều. Nhưng "chủ yếu" không có nghĩa là luôn luôn. Sheets là thể hiện của chiều thứ ba. (lưu ý là nghĩa của page tương đối gần với sheet)

Người hởi ở bài #25 và #27 hiển nhiên là chưa phân biệt được VBA và Excel.

Cảm ơn bác VetMini, đó là những từ ngữ và khái niệm cháu cũng đang muốn tiếp cận.
Bác giữ gìn sức khỏe!
 
Upvote 0
Bác giữ gìn sức khỏe!
Kêu bác ấy giữ sức khỏe làm gì nhỉ? :rolleyes::rolleyes:

Giữ thì có dùng hay không dùng nữa?
Giữ hoài (cất kỹ) mà không dùng thì nó (sức khỏe) cũng tự yếu đi mờ. Bác ấy bảo, "Ờ, giữ gìn sức khỏe nên nghỉ vào đây viết bài." Vậy tính sao?

Sao không kêu bác ấy dùng 'xả láng' mà vẫn khỏe. :D:D
 
Upvote 0
Tiếng dùng thông dụng cho mảng trong lập trình:
chiều thứ nhất: dòng (row)
chiều thứ hai: cột (column)
chiều thứ ba: trang, hoặc lớp (page)

Khái niệm mảng ở hầu hết các bài trong thớt này là khái niệm mảng của lập trình. VBA là một ngôn ngữ lập trình. Dùng trong môi trường Excel thì nó được mặc định để sử dụng các đối tượng của Excel (Workbook, Worksheet, Range,... là điển hình của các đối tượng này). Nhưng khái niệm mảng của VBA cũng vẫn là khái niệm mảng của lập trình.

Excel là hiện thân của bảng tính trải rộng cho nên chủ yếu nó chỉ dùng 2 chiều. Nhưng "chủ yếu" không có nghĩa là luôn luôn. Sheets là thể hiện của chiều thứ ba. (lưu ý là nghĩa của page tương đối gần với sheet). Đối tượng loại Range của Excel có một số hàm để ngầm chuyển đổi giữa Range và mảng 2 chiều. Đối tượng loại WorksheetFunction cũng có khả năng tự chuyển đổi giữa mảng và Range. Tùy theo hàm mà nó chuyển 1 dòng/cột qua mảng 1 chiều, hay nhiều dòng và cột qua mảng 2 chiều. Hiện tại thì tôi chưa biết cách chuyển nhiều sheets thành mảng 3 chiều.

Người hởi ở bài #25 và #27 hiển nhiên là chưa phân biệt được VBA và Excel.
Đã hiểu bài của Bác VetMini. 1 Sheet chỉ là mảng 2 chiều. Duyệt thêm sheet khác thành 3 chiều. Các object dùng để tham chiếu như : worksheets(""), sheets("") , ...có phải vậy không Bác
 
Upvote 0
Kêu bác ấy giữ sức khỏe làm gì nhỉ? :rolleyes::rolleyes:

Giữ thì có dùng hay không dùng nữa?
Giữ hoài (cất kỹ) mà không dùng thì nó (sức khỏe) cũng tự yếu đi mờ. Bác ấy bảo, "Ờ, giữ gìn sức khỏe nên nghỉ vào đây viết bài." Vậy tính sao?

Sao không kêu bác ấy dùng 'xả láng' mà vẫn khỏe. :D:D

Xin chào, befaint

Có sức khỏe là có tất cả mà bạn :)
Vì hôm trước bác VetMini có nói là bác ấy buồn ngủ quá. Hơn nữa Oanh Thơ(OT) được biết trong chủ đề này cũng có ít nhất ba người đáng tuổi ông nên khi nhận đc sự giúp đỡ OT gửi cảm ơn không mà vẫn cảm thấy thiếu thiếu gì đó nên cũng gửi thêm lời chúc sức khỏe đến người đó, ba người nhiều tuổi mà OT nhớ không nhầm là (>70) cụ thể bác:Siwtom, VetMini,DQ_SA. Vì ba bác vẫn có thể viết bài thường xuyên nên OT gọi là bác.
Rất khâm phục các bác, lên diễn đàn học hỏi mà được những người có kinh nghiệm như các bác chỉ giáo chẳng còn gì bằng.
Có bác tính lại hay nói thẳng nói thật mới đầu cảm giác hơi khó gần nhưng thực sự lại rất quan tâm vì đã nhiều lần giúp đỡ OT, OT ngẫm lại tính giống người ông của mình, khi ông còn sống khỏe OT cũng hay bị ông mắng chửi lắm giờ ông không còn OT lại cảm thấy nhớ ông nhiều nhất.. huhu
...
Xin lỗi.. lại bắt đầu lan man rồi..

Bạn cũng hay thức khuya lắm đó befaint.
Hi nhân đây cũng cảm ơn bạn nhé befaint cảm ơn bạn cũng đã nhiều lần giúp mình.
Chúc bạn tương lai thành công rực rỡ!
 
Upvote 0
Xin chào, befaint

Có sức khỏe là có tất cả mà bạn :)
Vì hôm trước bác VetMini có nói là bác ấy buồn ngủ quá. Hơn nữa Oanh Thơ(OT) được biết trong chủ đề này cũng có ít nhất ba người đáng tuổi ông nên khi nhận đc sự giúp đỡ OT gửi cảm ơn không mà vẫn cảm thấy thiếu thiếu gì đó nên cũng gửi thêm lời chúc sức khỏe đến người đó, ba người nhiều tuổi mà OT nhớ không nhầm là (>70) cụ thể bác:Siwtom, VetMini,DQ_SA. Vì ba bác vẫn có thể viết bài thường xuyên nên OT gọi là bác.
Rất khâm phục các bác, lên diễn đàn học hỏi mà được những người có kinh nghiệm như các bác chỉ giáo chẳng còn gì bằng.
Có bác tính lại hay nói thẳng nói thật mới đầu cảm giác hơi khó gần nhưng thực sự lại rất quan tâm vì đã nhiều lần giúp đỡ OT, OT ngẫm lại tính giống người ông của mình, khi ông còn sống khỏe OT cũng hay bị ông mắng chửi lắm giờ ông không còn OT lại cảm thấy nhớ ông nhiều nhất.. huhu
...
Xin lỗi.. lại bắt đầu lan man rồi..

Bạn cũng hay thức khuya lắm đó befaint.
Hi nhân đây cũng cảm ơn bạn nhé befaint cảm ơn bạn cũng đã nhiều lần giúp mình.
Chúc bạn tương lai thành công rực rỡ!
@befaint
Anh befaint đã được quan tâm rồi nhé, sau này tiếp tục giúp đỡ chị OT nhé anh. Lúc 2 giờ sáng...:oops:
Trong đây là thấy chị ấy dễ xương nhất luôn. Cảm ơn ngọt ngào.
@Nguyễn Hoàng Oanh Thơ
Chị cảm ơn anh nhiều nhiều để anh tràn đầy cảm hứng viết code. để lớp em út học hỏi nhỉ
 
Lần chỉnh sửa cuối:
Upvote 0
@befaint
Anh befaint đã được quan rồi nhé, sau này tiếp tục giúp đỡ chị OT nhé anh. Lúc 2 giờ sáng...:oops:

Hi, có thể do chiều nay OT uống cốc nước chè không nghĩ lại mất ngủ đến tận bây giờ.
Có thể một phần do đang ngồi bàn học thêm ít tiếng Tây nên OT chưa buồn ngủ.
Giờ OT cũng chuẩn bị ngủ đây, chúc bạn ngủ ngon!
 
Upvote 0
lan mam 1 chút ... cũng đâu đó trên GPE này có ai đó nói VBA không phải là ngôn ngữ lập trình ....
Nhưng ai đó lại nói nó VBA là ngôn ngữ lập trình .... vậy ko biết ai nói đúng ai nói sai ta ??!!!

Hóng xem mở rộng kiến thức 1 chút :p:D:oops:
 
Upvote 0
lan mam 1 chút ... cũng đâu đó trên GPE này có ai đó nói VBA không phải là ngôn ngữ lập trình ....
Nhưng ai đó lại nói nó VBA là ngôn ngữ lập trình .... vậy ko biết ai nói đúng ai nói sai ta ??!!!

Hóng xem mở rộng kiến thức 1 chút :p:D:oops:
1. VBA không phải là ngôn ngữ lập trình tổng quát (như Java, C/C++), không phải lập trình giáo khoa (Pascal), không phải lập trình HĐT (Java, Delphi, C#, C++), không phải lập trình web (PHP, Java, C#)

2. VBA là ngôn ngữ lập trình ứng dụng hổ trợ cho các phần mềm lớn của Microsoft. Điển hình là Office. Lưu ý là ngay cả từ "ứng dụng" ở trên cũng trong phạm vi hạn hẹp, tức là nó chỉ giới hạn trong các ứng dụng của Microsoft. Có thể các hệ thống khác cũng dùng được, nhưng không có nghĩa là họ chịu trách nhiệm bảo trì.

3. Trên thực tế còn vài ngôn ngữ lập trình ứng dụng được giới lập trình ủng hộ rất mạnh. Điển hình là Python (rộng), R (thống kê), PHP (web).

4. Khi lạm dụng VBA để làm những công việc điều khiển hệ thống, quý vị đã cố tình quên rằng Windows có Powershell làm việc hiệu quả hơn. Trên thực tế, nếu không cần sử dụng các đối tượng của Excel hay Access thì làm việc với VBScript dễ dàng hơn VBA. (theo đúng tên của nó, script là loại ngôn ngữ "thảo", không phải là lập trình tổng quát)
 
Upvote 0
1. VBA không phải là ngôn ngữ lập trình tổng quát (như Java, C/C++), không phải lập trình giáo khoa (Pascal), không phải lập trình HĐT (Java, Delphi, C#, C++), không phải lập trình web (PHP, Java, C#)

2. VBA là ngôn ngữ lập trình ứng dụng hổ trợ cho các phần mềm lớn của Microsoft. Điển hình là Office. Lưu ý là ngay cả từ "ứng dụng" ở trên cũng trong phạm vi hạn hẹp, tức là nó chỉ giới hạn trong các ứng dụng của Microsoft. Có thể các hệ thống khác cũng dùng được, nhưng không có nghĩa là họ chịu trách nhiệm bảo trì.

3. Trên thực tế còn vài ngôn ngữ lập trình ứng dụng được giới lập trình ủng hộ rất mạnh. Điển hình là Python (rộng), R (thống kê), PHP (web).

4. Khi lạm dụng VBA để làm những công việc điều khiển hệ thống, quý vị đã cố tình quên rằng Windows có Powershell làm việc hiệu quả hơn. Trên thực tế, nếu không cần sử dụng các đối tượng của Excel hay Access thì làm việc với VBScript dễ dàng hơn VBA. (theo đúng tên của nó, script là loại ngôn ngữ "thảo", không phải là lập trình tổng quát)
Vậy Mình tạm keo vầy không biết chính xác không nữa .... sai ta sửa lại :p:D

1/ VBA là 1 ngôn ngữ lập trình ... Nhưng chưa hoàn chỉnh như những ngôn ngữ khác VD: Delphi, VB6 , C#, ...

2/ Nếu vậy thì tái khẳng định ai đó nói VBA không phải là ngôn ngữ lập trình là sai cơ Bản 70% ... hên lại trúng dòng này
 
Upvote 0
Vậy Mình tạm keo vầy không biết chính xác không nữa .... sai ta sửa lại :p:D

1/ VBA là 1 ngôn ngữ lập trình ... Nhưng chưa hoàn chỉnh như những ngôn ngữ khác VD: Delphi, VB6 , C#, ...

2/ Nếu vậy thì tái khẳng định ai đó nói VBA không phải là ngôn ngữ lập trình là sai cơ Bản 70% ... hên lại trúng dòng này
Từ "hoàn chỉnh" có thể mang tính chất chủ quan, và dễ gây hiểu lầm.
Ở trên tôi có nói VBA được đặt ra để hổ trợ các phần mềm chính của Microsoft chứ không phải để lập trình tổng quát.
Cho đến giờ phút này thì chỉ có thể khẳng định điều sau:
- VBA là con đẻ của Microsoft và không hề tiêu chuẩn hóa. Tất cả tính chất của VBA tùy thuộc vào quyết định của Microsoft.

Theo lịch sử của C thì nó xuất thân từ B, và B là ngôn ngữ được đặt ra để viết hệ điều hành Unix trên máy PDP11. Sau khi cải tiến thành C thì nó được tiêu chuẩn hóa cho đến ngày nay. B là ngôn ngữ chuyên, C là ngôn ngữ tổng quát.
Theo tôi hiểu thì Delphi được đặt vốn xuất thân là dạng HĐT của Pascal. Pascal được đặt ra vốn để dạy Angol 60. Angol 60 là một trong những ngôn ngữ đầu tiên không dùng xuống dòng để kết lệnh (dùng dấu ;) và cũng là một trong những ngôn ngữ đầu tiên có xác định khối lệnh (block: begin-end) (*). Delphi, Pascal và Angol đều được tiêu chuẩn hóa và đều là ngôn ngữ lập trình tổng quát.

(*) Trước đời ngôn ngữ cấu trúc như Angol 60, các ngôn ngữ cổ thường dùng xuống dòng để kết lệnh và không có cái vụ "End If" (BASIC, FORTRAN IV,...)
(**) FORTRAN 77 trở về sau mới có End If
(***) VBA còn giữ lại cái căn cơ BASIC của nó là chạy từng dòng, chạy dòng nào dịch dòng ấy. VB Dot Net đã khác rồi, nó dịch hết rồi mới chạy.
 
Upvote 0
Vậy Mình tạm keo vầy không biết chính xác không nữa .... sai ta sửa lại :p:D

1/ VBA là 1 ngôn ngữ lập trình ... Nhưng chưa hoàn chỉnh như những ngôn ngữ khác VD: Delphi, VB6 , C#, ...

2/ Nếu vậy thì tái khẳng định ai đó nói VBA không phải là ngôn ngữ lập trình là sai cơ Bản 70% ... hên lại trúng dòng này
Có người cho là markup language như XML là ngôn ngữ lập trình nhưng đa số không coi là ngôn ngữ lập trình. Ai cũng có lý, tùy theo xét "tiêu chuẩn" nào thôi.

Delphi, Pascal và Angol đều được tiêu chuẩn hóa và đều là ngôn ngữ lập trình tổng quát.
Chỗ này bác không chính xác, vì bác viết tắt. Nếu cân đo đong đếm bằng dụng cụ tiểu ly thì: Delphi là môi trường lập trình mà ngôn ngữ là Object Pascal :D
 
Upvote 0
...
Chỗ này bác không chính xác, vì bác viết tắt. Nếu cân đo đong đếm bằng dụng cụ tiểu ly thì: Delphi là môi trường lập trình mà ngôn ngữ là Object Pascal :D
Không phải tôi viết tắt mà là tôi lầm thật.
Hồi nào giờ tôi cứ ngỡ Delphi là tên chữ của Object Pascal. Vì không có duyên lắm với cái này nên tôi lười tìm hiểu thêm. Không phải tôi chê, nhưng hoàn cảnh lúc đó tôi chỉ được chọn lựa giữa C++ và Java.

Nghe bác nói, bây giờ ngẫm lại cái từ Delphi (tiếng Hy lạp) thì là môi trường cũng phải.
 
Upvote 0
Không phải tôi viết tắt mà là tôi lầm thật.
Hồi nào giờ tôi cứ ngỡ Delphi là tên chữ của Object Pascal. Vì không có duyên lắm với cái này nên tôi lười tìm hiểu thêm. Không phải tôi chê, nhưng hoàn cảnh lúc đó tôi chỉ được chọn lựa giữa C++ và Java.

Nghe bác nói, bây giờ ngẫm lại cái từ Delphi (tiếng Hy lạp) thì là môi trường cũng phải.
Trên mạng luôn có những cuộc tranh cãi nảy lửa và những người như bác tự thấy là thuộc đẳng cấp "bề trên" đấy. :D Mọi người chỉ cho Dephi (Object Pascal) ngồi chiếu dưới thôi.

Tôi thì 2 món của bác chào thua.
 
Upvote 0
Mình xin chân thành cảm ơn mọi người đã hổ trợ mình quá nhiệt tình. Thiệt tình bửa giờ Mình bạn quá chưa cảm ơn mọi người được. mình chân thành cảm ơn. Thật ra mình dùng code bài 2 OK rồi ( nếu bí quá dùng chiêu của anh NDU đánh số STT rồi sort ). Mình like hết rồi nhé
 
Upvote 0
Trên mạng luôn có những cuộc tranh cãi nảy lửa và những người như bác tự thấy là thuộc đẳng cấp "bề trên" đấy. :D Mọi người chỉ cho Dephi (Object Pascal) ngồi chiếu dưới thôi.

Tôi thì 2 món của bác chào thua.
mà sao em thấy Delphi chỉ phát triển ở nhật, Đức, Nga và Mỹ, tàu .... còn lại thấy ít lắm ... ở Việt nam càng ít
Phải chăng nó không phổ biến như các ngôn ngữ khác và ứng dụng vào thực tiễn ít hơn hay sao Anh nhỉ ?!
 
Upvote 0
Sự "phát triển" còn dựa vào nhiều yếu tố. Không nhất thiết A "phát triển" hơn B thì A xịn hơn B.

Ngày xưa, Borland Pascal (quên mất nó tên thật là gì) được phổ biến nhất là vì 2 lý do chính:
1. Trình dịch nhẹ ký, không làm máy bị ỳ ạch.
2. Trình dịch dễ chôm. Khi Borland phơ ri luôn nó thì Pascal trở thành số một trong lập trình máy PC (hệ thống của Microsoft)

Bây giờ, chuyện kích cỡ và giá tiền trình dịch không thành vấn đề, chỉ còn lại môi trường và nền tảng.

Theo tôi đoán thì ở VN phong trào lập trình Web ăn khách hơn lập trình Windows. Mà lập trình Web thì dân VN chuộng PHP vì:
1. Dễ học, dễ debug
2. Mấy cái server phơ ri (Apache) cũng nhẹ ký
3. Nhiều thư viện hổ trợ
4. Gần với JavaScript, cũng là ngôn ngữ Web.

Đại khái, nhìn vào 4 điểm kể trên, bạn cũng có thể thấy tại sao ở PGE này bà con thích VBA.
1. Dễ học, dễ debug
2. Nền tảng là Excel/Access cũng nhẹ ký
3. Nhiều thư viện hổ trợ - đối với bà con vọc Windows, mấy cái API là ngon lắm rồi.
4. Gần với VB6.

Còn mấy điểm nữa, những tôi nghĩ kể ra cũng thừa vì hoàn toàn khong quan trọng với dân GPE. Điển hình là sự kiểm định của tiêu chuẩn quốc tế.
 
Upvote 0
lang thang tìm tài liệu trên Internet thấy Tây nó xài đa mảng .... mà chưa thấy trên GPE xài .... hay xài rồi mà mình ko biết nữa ?!
Úp cho ai cần tham khảo thêm

Mã:
Public Sub TestMe()
    Dim varArray            As Variant
    Dim lCounter            As Long
    Dim lCounter2           As Long
    Dim rngCell             As Range
    ''varArray = Array(Array(1, 2, 3, 4), Array(11, 12, 13, 14))
    varArray = Array(Array(1, 2, 3, 4), Array(11, 12, 13, 14), Array(16, 17, 18, 19))
    Set rngCell = Cells(1, 1)
    For lCounter = LBound(varArray) To UBound(varArray)
        For lCounter2 = LBound(varArray(lCounter)) To UBound(varArray(lCounter))

            Debug.Print varArray(lCounter)(lCounter2)

            rngCell = varArray(lCounter)(lCounter2)
            Set rngCell = rngCell.Offset(0, 1)

        Next lCounter2
        Debug.Print "-----------"
        Set rngCell = Cells(rngCell.Row + 1, 1)
    Next lCounter
End Sub
 
Upvote 0
lang thang tìm tài liệu trên Internet thấy Tây nó xài đa mảng .... mà chưa thấy trên GPE xài .... hay xài rồi mà mình ko biết nữa ?!
Cách đây khoảng 1 tháng, có bạn hỏi về cách dùng Redim Preserve để thay đổi số dòng trong mảng 2 chiều (Redim Preserve chỉ thay đổi được số cột)
Trong bài trả lời, tôi có đề cập 2 phương pháp:
1. Đảo cột thành dòng
2. Dùng mảng trong mảng.
 
Upvote 0
Cách đây khoảng 1 tháng, có bạn hỏi về cách dùng Redim Preserve để thay đổi số dòng trong mảng 2 chiều (Redim Preserve chỉ thay đổi được số cột)
Trong bài trả lời, tôi có đề cập 2 phương pháp:
1. Đảo cột thành dòng
2. Dùng mảng trong mảng.
Vậy Bài 49 keo là Dùng mảng trong mảng .... hay Tây nó keo là đa mảng cũng chính là Nó
 
Upvote 0
Vậy Bài 49 keo là Dùng mảng trong mảng .... hay Tây nó keo là đa mảng cũng chính là Nó
Cái này kêu thế em thấy hơi phức tạp, kiểu nâng cao quan điểm ấy.
Em cũng hay dùng cái này, chỉ hiểu đơn giản các phần tử của mảng có thể là bất kỳ kiểu dữ liệu nào (hình như object cũng được), có thể là một giá trị đơn hay một mảng. Hồi em tìm hiểu về mấy bài Hastable, Dictionary... phát hiện item có thể là giá trị đơn hay mảng nên thử với Array luôn..
 
Upvote 0
Cái này kêu thế em thấy hơi phức tạp, kiểu nâng cao quan điểm ấy.
Em cũng hay dùng cái này, chỉ hiểu đơn giản các phần tử của mảng có thể là bất kỳ kiểu dữ liệu nào (hình như object cũng được), có thể là một giá trị đơn hay một mảng. Hồi em tìm hiểu về mấy bài Hastable, Dictionary... phát hiện item có thể là giá trị đơn hay mảng nên thử với Array luôn..
Nếu mảng variant thì như vậy. Bởi vì variant có thể là bất cứ kiểu gì. Trước đây có một bạn viết bài nói về mảng variant.
Mảng trong mảng thường được dùng để làm mảng răng cưa: số phần tử của các "dòng" không bằng nhau (dạng dích dắc/zigzag). Mảng 2 chiều bắt buộc phải hình chữ nhật (dạng bảng).

Object:
For each s In Array(Sheet1, Sheet2, Sheet3) là một ví dụ của mảng Objects
 
Upvote 0
Thấy tây nó nói mấy dòng sau:
Một mảng là một cấu trúc dữ liệu lưu trữ một hoặc nhiều loại giá trị tương tự trong một giá trị duy nhất. Ví dụ: nếu bạn muốn lưu trữ 100 số thì thay vì xác định 100 biến dễ dàng để xác định một mảng có độ dài 100.

Có ba loại mảng khác nhau và mỗi giá trị mảng được truy cập bằng ID c được gọi là chỉ mục mảng.
  • Mảng số - Một mảng có chỉ số bằng số. Giá trị được lưu trữ và truy cập trong thời trang tuyến tính.
  • Mảng kết hợp - Một mảng có chuỗi là chỉ mục. Điều này lưu trữ các giá trị phần tử kết hợp với các giá trị chính thay vì theo thứ tự chỉ số tuyến tính nghiêm ngặt.
  • Mảng đa chiều - Một mảng chứa một hoặc nhiều mảng và giá trị được truy cập bằng nhiều chỉ mục


Vậy cái chữ To màu đỏ kia Mình ko hiểu luôn .....Mong chỉ dẫn
 
Lần chỉnh sửa cuối:
Upvote 0
Tây nào vậy. Cho biết nguồn chính và nguồn dịch.
 
Upvote 0
Tây nào vậy. Cho biết nguồn chính và nguồn dịch.
thì lâu nay Mình đang tìm tài liệu học Delphi ... cái mong muốn tìm thì nó ko ra mà cứ ra cái liên quan ...đang suy nghĩ 1 chút nhiều khả năng là mình ko biết tiếng anh và tây nó keo một đường Mình lại keo 1 nẻo và Google nó ko hiểu ý mình nên nó cứ tìm ra chéo cánh vậy ...:p:D

Vậy nên Mình mới hay hỏi tây Nó keo là chi vì lẻ đó ...vvv

trang đó nó viết tiếng Anh mà tiếng anh mình toàn keo Google nó dịch nhiều lúc thấy nó dịch phì ra cười vì nhưng câu ngay thơ...
Link sau
https://www.tutorialspoint.com/php/php_arrays.htm

Nếu bạn nào rảnh thử test cái QuickSort này xem .... Cũng tây nó keo "Mã này đã sắp xếp 10.000 hàng trong ít hơn một giây. "

ko biết nó nói vậy sao nữa nhưng nhìn thấy code dài mấy mét .... Mình làm biếng coi lắm dành cho Bạn nào tham khảo thêm ...

Mã:
' QuickSort for 2D array in form Array(cols,rows)
  ' Enter in 1, 2, or 3 columns to sort by, each can be either asc or desc
Public Sub QuickSortStart(ThisArray As Variant, sortColumn1 As Integer, asc1 As Boolean, Optional sortColumn2 As Integer = -1, Optional asc2 As Boolean = True, Optional sortColumn3 As Integer = -1, Optional asc3 As Boolean = True)

    Dim LowerBound As Integer
    Dim UpperBound As Integer

    LowerBound = LBound(ThisArray, 2)
    UpperBound = UBound(ThisArray, 2)

    Call QuickSort(ThisArray, LowerBound, UpperBound, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3)

End Sub


Private Sub QuickSort(ThisArray As Variant, FirstRow As Integer, LastRow As Integer, sortColumn1 As Integer, asc1 As Boolean, sortColumn2 As Integer, asc2 As Boolean, sortColumn3 As Integer, asc3 As Boolean)

    Dim pivot1 As Variant
    Dim pivot2 As Variant
    Dim pivot3 As Variant
    Dim tmpSwap As Variant
    Dim tmpFirstRow  As Integer
    Dim tmpLastRow   As Integer
    Dim FirstCol As Integer
    Dim LastCol As Integer
    Dim i As Integer

    tmpFirstRow = FirstRow
    tmpLastRow = LastRow
    FirstCol = LBound(ThisArray, 1)
    LastCol = UBound(ThisArray, 1)

    pivot1 = ThisArray(sortColumn1, (FirstRow + LastRow) \ 2)
    If sortColumn2 <> -1 Then
        pivot2 = ThisArray(sortColumn2, (FirstRow + LastRow) \ 2)
    End If
    If sortColumn3 <> -1 Then
        pivot3 = ThisArray(sortColumn3, (FirstRow + LastRow) \ 2)
    End If

    While (tmpFirstRow <= tmpLastRow)

        While (compareFirstLoop(ThisArray, pivot1, pivot2, pivot3, tmpFirstRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3) And tmpFirstRow < LastRow)
            tmpFirstRow = tmpFirstRow + 1
        Wend

        While (compareSecondLoop(ThisArray, pivot1, pivot2, pivot3, tmpLastRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3) And tmpLastRow > FirstRow)
            tmpLastRow = tmpLastRow - 1
        Wend

        If (tmpFirstRow <= tmpLastRow) Then
            For i = FirstCol To LastCol
                tmpSwap = ThisArray(i, tmpFirstRow)
                ThisArray(i, tmpFirstRow) = ThisArray(i, tmpLastRow)
                ThisArray(i, tmpLastRow) = tmpSwap
            Next i
            tmpFirstRow = tmpFirstRow + 1
            tmpLastRow = tmpLastRow - 1
        End If
    Wend

    If (FirstRow < tmpLastRow) Then
        Call QuickSort(ThisArray, FirstRow, tmpLastRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3)
    End If

    If (tmpFirstRow < LastRow) Then
        Call QuickSort(ThisArray, tmpFirstRow, LastRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3)
    End If

End Sub

Private Function compareFirstLoop(ThisArray As Variant, pivot1 As Variant, pivot2 As Variant, pivot3 As Variant, checkRow As Integer, sortColumn1 As Integer, asc1 As Boolean, sortColumn2 As Integer, asc2 As Boolean, sortColumn3 As Integer, asc3 As Boolean)

    If asc1 = True And ThisArray(sortColumn1, checkRow) < pivot1 Then
        compareFirstLoop = True
    ElseIf asc1 = False And ThisArray(sortColumn1, checkRow) > pivot1 Then
        compareFirstLoop = True

    'Move to Second Column
    ElseIf sortColumn2 <> -1 And ThisArray(sortColumn1, checkRow) = pivot1 Then
        If asc2 = True And ThisArray(sortColumn2, checkRow) < pivot2 Then
            compareFirstLoop = True
        ElseIf asc2 = False And ThisArray(sortColumn2, checkRow) > pivot2 Then
            compareFirstLoop = True

        'Move to Third Column
        ElseIf sortColumn3 <> -1 And ThisArray(sortColumn2, checkRow) = pivot2 Then
            If asc3 = True And ThisArray(sortColumn3, checkRow) < pivot3 Then
                compareFirstLoop = True
            ElseIf asc3 = False And ThisArray(sortColumn3, checkRow) > pivot3 Then
                compareFirstLoop = True

            Else
                compareFirstLoop = False
            End If
        Else
            compareFirstLoop = False
        End If
    Else
        compareFirstLoop = False
    End If
End Function

Private Function compareSecondLoop(ThisArray As Variant, pivot1 As Variant, pivot2 As Variant, pivot3 As Variant, checkRow As Integer, sortColumn1 As Integer, asc1 As Boolean, sortColumn2 As Integer, asc2 As Boolean, sortColumn3 As Integer, asc3 As Boolean)

    If asc1 = True And pivot1 < ThisArray(sortColumn1, checkRow) Then
        compareSecondLoop = True
    ElseIf asc1 = False And pivot1 > ThisArray(sortColumn1, checkRow) Then
        compareSecondLoop = True

    'Move to Second Column
    ElseIf sortColumn2 <> -1 And ThisArray(sortColumn1, checkRow) = pivot1 Then
        If asc2 = True And pivot2 < ThisArray(sortColumn2, checkRow) Then
            compareSecondLoop = True
        ElseIf asc2 = False And pivot2 > ThisArray(sortColumn2, checkRow) Then
            compareSecondLoop = True


        'Move to Third Column
        ElseIf sortColumn3 <> -1 And ThisArray(sortColumn2, checkRow) = pivot2 Then
            If asc3 = True And pivot3 < ThisArray(sortColumn3, checkRow) Then
                compareSecondLoop = True
            ElseIf asc3 = False And pivot3 > ThisArray(sortColumn3, checkRow) Then
                compareSecondLoop = True
            Else
                compareSecondLoop = False
            End If


        Else
            compareSecondLoop = False
        End If
    Else
        compareSecondLoop = False
    End If

End Function
 
Upvote 0
Có nguòn trích dẫn thì mới biết cái ngữ cảnh của nó mà nói chuyện tiếp.
Bạn học Delphi mà lại đi mò tài liệu PHP thì nó hơi rắc rối.
PHP là ngôn ngữ web, nó dùng khái niệm khá tân thời về kiểu của biến.

Cái loại mảng thứ nhất mà bạn đề cập ở trên là mảng bình thường mà các bạn vẫn dùng.
Loại mảng thứ hai tiếng nghề còn gọi là "indexed list" (dãy có thể truy cập bằng chỉ số). Tuỳ theo môi trường và cách dùng mà nó thể hiện là collection hay dictionary - cái mà các bạn vẫn dùng ở đây.
 
Upvote 0

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

Back
Top Bottom