Lọc với 3 tiêu chí, 1 trong đó là giá trị cục đại của 1 tiêu chí [Đưa bài giúp bạn]

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

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,585
Được thích
22,909
Nghề nghiệp
U80
Có một vùng dữ liệu như bảng dưới đây.
Anh chị viết dùm đoạn code để lọc dữ liệu theo cột [Beam], [Load] & giá trị cựa đại của [Beam] & [Load] đó
và chuyển kết quả lọc được sang khác.
Ví dụ như trong file từ J2 - J16. ứng với các trường hợp TT. em chỉ muốn lấy giá trị ở hai đầu J2,J16 còn giữa J2 và J16 thì em muốn lấy giá trị lớn nhất có thể âm hoặc dương. Tiếp tục như vậy với các trường hợp HT. sau đó xuất sang vùng mới. Em xin cảm ơn mấy anh chị trước ạ.
Mã:
  A      B    C          J
Story |Beam|Load|. . . | [B][COLOR=#ff0000]M3[/COLOR][/B]|
 T02  | B08| TT |. . . |-4.3| 
  . . |. . |    |. . . | . . . 
 T02  | B08| TT |. . . | [B]5.3[/B]| 
  . . |. . |    |. . . | . . . 
 T02  | B08| TT |. . . | 0.3|

Các bạn có thể xem file tại: http://www.giaiphapexcel.com/forum/showthread.php?114297-Dạ-một-lần-nữa-phiền-mấy-anh-chị[TABLE="width: 54"]
[TR]
[TD="width: 72, bgcolor: transparent"][/TD]
[/TR]
[/TABLE]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Khổ với bạn luôn!

Dạ em đã nạp thêm được dữ liệu vào ô beam nhưng khi lọc thì nó ra tùm lum hết. :. Mấy anh chị coi dùm em với

Thứ nhất: Trong Name 'Beam' bạn chỉ nên để 3 trị duy nhất có ở cột [B:B] mà thôi;
Lúc đó sẽ được mỗi món 3 dòng; Nhưng ở cột Story giờ khác trước, bạn có 2 loại Story trở lên thì không thể giữ cách lọc như vậy được nữa; Mà cần viết macro khác & lúc đó coi như lọc theo 4 tiêu chí. (Macro đã có chỉ lọc được 3 tiêu chí mà thôi)
 
Upvote 0
Ôi cảm thấy như lạc giữa rừng excel.:(

Mình có nhận xét rằng bạn chưa có cơ bản vững về excel, thể hiện ở fương thức AdvancedFilter;

Bạn nên dành thời gian còn lại của ngày hôm nay & trui rèn fương thức này đi. Chỉ sau đó chúng ta mới nói chuyện tiếp!

Chúc thành công!

 
Upvote 0
Em đã set lại dữ liệu của từ vùng AB1 đến AB2 sau đó chạy macro thì báo lỗi như trong hình. Theo như chị HYEN17 nói là tìm hiểu về AdvancedFilter, đó là lọc dữ liệu với nhiều điều kiện. Vậy thì nếu như lọc thêm điều kiện tầng nữa thì mình sẽ vào khai báo trong code như thế nào vậy chị.
 
Upvote 0
áp dụng đoạn code hôm bữa anh chị giúp em. Nhưng em muốn thêm điều kiện sau khi lọc thì được 3 dòng dữ liệu như em tô đỏ trong file đính kèm. đó là giá trị đầu và cuối của trường hợp TT và giá trị lớn nhất nằm trong đoạn AB3 tới AB8 ứng với tiết diện nào thì mình sẽ giống qua các trường hợp HT GX1 GX2 GY1 GY2.
 

File đính kèm

Upvote 0
áp dụng đoạn code hôm bữa anh chị giúp em. Nhưng em muốn thêm điều kiện sau khi lọc thì được 3 dòng dữ liệu như em tô đỏ trong file đính kèm. đó là giá trị đầu và cuối của trường hợp TT và giá trị lớn nhất nằm trong đoạn AB3 tới AB8 ứng với tiết diện nào thì mình sẽ giống qua các trường hợp HT GX1 GX2 GY1 GY2.

Public Sub Gpe_Gpe()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, Num As Double, eRws As Long, iRws As Long, Tem As String
sArr = Range("Y2", Range("Y2").End(xlDown)).Resize(, 9).Value
ReDim dArr(1 To UBound(sArr), 1 To 9)
Tem = sArr(1, 1) & sArr(1, 2): Num = sArr(2, 4)
For I = 2 To UBound(sArr)
If sArr(I, 1) & sArr(I, 2) = Tem Then
If sArr(I, 4) > Num Then iRws = I - 1
If sArr(I + 1, 1) & sArr(I + 1, 2) <> Tem Then
eRws = I
Exit For
End If
End If
Next I
For I = 1 To UBound(sArr) Step eRws
K = K + 1
For J = 1 To 9
dArr(K, J) = sArr(I, J)
dArr(K + 1, J) = sArr(I + iRws, J)
dArr(K + 2, J) = sArr(I + eRws - 1, J)
Next J
K = K + 2
Next I
Range("AK2").Resize(K, 9) = dArr
End Sub
Híc! Không theo dõi thừ đầu, hình như "Hổng hiểu gì hết".
-------------------------
Chắc phải như vầy mới lấy được TT lớn nhất ở giữa.
PHP:
Public Sub Gpe_Gpe()
Dim sArr(), dArr(), I As Long, J As Long, N As Long, K As Long, Num As Double, eRws As Long, iRws As Long, Tem As String
sArr = Range("Y2", Range("Y2").End(xlDown)).Resize(, 9).Value
ReDim dArr(1 To UBound(sArr), 1 To 9)
Tem = sArr(1, 1) & sArr(1, 2)
For I = 2 To UBound(sArr)
    If sArr(I, 1) & sArr(I, 2) = Tem Then
        If sArr(I + 1, 1) & sArr(I + 1, 2) <> Tem Then
            eRws = I - 1
            Exit For
        End If
    End If
Next I
For I = 1 To UBound(sArr) Step eRws + 1
    K = K + 1: Num = sArr(I + 1, 4)
    For J = 1 To 9
        dArr(K, J) = sArr(I, J)
        dArr(K + 1, J) = sArr(I + 1, J)
        dArr(K + 2, J) = sArr(I + eRws, J)
    Next J
    For N = I + 1 To I + eRws - 1
        If sArr(N, 4) > Num Then
            For J = 1 To 9
                dArr(K + 1, J) = sArr(N, J)
            Next J
            Num = sArr(N, 4)
        End If
    Next N
    K = K + 2
Next I
Range("AK2").Resize(K, 9) = dArr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Kết quả như em ghi trong file đính kèm. có nghĩa là sau khi chuyển nội lực M3 nó sẽ lấy giá trị M3 trường hợp đầu và cuối của TT ở giữa thì lấy max. Ví dự như TT của beam 1 story 1 giá trị đầu và cuối là -0.562 và -1.099 còn giá trị giữa là 1.048 ứng với tại vị trí loc 0.15; 0.2 và 3.85. tiếp tục như vậy cho đến hết bảng dữ liệu luôn.:(
 

File đính kèm

Upvote 0
Bắc chước thầy giáo Ba Tê làm Aray cái xem sao

PHP:
Option Explicit
Sub ThuLamArrayXemSao()
 Dim Rws As Long, J As Long, W As Long, Col As Byte, Max_ As Double
 Dim Arr(), CSDL As Range
 Dim Tmp As String
 
 Sheets("Noi Luc Dam T.m").Select
 Set CSDL = [b2].CurrentRegion.Offset(1)
 Rws = CSDL.Rows.Count
 Arr = CSDL.Value
 ReDim dArr(1 To Rws, 1 To 10)
 For J = 1 To UBound(Arr())
    If Tmp <> Arr(J, 1) & Arr(J, 2) & Arr(J, 3) Then
        W = W + 1
        For Col = 1 To 10
            dArr(W, Col) = Arr(J, Col)
        Next Col
        Tmp = Arr(J, 1) & Arr(J, 2) & Arr(J, 3)
        Max_ = Arr(J, 10)
    Else
        If Arr(J, 10) > Max_ Then
            For Col = 1 To 10
                dArr(W + 1, Col) = Arr(J, Col)
            Next Col
            Max_ = Arr(J, 10)
        End If
        
        If Arr(J + 1, 1) & Arr(J + 1, 2) & Arr(J + 1, 3) <> Tmp Then
            W = W + 2
            For Col = 1 To 10
                dArr(W, Col) = Arr(J, Col)
            Next Col
            Max_ = -10 ^ 9
        End If
        If Arr(J + 1, 1) & Arr(J + 1, 2) & Arr(J + 1, 3) = "" Then Exit For
    End If
 Next J
 [p2].Resize(W, 10).Value = dArr()
End Sub
 

File đính kèm

Upvote 0
Chị HYEN17 làm đúng em rồi. Nhưng ở dưới một sô dòng của GX1 VÀ GY1 nó bị mất vậy chị và chỉ cho e cách săp xêp thành cột mà không phải dòng được không chị.
 
Upvote 0
(3) Chị HYEN17 làm đúng em rồi. (1)Nhưng ở dưới một sô dòng của GX1 VÀ GY1 nó bị mất vậy chị và (2) chỉ cho e cách săp xêp thành cột mà không phải dòng được không chị.

(1) Một số dòng trống xen kẻ đó là do cực đại M3 đã trùng với dòng trên nó;
Để trống như vậy để bạn dễ fát hiện; Còn muốn chép dòng đó vô luôn cũng được thôi; Nhưng chưa fải bây giờ

(2) Chưa hiểu bạn muốn gì, iêu cầu làm gì luôn?!?

(3) Không fải chị đâu; Ông nội đó!
 
Upvote 0
Dạ em muốn xếp thành hàng dọc như trong file đó ạ. còn lọc thì mình sẽ lọc như sau. tại TT lấy vị trí đầu và cuối sau đó lấy lớn nhất ở giữa nằm trong đoạn trong TT có thể dương lớn nhất hoặc âm lớn nhất. sau đó mình giống qua cột loc coi nó ở vị trí nào mình sẽ lấy tiếp cho các trường hợp HT GX1,GX2,GY1,GY2.chớ không lấy max theo HT... mà mình lấy theo trường hợp của tĩnh tải để giống xuống.
 
Upvote 0
Fát ngán với cách diễn đạt của bạn mất rồi!

Dạ em muốn xếp thành hàng dọc như trong file đó ạ.
File đó là file nào, ở bài số bao nhiêu?

còn lọc thì mình sẽ lọc như sau. tại TT lấy vị trí đầu và cuối sau đó lấy lớn nhất ở giữa nằm trong đoạn trong TT có thể dương lớn nhất hoặc âm lớn nhất.
Từ trước đến giờ toàn là lọc lấy trị lớn nhất trong khoảng; Giờ thì lấy lớn nhất cũng được mà nhỏ nhất cũng xong là sao? F ải dứt khoát cho xong 1 cái/thứ đã, mới chuyển sang cái thứ 2;

sau đó mình giống qua cột loc coi nó ở vị trí nào mình sẽ lấy tiếp cho các trường hợp HT GX1,GX2,GY1,GY2.chớ không lấy max theo HT... mà mình lấy theo trường hợp của tĩnh tải để giống xuống.
Bạn fải cụ thể địa chỉ vào mới xong; Rằng nó ở hàng nào cột nào; gióng qua hàng cột nào, được kết quả bao nhiêu,. . .
Cứ nói khơi khơi vậy thì tự bạn làm đi!
Tạm biệt & không mong ngày gặp lại!!
 
Upvote 0
Dạ em xin lỗi vì đã không trình bày rõ yêu cầu của anh chị. Em muốn kết quả sau khi lọc là lấy kết quả đầu và cuối và giữa của các trường hợp TT HT GX1 GX2 GY1 GY2. ví dụ như trong file em gởi lên. Dầm b8 story 2 vị trí đầu là tại loc 0.15 vị trí cuối là loc 5.25 vị trí giữa là loc 2.7. Có nghĩa là mình lọc theo tên dầm tên tầng và vị trí đầu giữa cuối ạ.
 

File đính kèm

Upvote 0
bài bị drop ở đây rồi hả mấy anh chị :(
 
Upvote 0
bài bị drop ở đây rồi hả mấy anh chị :(

Có lẽ là vậy.
Lúc thì lấy theo M3 lớn nhất, lúc lại M3 lớn nhất dù âm hay dương, lúc thì thì lấy giữa mà chẳng biết giữa là sao?
Ví dụ bạn cho 2.7 là giữa, tức là từ trên xuống cứ gặp 2.7 thì lấy?
Có nhóm 11 dòng, có nhóm 9 dòng, có nhóm 5,6,7 dòng thì sao? hay là giữa tức là 11 dòng lấy dòng giữa là dòng 6, 9 dòng lấy giữa là dòng 5?.............Lỡ có 6 dòng thì lấy dòng nào. Híc! Hiểu được từ "giữa" sao quá khó.
Tôi có theo dõi từ đầu nhưng yêu cầu thay đổi "chóng mặt" quá, giải thích thì không rõ ràng...
Bài tương tự như bài này trên GPE này có nhiều, bạn tìm xem có bài nào phù hợp không.
 
Upvote 0
Macro của bạn đây & . . .

PHP:
Option Explicit
Sub LayDongGiua()
 Dim Rng As Range, Arr(), WF As Object
 Dim Rws As Long, J As Long, W As Long, SoDg, Cot
 Dim BLd As String
 Set Rng = [B2].CurrentRegion
 Arr = Rng.Offset(1).Value:         [AB1:AC2].Clear
 Set WF = Application.WorksheetFunction
 [N2].CurrentRegion.Offset(1).ClearContents
 ReDim dArr(1 To UBound(Arr()), 1 To 10)
 [AB1].Value = [b1].Value:          [AC1].Value = [C1].Value
' On Error Resume Next  '
 For J = 1 To UBound(Arr())
    If Arr(J, 1) = "" Then Exit For
    If Arr(J, 2) & Arr(J, 3) <> BLd Then
        BLd = Arr(J, 2) & Arr(J, 3)
        [Ab2].Value = Arr(J, 2):    [AC2].Value = Arr(J, 3)
        SoDg = WF.DCount(Rng, [D1], [AB1:AC2])
        W = W + 1
        For Cot = 1 To 10
            dArr(W, Cot) = Arr(J, Cot)
            dArr(W + 1, Cot) = Arr(J + SoDg \ 2, Cot)
        Next Cot
    Else
        If Arr(J + 1, 2) & Arr(J + 1, 3) <> BLd Then
            W = W + 2
            For Cot = 1 To 10
                dArr(W, Cot) = Arr(J, Cot)
            Next Cot
        End If
    End If
 Next J
 If W Then
    [N2].Resize(W, 10).Value = dArr()
 End If
End Sub

Xin lưu í là trị chứa trong ô [W14] của bạn đang bị chép sai.
 
Upvote 0
anh chi oi lam sao tai file dinh kem len duoc vay .sao e khong tai duoc vay..em muon nho moi nguoi giup dum e ti
 
Upvote 0
Web KT

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

Back
Top Bottom