Code sắp xếp lại thứ tự góc theo yêu cầu (1 người xem)

  • Thread starter Thread starter AnhNQT
  • Ngày gửi Ngày gửi
Liên hệ QC

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

AnhNQT

Thành viên chính thức
Tham gia
6/11/18
Bài viết
61
Được thích
5
Giới tính
Nam
Nhờ các Thầy giúp bài này với ạ!
Dữ liệu có từ cột A -> D
Số liệu cần kiểm tra và sắp xếp ở cột D với giá trị nằm trong khoảng từ 0 đến 359 độ
Cột E là kết quả sau khi kiểm tra và sắp xếp theo điều kiện 1
Điều kiện 1 là: Sắp xếp lại từ nhỏ tới lớn
Cột F là kết quả sau khi kiểm tra và sắp xếp theo điều kiện 2
Điều kiện 2 là: Sắp xếp lại với điều kiện so sánh
Nếu Azm nằm trong khoảng từ 300 đến 60 (300 310 320 330 340 350 0 10 20 30 40 50 60) 360 tức là 0 độ
Thì sẽ tìm giá trị nào nằm gần 0 nhất sẽ sắp xếp lên vị trí ID-1 (Ví dụ: so sánh 320 và 60 thì 320 là số gần 0 nhất)
Vị trí ID-2 và ID-3 sẽ sắp xếp 2 giá trị còn lại từ nhỏ tới lớn.
 

File đính kèm

Nhờ các Thầy giúp bài này với ạ!
Dữ liệu có từ cột A -> D
Số liệu cần kiểm tra và sắp xếp ở cột D với giá trị nằm trong khoảng từ 0 đến 359 độ
Cột E là kết quả sau khi kiểm tra và sắp xếp theo điều kiện 1
Điều kiện 1 là: Sắp xếp lại từ nhỏ tới lớn
Cột F là kết quả sau khi kiểm tra và sắp xếp theo điều kiện 2
Điều kiện 2 là: Sắp xếp lại với điều kiện so sánh
Nếu Azm nằm trong khoảng từ 300 đến 60 (300 310 320 330 340 350 0 10 20 30 40 50 60) 360 tức là 0 độ
Thì sẽ tìm giá trị nào nằm gần 0 nhất sẽ sắp xếp lên vị trí ID-1 (Ví dụ: so sánh 320 và 60 thì 320 là số gần 0 nhất)
Vị trí ID-2 và ID-3 sẽ sắp xếp 2 giá trị còn lại từ nhỏ tới lớn.
Chèn thêm sheet2 rồi chạy code dưới đây.
Mã:
Sub Sort()
Dim DArr
Dim Min, Max
Dim Azm, Rws
Dim Res
Dim i, j, k, x, z, t
DArr = Sheet1.Range("A2", Sheet1.Range("D2").End(xlDown))
Azm = Sheet1.Range("D2", Sheet1.Range("D2").End(xlDown))
k = UBound(DArr)
ReDim Res(1 To k, 1 To UBound(DArr, 2))
Min = DArr(k, 4)
Max = DArr(k, 4)
If DArr(k, 4) < 360 - DArr(k, 4) Then
    t = DArr(k, 4)
Else
    t = 360 - DArr(k, 4)
End If
ReDim Rws(1 To k, 1 To 1)
For i = 1 To k
    Rws(i, 1) = i
Next i
For i = 1 To k - 1
    If Min > DArr(i, 4) Then Min = DArr(i, 4)
    If Max < DArr(i, 4) Then Max = DArr(i, 4)
    If DArr(i, 4) < 360 - DArr(i, 4) Then
        If t > DArr(i, 4) Then
            t = DArr(i, 4)
            z = i
        End If
    Else
        If t > 360 - DArr(i, 4) Then
            t = 360 - DArr(i, 4)
            z = i
        End If
    End If
    For j = i + 1 To k
        If Azm(i, 1) > Azm(j, 1) Then
            x = Azm(i, 1)
            Azm(i, 1) = Azm(j, 1)
            Azm(j, 1) = x
            x = Rws(i, 1)
            Rws(i, 1) = Rws(j, 1)
            Rws(j, 1) = x
        End If
    Next j
Next i
t = UBound(DArr, 2)
If Min <= 60 And Max >= 300 Then
    For j = 1 To t
        Res(1, j) = DArr(z, j)
    Next j
    x = 1
    For i = 1 To k
        If Rws(i, 1) <> z Then
            x = x + 1
            For j = 1 To t
                Res(x, j) = DArr(Rws(i, 1), j)
            Next j
        End If
    Next i
Else
    For i = 1 To k
        For j = 1 To t
            Res(i, j) = DArr(Rws(i, 1), j)
        Next j
    Next i
End If
With Sheets("Sheet2")
    .UsedRange.Clear
    .Range("A2").Resize(k, t) = Res
    .UsedRange.Columns.AutoFit
End With
End Sub
 
Upvote 0
Dạ cảm ơn bác @CHAOQUAY ạ. Đoạn code này đã giải quyết được 90% vấn đề của điều kiện 2 rồi ạ. Tuy nhiên em cần sắp xếp và đặt lại ID nữa ạ.
Sắp xếp trước là 1-210; 2-320; 3-60 sau khi kiểm tra sẽ ra kết quả là 1-320; 2-60; 3-120.
Ngoài ra còn điều kiện 1 em cũng k biết làm ạ :(

IDAzmCorrect Azm (Type 1)Correct Azm (Type 2)
1​
210​
60​
320​
2​
320​
210​
60​
3​
60​
320​
210​
 
Upvote 0
Dạ cảm ơn bác @CHAOQUAY ạ. Đoạn code này đã giải quyết được 90% vấn đề của điều kiện 2 rồi ạ. Tuy nhiên em cần sắp xếp và đặt lại ID nữa ạ.
Sắp xếp trước là 1-210; 2-320; 3-60 sau khi kiểm tra sẽ ra kết quả là 1-320; 2-60; 3-120.
Ngoài ra còn điều kiện 1 em cũng k biết làm ạ :(

IDAzmCorrect Azm (Type 1)Correct Azm (Type 2)
1​
210​
60​
320​
2​
320​
210​
60​
3​
60​
320​
210​

Tức là sau khi sort thì thay đổi ID mới?
Bạn gửi file đính kèm lên cho dễ hiểu.

Kết quả muốn hiển thị thế nào?
 
Upvote 0
Đúng rồi ạ. Kết quả em muốn hiển thị ra trong 2 cột E hoặc F ạ.
Sửa ID không thành vấn đề.
Bạn làm 1 bảng kết quả cần hiển thị để sửa code 1 thể
Bài đã được tự động gộp:

Không hiểu hiển thị kết quả vào cột E, F là thế nào.
Chạy code này xem sao, có gì tính sau.
Mã:
Sub Sort_()
Dim DArr
Dim Min, Max
Dim Azm, Rws
Dim Res
Dim i, j, k, x, z, t
DArr = Sheet1.Range("A2", Sheet1.Range("D2").End(xlDown))
Azm = Sheet1.Range("D2", Sheet1.Range("D2").End(xlDown))
k = UBound(DArr)
ReDim Res(1 To k, 1 To UBound(DArr, 2))
Min = DArr(k, 4)
Max = DArr(k, 4)
If DArr(k, 4) < 360 - DArr(k, 4) Then
    t = DArr(k, 4)
Else
    t = 360 - DArr(k, 4)
End If
ReDim Rws(1 To k, 1 To 1)
For i = 1 To k
    Rws(i, 1) = i
Next i
For i = 1 To k - 1
    If Min > DArr(i, 4) Then Min = DArr(i, 4)
    If Max < DArr(i, 4) Then Max = DArr(i, 4)
    If DArr(i, 4) < 360 - DArr(i, 4) Then
        If t > DArr(i, 4) Then
            t = DArr(i, 4)
            z = i
        End If
    Else
        If t > 360 - DArr(i, 4) Then
            t = 360 - DArr(i, 4)
            z = i
        End If
    End If
    For j = i + 1 To k
        If Azm(i, 1) > Azm(j, 1) Then
            x = Azm(i, 1)
            Azm(i, 1) = Azm(j, 1)
            Azm(j, 1) = x
            x = Rws(i, 1)
            Rws(i, 1) = Rws(j, 1)
            Rws(j, 1) = x
        End If
    Next j
Next i
t = UBound(DArr, 2)
If Min <= 60 And Max >= 300 Then
    Res(1, 4) = DArr(z, 4)
    For j = 1 To t - 1
        Res(1, j) = Replace(DArr(z, j), z, 1)
    Next j
    x = 1
    For i = 1 To k
        If Rws(i, 1) <> z Then
            x = x + 1
            Res(x, 4) = DArr(Rws(i, 1), 4)
            For j = 1 To t - 1
                Res(x, j) = Replace(DArr(Rws(i, 1), j), Rws(i, 1), x)
            Next j
        End If
    Next i
Else
    For i = 1 To k
        Res(i, 4) = DArr(Rws(i, 1), 4)
        For j = 1 To t - 1
            Res(i, j) = Replace(DArr(Rws(i, 1), j), Rws(i, 1), i)
        Next j
    Next i
End If
With Sheets("Sheet2")
    .UsedRange.Clear
    .Range("A2").Resize(k, t) = Res
    .UsedRange.Columns.AutoFit
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Sửa ID không thành vấn đề.
Bạn làm 1 bảng kết quả cần hiển thị để sửa code 1 thể
Không thành vấn đề sao được? ID trên nguyên tắc là một mã số cố định. Tự căn bản, từ "identity" nó đã mang nghĩa "xác định".
Nếu thay đổi được thì là do chọn tên sai, phải là STT hay cái gì đó.
 
Upvote 0
Sửa ID không thành vấn đề.
Bạn làm 1 bảng kết quả cần hiển thị để sửa code 1 thể
Bài đã được tự động gộp:

Không hiểu hiển thị kết quả vào cột E, F là thế nào.
Chạy code này xem sao, có gì tính sau.
Mã:
Sub Sort_()
Dim DArr
Dim Min, Max
Dim Azm, Rws
Dim Res
Dim i, j, k, x, z, t
DArr = Sheet1.Range("A2", Sheet1.Range("D2").End(xlDown))
Azm = Sheet1.Range("D2", Sheet1.Range("D2").End(xlDown))
k = UBound(DArr)
ReDim Res(1 To k, 1 To UBound(DArr, 2))
Min = DArr(k, 4)
Max = DArr(k, 4)
If DArr(k, 4) < 360 - DArr(k, 4) Then
    t = DArr(k, 4)
Else
    t = 360 - DArr(k, 4)
End If
ReDim Rws(1 To k, 1 To 1)
For i = 1 To k
    Rws(i, 1) = i
Next i
For i = 1 To k - 1
    If Min > DArr(i, 4) Then Min = DArr(i, 4)
    If Max < DArr(i, 4) Then Max = DArr(i, 4)
    If DArr(i, 4) < 360 - DArr(i, 4) Then
        If t > DArr(i, 4) Then
            t = DArr(i, 4)
            z = i
        End If
    Else
        If t > 360 - DArr(i, 4) Then
            t = 360 - DArr(i, 4)
            z = i
        End If
    End If
    For j = i + 1 To k
        If Azm(i, 1) > Azm(j, 1) Then
            x = Azm(i, 1)
            Azm(i, 1) = Azm(j, 1)
            Azm(j, 1) = x
            x = Rws(i, 1)
            Rws(i, 1) = Rws(j, 1)
            Rws(j, 1) = x
        End If
    Next j
Next i
t = UBound(DArr, 2)
If Min <= 60 And Max >= 300 Then
    Res(1, 4) = DArr(z, 4)
    For j = 1 To t - 1
        Res(1, j) = Replace(DArr(z, j), z, 1)
    Next j
    x = 1
    For i = 1 To k
        If Rws(i, 1) <> z Then
            x = x + 1
            Res(x, 4) = DArr(Rws(i, 1), 4)
            For j = 1 To t - 1
                Res(x, j) = Replace(DArr(Rws(i, 1), j), Rws(i, 1), x)
            Next j
        End If
    Next i
Else
    For i = 1 To k
        Res(i, 4) = DArr(Rws(i, 1), 4)
        For j = 1 To t - 1
            Res(i, j) = Replace(DArr(Rws(i, 1), j), Rws(i, 1), i)
        Next j
    Next i
End If
With Sheets("Sheet2")
    .UsedRange.Clear
    .Range("A2").Resize(k, t) = Res
    .UsedRange.Columns.AutoFit
End With
End Sub
Dạ code này OK rồi đó ạ. Em cần hiển thị thêm kết quả vào cột F sheet "Azm" ạ.
Ngoài ra nhờ Bác thêm đoạn code sắp xếp góc từ nhỏ tới lớn nữa ạ, Kết quả hiển thị vào cột E sheet "Azm"
Em cảm ơn Bác nhiều!
 
Upvote 0
Dạ code này OK rồi đó ạ. Em cần hiển thị thêm kết quả vào cột F sheet "Azm" ạ.
Ngoài ra nhờ Bác thêm đoạn code sắp xếp góc từ nhỏ tới lớn nữa ạ, Kết quả hiển thị vào cột E sheet "Azm"
Em cảm ơn Bác nhiều!
Vậy các cột A, B, C, D thì thế nào, thay đổi thế nào cho phù hợp 2 cách sort?
Không thành vấn đề sao được? ID trên nguyên tắc là một mã số cố định. Tự căn bản, từ "identity" nó đã mang nghĩa "xác định".
Nếu thay đổi được thì là do chọn tên sai, phải là STT hay cái gì đó.
Hình như là thớt muốn thay đổi số liệu đầu vào bác ạ.
 
Upvote 0
Vậy các cột A, B, C, D thì thế nào, thay đổi thế nào cho phù hợp 2 cách sort?

Hình như là thớt muốn thay đổi số liệu đầu vào bác ạ.
Dạ A B C D sẽ vẫn giữ nguyên ạ, kiểm tra số liệu cột D xem đúng quy tắc đặt ra không ạ, kết quả đúng sẽ được đẩy vào cột E và F.
Nếu như code hiện tại thì em sẽ thêm bước Vlookup giá trị từ "sheet 2" vào "Azm" với tham chiếu là "Ha_Noi_1"
 
Upvote 0
Còn một vấn đề nữa là khi có 2 giá trị 60 và 300 thì code chạy báo lỗi ạ.
Ngoài ra Bác sửa giúp em hàm vlookup này với.
For i = 2 To Nbrow Cells(i, 5) = Application.WorksheetFunction.VLookup(Cells(i, 2), Sheets("Sheet2").Range("B:D"), 3, 0) Next i
Site​
Cell​
ID​
Azm​
Ha_Noi​
Ha_Noi_1​
1​
210​
Ha_Noi​
Ha_Noi_2​
2​
300​
Ha_Noi​
Ha_Noi_3​
3​
60​
 
Upvote 0
Dạ A B C D sẽ vẫn giữ nguyên ạ, kiểm tra số liệu cột D xem đúng quy tắc đặt ra không ạ, kết quả đúng sẽ được đẩy vào cột E và F.
Nếu như code hiện tại thì em sẽ thêm bước Vlookup giá trị từ "sheet 2" vào "Azm" với tham chiếu là "Ha_Noi_1"
Còn một vấn đề nữa là khi có 2 giá trị 60 và 300 thì code chạy báo lỗi ạ.
Ngoài ra Bác sửa giúp em hàm vlookup này với.
For i = 2 To Nbrow Cells(i, 5) = Application.WorksheetFunction.VLookup(Cells(i, 2), Sheets("Sheet2").Range("B:D"), 3, 0) Next i
Site​
Cell​
ID​
Azm​
Ha_Noi​
Ha_Noi_1​
1​
210​
Ha_Noi​
Ha_Noi_2​
2​
300​
Ha_Noi​
Ha_Noi_3​
3​
60​

Bạn làm vào 1 file nào đó rồi gửi lên. Đọc không hiểu gì hết
 
Upvote 0
Dạ em gửi file nhờ Bác xử lý giúp!
Code bài 6, thay các dấu ">"; "<" thành ">="; "<=" là hết lỗi

Theo bài 1, bạn có viết:
Nhờ các Thầy giúp bài này với ạ!
Dữ liệu có từ cột A -> D
Số liệu cần kiểm tra và sắp xếp ở cột D với giá trị nằm trong khoảng từ 0 đến 359 độ
Cột E là kết quả sau khi kiểm tra và sắp xếp theo điều kiện 1
Điều kiện 1 là: Sắp xếp lại từ nhỏ tới lớn
Cột F là kết quả sau khi kiểm tra và sắp xếp theo điều kiện 2
Điều kiện 2 là: Sắp xếp lại với điều kiện so sánh
Nếu Azm nằm trong khoảng từ 300 đến 60 (300 310 320 330 340 350 0 10 20 30 40 50 60) 360 tức là 0 độ
Thì sẽ tìm giá trị nào nằm gần 0 nhất sẽ sắp xếp lên vị trí ID-1 (Ví dụ: so sánh 320 và 60 thì 320 là số gần 0 nhất)
Vị trí ID-2 và ID-3 sẽ sắp xếp 2 giá trị còn lại từ nhỏ tới lớn.
Phần bôi đỏ tôi hiểu là: chỉ khi nào thỏa điều kiện thì mới sắp xếp, không thỏa thì không xếp --> 1 bảng số liệu chỉ có thể xếp theo cách 1 hoặc là 2.
2 đoạn code viết ở trên là theo cách hiểu này.

Có lẽ là không hiểu được ý của bạn, dừng tại đây.
Thân chào!
 
Upvote 0
Web KT

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

Back
Top Bottom