sắp xếp dữ liệu theo thứ tự tăng dần và đánh số thứ tự

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

Trantu0106

Thành viên mới
Tham gia
13/10/23
Bài viết
21
Được thích
0
Giới tính
Nam
Em có 1 bảng tập hợp giá cả của các sản phẩm như file đính kèm
em muốn viết code vba , hoăc hàm để so sánh giá giữa các công ty và sắp xếp theo thứ tự
giá thấp nhất thì tại ô vị trí sẽ điền giá trị 1 , thấp thứ 2 điền 2 vào ô vị trí ah,
rùi tính tỉ lệ so với giá thấp nhất
mong các A/ C giúp đỡ ah
 

File đính kèm

  • TEST.xlsx
    9.7 KB · Đọc: 14
Em có 1 bảng tập hợp giá cả của các sản phẩm như file đính kèm
em muốn viết code vba , hoăc hàm để so sánh giá giữa các công ty và sắp xếp theo thứ tự
giá thấp nhất thì tại ô vị trí sẽ điền giá trị 1 , thấp thứ 2 điền 2 vào ô vị trí ah,
rùi tính tỉ lệ so với giá thấp nhất
mong các A/ C giúp đỡ ah
Code thì mình không biết, hàm thì có thể dùng hàm RANK.

=RANK(B5,$B$5:$B$7,1)
 
Em có 1 bảng tập hợp giá cả của các sản phẩm như file đính kèm
em muốn viết code vba , hoăc hàm để so sánh giá giữa các công ty và sắp xếp theo thứ tự
giá thấp nhất thì tại ô vị trí sẽ điền giá trị 1 , thấp thứ 2 điền 2 vào ô vị trí ah,
rùi tính tỉ lệ so với giá thấp nhất
mong các A/ C giúp đỡ ah
Trong khi chờ đợi các giải pháp khác, Thử code này xem sao.
Mã:
Option Explicit

Sub Gia()
Dim i&, j&, Lr&, Zmin&, Col&
Dim Rng As Range
With Sheet1
    Lr = .Cells(100000, 1).End(3).Row
    Col = .Cells(4, 10000).End(xlToLeft).Column
    For i = 5 To Lr
        For j = 2 To Col Step 3
            .Range(.Cells(i, j + 1), .Cells(i, j + 2)).ClearContents
        Next j
        Set Rng = Nothing
            For j = 2 To Col
                If .Cells(i, j) <> Empty Then If Rng Is Nothing Then Set Rng = .Cells(i, j) Else Set Rng = Union(Rng, .Cells(i, j))
            Next j
        Zmin = Application.Min(Rng)
            For j = 2 To Col Step 3
               .Cells(i, j + 1) = .Cells(i, j) / Zmin
               .Cells(i, j + 2) = Application.Rank(.Cells(i, j), Rng, 1)
            Next
    Next
End With
Set Rng = Nothing
MsgBox "Done"
End Sub
Xem file, nhấn vào mặt cười để xem và kiểm tra kết quả.
 

File đính kèm

  • TranTu0106.xlsm
    18.3 KB · Đọc: 10
cảm ơn bạn
hàm rank có thể dùng theo hàng dc ko bạn
mình muốn chọn giá trị tham chiếu là các B5,E5,H5,K5 mà bị báo hàm lỗi ah

Hàm RANK không cho tham chiếu cách khoảng, bạn có thể dùng công thức này trong D5:

=COUNTIFS($B$4:$K$4,"Giá",$B5:$K5,"<"&B5)+1

Copy ô có công thức này, dán cho các ô còn lại.
 
Trong khi chờ đợi các giải pháp khác, Thử code này xem sao.
Mã:
Option Explicit

Sub Gia()
Dim i&, j&, Lr&, Zmin&, Col&
Dim Rng As Range
With Sheet1
    Lr = .Cells(100000, 1).End(3).Row
    Col = .Cells(4, 10000).End(xlToLeft).Column
    For i = 5 To Lr
        For j = 2 To Col Step 3
            .Range(.Cells(i, j + 1), .Cells(i, j + 2)).ClearContents
        Next j
        Set Rng = Nothing
            For j = 2 To Col
                If .Cells(i, j) <> Empty Then If Rng Is Nothing Then Set Rng = .Cells(i, j) Else Set Rng = Union(Rng, .Cells(i, j))
            Next j
        Zmin = Application.Min(Rng)
            For j = 2 To Col Step 3
               .Cells(i, j + 1) = .Cells(i, j) / Zmin
               .Cells(i, j + 2) = Application.Rank(.Cells(i, j), Rng, 1)
            Next
    Next
End With
Set Rng = Nothing
MsgBox "Done"
End Sub
Xem file, nhấn vào mặt cười để xem và kiểm tra kết quả.
Em check kết quả ok rùi ah. thank Bác
cho em hỏi cái đoạn code này có ý nghĩa gì thế ah

Set Rng = Nothing
For j = 2 To Col
If .Cells(i, j) <> Empty Then If Rng Is Nothing Then Set Rng = .Cells(i, j) Else Set Rng = Union(Rng, .Cells(i, j))
Next j
 
Em check kết quả ok rùi ah. thank Bác
cho em hỏi cái đoạn code này có ý nghĩa gì thế ah

1 Set Rng = Nothing
2 For j = 2 To Col
3 If .Cells(i, j) <> Empty Then If Rng Is Nothing Then Set Rng = .Cells(i, j) Else Set Rng = Union(Rng, .Cells(i, j))
4 Next j

Nôm na theo ý hiểu của tôi thì là:
Dòng 1 : để làm rỗng Đối tượng Rng trước khi chạy vòng lặp mới.
Dòng 2: Vòng lặp for ...to
Dòng 3: Xét điều kiện là Nếu các Cell (i,j) (các ô trong dòng đang xét có giá trị thì đưa các ô đó vào 1 Đối tượng (Rng) Như kiểu Ctrl+chọn ô.
Tại sao lại đưa các ô ấy vào 1 tập hợp các ô? Là để khi dùng hàm Min và Rank không sai khi thêm kết quả được lấy từ vòng lặp dưới đây gán luôn vào Sheet
For j = 2 To Col Step 3
.Cells(i, j + 1) = .Cells(i, j) / Zmin
.Cells(i, j + 2) = Application.Rank(.Cells(i, j), Rng, 1)
Next
Bạn có thể nhấn F8 để code chạy từng dòng và xem kết quả là gì?
 
em cũng thử chạy F8 rùi mà chưa hiểu rõ lắm ý đồ của Bác nên em hỏi thêm ah
Em cảm ơn nhiều ah
 
em cũng thử chạy F8 rùi mà chưa hiểu rõ lắm ý đồ của Bác nên em hỏi thêm ah
Em cảm ơn nhiều ah
Bạn làm bằng VBA thì chỉ cần "nhấn nút một phát" là có kết quả rồi, kể cả dữ liệu nhiều data. Tuy nhiên nó không cập nhật ngay tức thời như khi dùng hàm mà phải nhấn nút mới có kết quả
 
Bạn làm bằng VBA thì chỉ cần "nhấn nút một phát" là có kết quả rồi, kể cả dữ liệu nhiều data. Tuy nhiên nó không cập nhật ngay tức thời như khi dùng hàm mà phải nhấn nút mới có kết quả
dạ.Em định dùng code của Bác và gắn sự kiện thay đổi để tự động cập nhật ah .
em đang lo lắng khi data nhiều thì tự động cập nhật sẽ mất time ah . nên tùy theo data sẽ dùng hàm hay dùng code ah
thanks Bác
 
dạ.Em định dùng code của Bác và gắn sự kiện thay đổi để tự động cập nhật ah .
em đang lo lắng khi data nhiều thì tự động cập nhật sẽ mất time ah . nên tùy theo data sẽ dùng hàm hay dùng code ah
thanks Bác
Bài này thì tôi chưa thử nhưng thường thì Data mà có số khủng trên 100000 data thì dùng hàm sẽ thấy "quay tròn, quay tròn đều, quay hoài những vòng quay", dung lượng file tăng đột biến,....
 
Web KT

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

Back
Top Bottom