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

Liên hệ QC

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

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
Web KT

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

Back
Top Bottom