Tìm Max Value dựa vào Max Value đã lọc trước đó

Liên hệ QC

Thienanz

Thành viên mới
Tham gia
1/8/22
Bài viết
5
Được thích
0
- Chào các anh chị, Em tên Ân, Em đang làm kỹ sư kết cấu. Có 1 công việc lặp đi lặp lại trong việc tính toán là tìm Mmax, P tương ứng, V tương ứng ( 2 combo tổ hợp còn lại). Em tò mò bên VBA tính viết 1 đoạn code để lọc ra 3 tổ hợp đó tương ứng với các lực.
- Em có sơ đồ định hướng làm là như sau:
1/ Tìm vị trí cao nhất của thanh đó ( maxValue của dòng B)
2/ Lọc các Row có chứa các maxValue dựa vào hàm Range.Find
3/ Copy Row chứa maxValue vào Row phía sau Range dữ liệu ban đầu
4/ Lọc tiếp để tìm Mmax sau đó xuất các P tư, V tứ
-Thì tới đây, Em bị vướng vào bước số 3 cả tuần nay vì lỗi trên...Em có vào StackOverFlow đọc thử thì vẫn không hiểu được cốt lõi vẫn đề.
-Mong các Anh Chị có thể hướng dẫn cho Em.
P/s: EM CHƯA HỀ CÓ HỌC QUA KHOÁ CƠ BẢN VBA nào, đa số là toàn tự học trên mạng nên đôi khi kiến thức nền không vững. Mong các anh chị có thể hướng dẫn cho.
Em cảm ơn !!!
 

File đính kèm

  • VBACode.PNG
    VBACode.PNG
    63.1 KB · Đọc: 20
  • TESTVBA1.xlsx
    43.8 KB · Đọc: 15
Lần chỉnh sửa cuối:
- Chào các anh chị, Em tên Ân, Em đang làm kỹ sư kết cấu. Có 1 công việc lặp đi lặp lại trong việc tính toán là tìm Mmax, P tương ứng, V tương ứng ( 2 combo tổ hợp còn lại). Em tò mò bên VBA tính viết 1 đoạn code để lọc ra 3 tổ hợp đó tương ứng với các lực.
- Em có sơ đồ định hướng làm là như sau:
1/ Tìm vị trí cao nhất của thanh đó ( maxValue của dòng B)
2/ Lọc các Row có chứa các maxValue dựa vào hàm Range.Find
3/ Copy Row chứa maxValue vào Row phía sau Range dữ liệu ban đầu
4/ Lọc tiếp để tìm Mmax sau đó xuất các P tư, V tứ
-Thì tới đây, Em bị vướng vào bước số 3 cả tuần nay vì lỗi trên...Em có vào StackOverFlow đọc thử thì vẫn không hiểu được cốt lõi vẫn đề.
-Mong các Anh Chị có thể hướng dẫn cho Em.
P/s: EM CHƯA HỀ CÓ HỌC QUA KHOÁ CƠ BẢN VBA nào, đa số là toàn tự học trên mạng nên đôi khi kiến thức nền không vững. Mong các anh chị có thể hướng dẫn cho.
Em cảm ơn !!!
Này anh đang làm kỹ sư ơi, anh chịu khó đọc Nội quy diễn đàn và sửa tiêu đề cho phù hợp đã nhé.
 
Upvote 0
Dạ, cảm ơn Anh đã nhắc. Em đã sửa tiêu đề lại bài viết
Thường là nếu làm sai mà tung cái sai lên thì người ta sẽ nhìn thấy sai chỗ nào, tại sao sai, và cách sửa sai. Còn cái kiểu vu vơ "em gặp bạn gái, nói như trong phim người ta từng nói, cử chỉ như trong phim người ta từng làm, mà em lại bị ăn tát" thì chỉ đợi người giỏi đoán mò thôi. Mà thánh đoán mò cũng bó tay.
 
Upvote 0
Thường là nếu làm sai mà tung cái sai lên thì người ta sẽ nhìn thấy sai chỗ nào, tại sao sai, và cách sửa sai. Còn cái kiểu vu vơ "em gặp bạn gái, nói như trong phim người ta từng nói, cử chỉ như trong phim người ta từng làm, mà em lại bị ăn tát" thì chỉ đợi người giỏi đoán mò thôi. Mà thánh đoán mò cũng bó tay.
Em hơi hấp tấp, Em có đính kèm file lên mà k đọc là file xltm k được phép up lên :(((
Bài đã được tự động gộp:

Thường là nếu làm sai mà tung cái sai lên thì người ta sẽ nhìn thấy sai chỗ nào, tại sao sai, và cách sửa sai. Còn cái kiểu vu vơ "em gặp bạn gái, nói như trong phim người ta từng nói, cử chỉ như trong phim người ta từng làm, mà em lại bị ăn tát" thì chỉ đợi người giỏi đoán mò thôi. Mà thánh đoán mò cũng bó tay.
Em chưa biết cách up code lên như nào nên Em chỉ có thể screenshot code + file xlsx lên. Mong được anh hướng dẫn !!!
 
Lần chỉnh sửa cuối:
Upvote 0
Em hơi hấp tấp, Em có đính kèm file lên mà k đọc là file xltm k được phép up lên

Em chưa biết cách up code lên như nào nên Em chỉ có thể screenshot code + file xlsx lên. Mong được anh hướng dẫn !!!
1. Lần sau tập tin có code hãy lưu ở dạng XLSM, và đính kèm XLSM.

2. Hãy tung code lên GPE ở dạng TEXT. Đính kèm ở dạng ảnh mà tôi muốn chạy thử thì bó tay rồi. Chả ai nhìn ảnh để gõ lại một rừng code đâu.

Lần này tôi bỏ qua nhưng không có lần 2 đâu.

3. FindNext là sự tiếp tục của Find và cùng gọi cho một RANGE. Tức nếu có <Ngay mai em di>.Find thì cũng phải có <Ngay mai em di>.FindNext chứ không thể là <Bien nho ten em goi ve>.FindNext

Không thể ở trên là Sheets("Element ...").Columns(...).Find

mà ở dưới lại là

Selection.FindNext

4. Những việc cần làm không cần dùng SELECT. Mà dùng SELECT 2 dòng liên tiếp thì SELECT thứ 1 là thừa, là vô nghĩa.

5. Không phải là searchReult = ...FindNext(...) mà phải là Set searchReult = ...FindNext(...)

Vân vân và mây mây.

Thử code sau nhé. Và chú ý xem cái gì là <Ngay mai em di>.

Lưu ý là searchResult.Parent sẽ trả về ThisWorkbook.Worksheets("Element Forces - Frames") - searchResult là Range trên ThisWorkbook.Worksheets("Element Forces - Frames") nên PARENT của nó là ThisWorkbook.Worksheets("Element Forces - Frames") thôi, chả có gì là bí hiểm cả.

Mã:
Sub max_min()
Dim searchArea As Range
Dim searchResult As Range
Dim maxValue As Double
Dim lastRow As Long
Dim FirstAddress As String
    With ThisWorkbook.Worksheets("Element Forces - Frames")
        lastRow = .Range("B" & Rows.Count).End(xlUp).Row
        If lastRow < 4 Then Exit Sub    ' khong co du lieu thi don do choi
        Set searchArea = .Range(Cells(4, "B"), Cells(lastRow, "B")) ' vung can tim kiem
    End With
    maxValue = Application.WorksheetFunction.Max(searchArea)    ' gia tri can tim
    Set searchResult = searchArea.Find(maxValue, , xlValues, xlWhole, xlByRows, xlNext, False, False)
 
    If Not searchResult Is Nothing Then
        lastRow = lastRow + 2
        FirstAddress = searchResult.Address
        Do
            searchResult.Parent.Range("A" & lastRow).Resize(1, 12).Value = searchResult.Offset(0, -1).Resize(1, 12).Value
            Set searchResult = searchArea.FindNext(searchResult)
            lastRow = lastRow + 1
        Loop While FirstAddress <> searchResult.Address
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
1. Lần sau tập tin có code hãy lưu ở dạng XLSM, và đính kèm XLSM.

2. Hãy tung code lên GPE ở dạng TEXT. Đính kèm ở dạng ảnh mà tôi muốn chạy thử thì bó tay rồi. Chả ai nhìn ảnh để gõ lại một rừng code đâu.

Lần này tôi bỏ qua nhưng không có lần 2 đâu.

3. FindNext là sự tiếp tục của Find và cùng gọi cho một RANGE. Tức nếu có <Ngay mai em di>.Find thì cũng phải có <Ngay mai em di>.FindNext chứ không thể là <Bien nho ten em goi ve>.FindNext

Không thể ở trên là Sheets("Element ...").Columns(...).Find

mà ở dưới lại là

Selection.FindNext

4. Những việc cần làm không cần dùng SELECT. Mà dùng SELECT 2 dòng liên tiếp thì SELECT thứ 1 là thừa, là vô nghĩa.

5. Không phải là searchReult = ...FindNext(...) mà phải là Set searchReult = ...FindNext(...)

Vân vân và mây mây.

Thử code sau nhé. Và chú ý xem cái gì là <Ngay mai em di>.

Lưu ý là searchResult.Parent sẽ trả về ThisWorkbook.Worksheets("Element Forces - Frames") - searchResult là Range trên ThisWorkbook.Worksheets("Element Forces - Frames") nên PARENT của nó là ThisWorkbook.Worksheets("Element Forces - Frames") thôi, chả có gì là bí hiểm cả.

Mã:
Sub max_min()
Dim searchArea As Range
Dim searchResult As Range
Dim maxValue As Double
Dim lastRow As Long
Dim FirstAddress As String
    With ThisWorkbook.Worksheets("Element Forces - Frames")
        lastRow = .Range("B" & Rows.Count).End(xlUp).Row
        If lastRow < 4 Then Exit Sub    ' khong co du lieu thi don do choi
        Set searchArea = .Range(Cells(4, "B"), Cells(lastRow, "B")) ' vung can tim kiem
    End With
    maxValue = Application.WorksheetFunction.Max(searchArea)    ' gia tri can tim
    Set searchResult = searchArea.Find(maxValue, , xlValues, xlWhole, xlByRows, xlNext, False, False)
 
    If Not searchResult Is Nothing Then
        lastRow = lastRow + 2
        FirstAddress = searchResult.Address
        Do
            searchResult.Parent.Range("A" & lastRow).Resize(1, 12).Value = searchResult.Offset(0, -1).Resize(1, 12).Value
            Set searchResult = searchArea.FindNext(searchResult)
            lastRow = lastRow + 1
        Loop While FirstAddress <> searchResult.Address
    End If
End Sub
Dạ, Em cảm ơn Anh đã hướng dẫn, Em sẽ thử lại code ^^!
 
Upvote 0
Thấy bạn cũng ham học hỏi nên mình giới thiệu thêm cách dùng Sort cho bạn tham khảo thêm:
PHP:
Sub max_min()
Dim lr&, maxV As Double, count&, rng
Application.ScreenUpdating = False
lr = Cells(Rows.count, "B").End(xlUp).Row
rng = Range("A4:L" & lr).Value ' luu tam gia tri vung goc vao array
Range("A4:L" & lr).Sort key1:=Range("B3"), order1:=xlDescending ' sort cot B theo thu tu Z-A
With WorksheetFunction
    maxV = .Max(Range("B4:B" & lr)) ' gia tri lon nhat
    count = .CountIf(Range("B4:B" & lr), maxV) ' dem gia tri lon nhat
    Range("A4").Resize(count, 12).Copy Range("A" & lr + 2) ' copy cac dong co gia tri lon nhat. Neu muon paste vao dong ke tiep thi dung: lr+1
    Range("A4:L" & lr).Value = rng ' phuc hoi lai vung goc
End With
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Thấy bạn cũng ham học hỏi nên mình giới thiệu thêm cách dùng Sort cho bạn tham khảo thêm:
PHP:
Sub max_min()
Dim lr&, maxV As Double, count&, rng
Application.ScreenUpdating = False
lr = Cells(Rows.count, "B").End(xlUp).Row
rng = Range("A4:L" & lr).Value ' luu tam gia tri vung goc vao array
Range("A4:L" & lr).Sort key1:=Range("B3"), order1:=xlDescending ' sort cot B theo thu tu Z-A
With WorksheetFunction
    maxV = .Max(Range("B4:B" & lr)) ' gia tri lon nhat
    count = .CountIf(Range("B4:B" & lr), maxV) ' dem gia tri lon nhat
    Range("A4").Resize(count, 12).Copy Range("A" & lr + 2) ' copy cac dong co gia tri lon nhat. Neu muon paste vao dong ke tiep thi dung: lr+1
    Range("A4:L" & lr).Value = rng ' phuc hoi lai vung goc
End With
Application.ScreenUpdating = True
End Sub
Em cảm ơn Anh đã đưa ra 1 option khác cho Em
 
Upvote 0
Web KT

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

Back
Top Bottom