Giúp rút gọn code đảo ngược giống như Sort

Liên hệ QC

1+1=2

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
5/7/20
Bài viết
62
Được thích
12
Cháu xin chào tất cả cô chú anh chị GPE. Cháu có dùng 2 đoạn code sau đảo ngược dữ liệu và xóa bỏ đi dòng trống


Mã:
Sub daonguoc()
On Error Resume Next
Dim I, j, a As Long
Dim arr, arr1
arr = Range("B3:C14").Value ' nguon
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
Range("e3").Resize(a, UBound(arr, 2)).Value = arr1   ' output
End Sub



Sub locdongtrongsort()
On Error Resume Next
Dim sArr(), I As Long, K As Long, R As Long, Col As Long
sArr = Range("E3:F14").Value ' nguon
R = UBound(sArr)
ReDim dArr(1 To R, 1 To 2)
For I = 1 To R
    If sArr(I, 1) <> "" Then
        K = K + 1
        For Col = 1 To 2
            dArr(K, Col) = sArr(I, Col)
        Next Col
    End If
Next I
' OUTPUT
Range("E3:F14").ClearContents
Range("E3").Resize(K, 2) = dArr
End Sub

Code chạy thì ok mà nó dài quá. Vậy có cách nào rút gọn không mọi người. mong mọi người giúp đỡ. Cháu xin chân thành cảm ơn
Lưu ý : cháu có thử dùng End(xlUp) nhưng khi Vùng dữ liệu B3:C14 trống hết hoặc Full dữ liệu thì nó chạy sai
1595771018886.png
 

File đính kèm

  • daonguoc.xlsb
    16.8 KB · Đọc: 3
Cháu xin chào tất cả cô chú anh chị GPE. Cháu có dùng 2 đoạn code sau đảo ngược dữ liệu và xóa bỏ đi dòng trống


Mã:
Sub daonguoc()
On Error Resume Next
Dim I, j, a As Long
Dim arr, arr1
arr = Range("B3:C14").Value ' nguon
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
Range("e3").Resize(a, UBound(arr, 2)).Value = arr1   ' output
End Sub



Sub locdongtrongsort()
On Error Resume Next
Dim sArr(), I As Long, K As Long, R As Long, Col As Long
sArr = Range("E3:F14").Value ' nguon
R = UBound(sArr)
ReDim dArr(1 To R, 1 To 2)
For I = 1 To R
    If sArr(I, 1) <> "" Then
        K = K + 1
        For Col = 1 To 2
            dArr(K, Col) = sArr(I, Col)
        Next Col
    End If
Next I
' OUTPUT
Range("E3:F14").ClearContents
Range("E3").Resize(K, 2) = dArr
End Sub

Code chạy thì ok mà nó dài quá. Vậy có cách nào rút gọn không mọi người. mong mọi người giúp đỡ. Cháu xin chân thành cảm ơn
Lưu ý : cháu có thử dùng End(xlUp) nhưng khi Vùng dữ liệu B3:C14 trống hết hoặc Full dữ liệu thì nó chạy sai
View attachment 241836
Dài?
Ăn thua gì nhỉ, Có những bài CODE dài hàng ngàn, vài ngàn dòng, vài dòng thế này thì chưa là dài. Quan trọng là thực thi và thuật toán giải quyết được vấn đề là trọn vẹn là được. Đôi khi người ta chọn code dài để chạy nhanh và sáng thuật toán dễ bảo trì.
 
Upvote 0
Đảo ngược mảng (mảng a thành mảng b):

aEnd = UBound(a)
aBeg = LBound(a)
Do While aEnd >= aBeg ' chỉnh sửa: xem giải thích bên dưới
For j = LBound(a, 2) To UBound(a, 2)
b(aBeg, j) = a(aEnd, j)
b(aEnd, j) = a(aBeg, j)
Next j
aBeg = aBeg + 1
aEnd = aEnd - 1
Loop

Đảo ngược tại chỗ:

aEnd = UBound(a)
aBeg = LBound(a)
Do While aEnd > aBeg
For j = LBound(a, 2) To UBound(a, 2)
c(j) = a(aBeg, j)
a(aBeg, j) = a(aEnd, j)
a(aEnd, j) = c(j)
Next j
aBeg = aBeg + 1
aEnd = aEnd - 1
Loop

Bổ sung: ở giải thuật 1, sửa > thành >=.
Lý do: đây là chép a qua b, khi hai đầu hội tụ vào nhau thì diểm hội tụ cũng cần phải chép. Khác với hoán đổi tại chỗ (giải thuật 2), điểm hội tụ không cần chép.

Giải thuật:
Bắt đầu từ hai đầu mảng, hoán vị. Và từ từ dời chúng vào từng bước một, hoán vị. Khi hai đầu hội tụ thì xong.
 
Lần chỉnh sửa cuối:
Upvote 0
Đảo ngược mảng (mảng a thành mảng b):

aEnd = UBound(a)
aBeg = LBound(a)
Do While aEnd > aBeg
For j = LBound(a, 2) To UBound(a, 2)
b(aBeg, j) = a(aEnd, j)
b(aEnd, j) = a(aBeg, j)
Next j
aBeg = aBeg + 1
aEnd = aEnd - 1
Loop

Đảo ngược tại chỗ:

aEnd = UBound(a)
aBeg = LBound(a)
Do While aEnd > aBeg
For j = LBound(a, 2) To UBound(a, 2)
c(j) = a(aBeg, j)
a(aBeg, j) = a(aEnd, j)
a(aEnd, j) = c(j)
Next j
aBeg = aBeg + 1
aEnd = aEnd - 1
Loop
Chú cho code rõ ràng chứ cháu không rành Input, Ouput ráp vào chổ nào
 
Upvote 0
Chú cho code rõ ràng chứ cháu không rành Input, Ouput ráp vào chổ nào
Code chỉ có ý minh hoạ giải thuật. Theo đấy: với code 1, in là mảng a, ao là mảng b; với code 2, in là mảng a, ao là cũng là mảng a
Cái vụ in/ao-bút ra giao diện người dùng thì tôi không rành, và cũng không muốn học.
 
Upvote 0
Web KT

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

Back
Top Bottom