Xin giúp đỡ viết mã vba để lọc dữ liệu! (6 người xem)

Liên hệ QC

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

ngoctan_q

Thành viên chính thức
Tham gia
15/8/07
Bài viết
52
Được thích
17
Em ko thể nào làm cho dữ liệu được lọc 1 cách tự động được? mong các bác chỉ giáo vì khi lọc có nhiều điều kiện để có thể lấy giá trị cần tìm? Em xin chân thành cảm ơn!
 

File đính kèm

Em ko thể nào làm cho dữ liệu được lọc 1 cách tự động được? mong các bác chỉ giáo vì khi lọc có nhiều điều kiện để có thể lấy giá trị cần tìm? Em xin chân thành cảm ơn!
Đoạn này:
PHP:
If Abs(Sheets(1).Cells(3 + i + k, 4)) > Abs(Pmax) Then
  Pmax = Sheets(1).Cells(3 + i + k, 4)
End If
bạn thay bằng:
PHP:
If Abs(Sheets(1).Cells(3 + i + k, 4)) > Abs(Pmax) Then
  Pmax = Sheets(1).Cells(3 + i + k, 4)
  V2tu = Sheets(1).Cells(3 + i + k, 5)
  M3tu = Sheets(1).Cells(3 + i + k, 6)
End If
và đoạn này:
PHP:
    Loop
       Sheets(1).Cells(3 + i, 7) = Pmax
       i = i + k
 Loop
Bạn thay bằng:
PHP:
   Loop
      Sheets(1).Cells(3 + i, 7) = Pmax
      Sheets(1).Cells(3 + i, 8) = V2tu
      Sheets(1).Cells(3 + i, 9) = M3tu
      i = i + k
Loop
Tuy nhiên tôi vẫn cảm thấy code trên cần phải cải tiến thêm ---> Chỉ có mổi việc tìm MAX mà dài dòng quá
 
Đoạn này:
PHP:
If Abs(Sheets(1).Cells(3 + i + k, 4)) > Abs(Pmax) Then
  Pmax = Sheets(1).Cells(3 + i + k, 4)
End If
bạn thay bằng:
PHP:
If Abs(Sheets(1).Cells(3 + i + k, 4)) > Abs(Pmax) Then
  Pmax = Sheets(1).Cells(3 + i + k, 4)
  V2tu = Sheets(1).Cells(3 + i + k, 5)
  M3tu = Sheets(1).Cells(3 + i + k, 6)
End If
và đoạn này:
PHP:
    Loop
       Sheets(1).Cells(3 + i, 7) = Pmax
       i = i + k
 Loop
Bạn thay bằng:
PHP:
   Loop
      Sheets(1).Cells(3 + i, 7) = Pmax
      Sheets(1).Cells(3 + i, 8) = V2tu
      Sheets(1).Cells(3 + i, 9) = M3tu
      i = i + k
Loop
Tuy nhiên tôi vẫn cảm thấy code trên cần phải cải tiến thêm ---> Chỉ có mổi việc tìm MAX mà dài dòng quá
Em cám ơn bác rất nhiều! Nếu bác nào có cao kiến hay hơn thì cải tiến giúp em! Thank
 
Không phải cao kiến, mà chỉ là thêm 1 tham khảo

Bài POST trùng lắp, nhờ MODs/SMOD đang ghé đây xóa giúp; Xin cảm ơn nhiều!
--=0 :-= --=0

Flower7.jpg
Flower7.jpg
Flower7.jpg
Flower7.jpg
Flower7.jpg

 
Lần chỉnh sửa cuối:
Không phải cao kiến, mà chỉ là thêm 1 tham khảo

PHP:
Option Explicit
Sub SubMax()
 Dim Text, Rng As Range, Rng0 As Range
 Dim Pmax As Double, Rw As Long, VTr As Long
 Rw = 4
 Do Until Cells(Rw, 1).Value = ""
1   If Text <> Cells(Rw, 1).Value Then
      If VTr > 0 Then
         Pmax = WorksheetFunction.Min(Rng)
         Cells(VTr, "G").Resize(, 3).Value = Rng.Find(Pmax, , _
                  xlFormulas, xlWhole).Resize(, 3).Value
      End If
      Set Rng = Cells(Rw, 1).Offset(, 3)
      VTr = Cells(Rw, 1).Row:                            Text = Cells(Rw, 1).Value
   Else
      Set Rng = Union(Rng, Cells(Rw, 4))
   End If
2   If Cells(Rw, 2).Value = 0 Then
      If Rng0 Is Nothing Then
         Set Rng0 = Cells(Rw, 1).Offset(, 3)
      Else
         Set Rng0 = Union(Rng0, Cells(Rw, 1).Offset(, 3))
      End If
   End If
   Rw = 1 + Rw
 Loop
10
 Pmax = WorksheetFunction.Min(Rng)
 Cells(VTr, "G").Resize(, 3).Value = Rng.Find(Pmax).Resize(, 3).Value
20
  Pmax = WorksheetFunction.Min(Rng0)
  Rng0.Find(Pmax).Resize(, 3).Interior.ColorIndex = 34 + (Second(Time) Mod 6)
End Sub
 
Hàm MINIF() tự tạo đây, mại zô!

Nếu được thì các bác giúp em tìm Pmax tại vị trí 0 lúc này V2 và M3 sẽ xuất hiện tương ứng

PHP:
Option Explicit
Function MinIf(LookUpRange As Range, LookUpValue As Range, Col As Byte)
 Dim Clls As Range, Rng As Range
 
 For Each Clls In LookUpRange.Cells(1, 1).Resize(LookUpRange.Rows.Count)
   If Clls.Value = LookUpValue.Value Then
      If Rng Is Nothing Then
         Set Rng = Clls.Offset(, Col)
      Else
         Set Rng = Union(Rng, Clls.Offset(, Col))
      End If
   End If
 Next Clls
 MinIf = WorksheetFunction.Min(Rng)
 MinIf = Rng.Find(MinIf, , xlFormulas, xlWhole).Resize(, 3)
End Function

Hướng dẫn sử dụng:

(*) Bạn dùng chuột tô chọn 3 ô liền kề, VD J13..K13

(*) Bấm chuột lên thanh công thức & nhập cú pháp =MINIF(B3:F36,B4,2)

(*) Để có kết quả, ta bấm tổ hợp 3 fím dành cho hàm mảng.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em cám ơn bác rất nhiều! Nếu bác nào có cao kiến hay hơn thì cải tiến giúp em! Thank
Tôi chỉ thắc mắc có 1 chuyện: Cột D toàn số âm, vậy sao bạn không tìm MIN mà phải MAX(ABS(...))
???
PHP:
Option Explicit
Function MinIf(LookUpRange As Range, LookUpValue As Range, Col As Byte)
 Dim Clls As Range, Rng As Range
 
 For Each Clls In LookUpRange.Cells(1, 1).Resize(LookUpRange.Rows.Count)
  ..................
.
Sư phụ ơi, em không biết cái này:
LookUpRange.Cells(1, 1).Resize(LookUpRange.Rows.Count)
Có tương đương với:
LookUpRange.Resize(,1)
Không ta?
 
Lần chỉnh sửa cuối:
Các bác ơi! Khi có nhiều vị trí khác vị trí 0 và giá trị đó lại lớn hơn tất cả các giá trị ở vị trí 0 thì kết quả ko đúng. Bây giờ em nghĩ là nên viết vba trứoc hết là tìm những giá trị trong bảng có vị trí 0 rồi lập thành 1 bảng sau đó áp dụng mã của các các bác! Giúp em phần viết mã tạo bảng và tìm vị trí 0.
 
Các bác ơi! Khi có nhiều vị trí khác vị trí 0 và giá trị đó lại lớn hơn tất cả các giá trị ở vị trí 0 thì kết quả ko đúng. Bây giờ em nghĩ là nên viết vba trứoc hết là tìm những giá trị trong bảng có vị trí 0 rồi lập thành 1 bảng sau đó áp dụng mã của các các bác! Giúp em phần viết mã tạo bảng và tìm vị trí 0.
Không hiểu! Vị trí 0 là vị trí nào? Nói rõ chút đi
 
(1) Không hiểu! Vị trí 0 là vị trí nào? Nói rõ chút đi

(2) Sư phụ ơi, em không biết cái này:
LookUpRange.Cells(1, 1).Resize(LookUpRange.Rows.Count)
Có tương đương với: LookUpRange.Resize(,1)
Không ta?

(1) Ở cột 'B' đó! Suy ra í mà! --=0

(2) À ha, Cảm ơn chú nhiều nha! Bệnh lão hóa suy tư rồi! +-+-+-+
 
Vị trí là ở cột B đó anh, ở đó là vị trí của mỗi phần tử. Em cám ơn!
Chính vì vậy mà nhờ mấy bác lọc ra thành bảng tại vị trí 0
Có phải bạn muốn lọc tất cả dử liệu với điều kiện cột B = 0 ?
Dùng AutoFilter hoặc Advanced Filter mà lọc... dể mà
 
Góp vui bằng cách dùng công thức.
Công thức mảng, chỉ phù hợp với dữ liệu nhỏ.

Còn đây là macro:
PHP:
Sub Pmax()
[G:I].ClearContents
Dim Frame As String
Dim P As Long, R As Long
Frame = "":     P = 4:     R = 4
For Each Rng In Range([A4], [A65536].End(xlUp))
    If Rng <> Rng.Offset(1) Then
        Cells(R, 7).Resize(, 3).Value = Cells(P, 4).Resize(, 3).Value
        P = Rng.Row + 1
        R = Rng.Row + 1
    ElseIf Rng = Frame And Rng.Offset(, 1) = 0 And Rng.Offset(, 3) < Cells(P, 4).Value Then
        P = Rng.Row
    End If
Frame = Rng.Value
Next
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Cám ơn bác rất nhiều! Bây giờ em muốn tìm giá trị nhỏ nhất ở vị trí 0 thì thay dấu "<" bằng dấu ">" phải ko các bác?
 
Cám ơn bác rất nhiều! Bây giờ em muốn tìm giá trị nhỏ nhất ở vị trí 0 thì thay dấu "<" bằng dấu ">" phải ko các bác?
Bạn muốn hỏi chỗ nào? Code hay công thức?
Không thể hiểu đơn giản như bạn được đâu. Để sửa code hoặc công thức cho một mục đích khác bạn phải hiểu rõ về code hoặc công thức đó.
 
Bạn muốn hỏi chỗ nào? Code hay công thức?
Không thể hiểu đơn giản như bạn được đâu. Để sửa code hoặc công thức cho một mục đích khác bạn phải hiểu rõ về code hoặc công thức đó.
mình hỏi mã, công thức ko tiện bằng mã. Mong bác giúp đỡ!
 
Web KT

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

Back
Top Bottom