Tìm các dữ liệu với điều kiện trùng lặp

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

svxd49

Thành viên mới
Tham gia
14/11/08
Bài viết
44
Được thích
4
Nghề nghiệp
Kỹ sư xây dựng
Mình có một vướng mắc khi lập bảng tổng hợp công việc. Vướng mắc đã đưa ra trong file đính kèm. Mong mọi người giúp đỡ. Thanks in advance!
 

File đính kèm

File đính kèm

Tác giả có nói chắc là bi nhiêu sheet đâu, làm tất tần tật cho xong, có gì sửa lại.
 
Tôi ko rành về VBA, bạn có thể cho mình hỏi lệnh End(xlUp) có nghĩa như thế nào trong câu lệnh Rng = Ws.Range(Ws.[B3], Ws.[B65000].End(xlUp)).Resize(, 3).Value. Có phải Ws.[B65000].End(xlUp) là đưa về ô trên cùng của vùng dữ liệu chứa cell B65000 của cột B (theo như cách hiểu của tôi trong help. Nếu tôi muốn giới hạn số lượng sheet cần lấy dữ liệu thì cần khai báo biến Ws như thế nào. Tôi đang cố gắng tìm hiểu để có thể sửa đổi và áp dụng cho các bảng tổng hợp khác có nhiều dữ liệu hơn. Mong các bạn chỉ giúp.
 
Tôi ko rành về VBA, bạn có thể cho mình hỏi lệnh End(xlUp) có nghĩa như thế nào trong câu lệnh Rng = Ws.Range(Ws.[B3], Ws.[B65000].End(xlUp)).Resize(, 3).Value. Có phải Ws.[B65000].End(xlUp) là đưa về ô trên cùng của vùng dữ liệu chứa cell B65000 của cột B (theo như cách hiểu của tôi trong help.Nếu tôi muốn giới hạn số lượng sheet cần lấy dữ liệu thì cần khai báo biến Ws như thế nào. Tôi đang cố gắng tìm hiểu để có thể sửa đổi và áp dụng cho các bảng tổng hợp khác có nhiều dữ liệu hơn. Mong các bạn chỉ giúp.
Bạn xem tác dụng của thuộc tính END(...) trong TOPIC này nhé, chắc sẽ có ích cho bạn rất nhiều.
http://www.giaiphapexcel.com/forum/showthread.php?6420-Hỏi-về-thuộc-tính-End()
 
Tôi ko rành về VBA, bạn có thể cho mình hỏi lệnh End(xlUp) có nghĩa như thế nào trong câu lệnh Rng = Ws.Range(Ws.[B3], Ws.[B65000].End(xlUp)).Resize(, 3).Value. Có phải Ws.[B65000].End(xlUp) là đưa về ô trên cùng của vùng dữ liệu chứa cell B65000 của cột B (theo như cách hiểu của tôi trong help.Nếu tôi muốn giới hạn số lượng sheet cần lấy dữ liệu thì cần khai báo biến Ws như thế nào. Tôi đang cố gắng tìm hiểu để có thể sửa đổi và áp dụng cho các bảng tổng hợp khác có nhiều dữ liệu hơn. Mong các bạn chỉ giúp.
PHP:
If Ws.Name <> "Tong Hop" Then
Rng = Ws.Range(Ws.[B3], Ws.[B65000].End(xlUp)).Resize(, 3).Value
Dòng 1: Lấy tất cả các Sheet có tên không phải là Tong hop.
Nếu muốn chỉ lấy 3 sheet A,B C trong số 10 sheet thì bạn có thể dùng:
If Ws.Name = "A" Or Ws.name = "B" Or Ws.name = "C" then
Dòng 2: Gán mảng Rng = giá trị của vùng từ B3 đến dòng cuối cùng trong cột B rồi mở rộng ngang qua 3 cột, thành 3 cột B,C,D.
 
Nếu mình hoán đổi vị trí của hai cột B và C, cột B là công việc còn cột C là ngày thực hiện (cột dùng để lọc dữ liệu ở giữa) thì để mở rộng vùng dữ liệu để lấy giá trị thì lệnh
Resize(, 3).Value
sẽ thay đổi thông số như thế nào.
 
Nếu mình hoán đổi vị trí của hai cột B và C, cột B là công việc còn cột C là ngày thực hiện (cột dùng để lọc dữ liệu ở giữa) thì để mở rộng vùng dữ liệu để lấy giá trị thì lệnh
Resize(, 3).Value
sẽ thay đổi thông số như thế nào.
Bạn chỉnh code của bác Bate thành thế này thôi (thay điều kiện chỗ IF trong code là OK)
PHP:
Public Sub GPE()
Dim Tu As Long,i As Long, k As Long, j As Long,Den As Long
Dim Rng()
Dim Arr(1 To 1000, 1 To 4), Ws As Worksheet
    Tu = Sheets("Tong hop").[C2].Value
    Den = Sheets("Tong hop").[C3].Value
If Tu <> 0 Or Den <> 0 Then
    Sheets("Tong hop").[A5:D1000].ClearContents
    For Each Ws In Worksheets
        If Ws.Name <> "Tong Hop" Then
            Rng = Ws.Range(Ws.[B3], Ws.[B65000].End(xlUp)).Resize(, 3).Value
                For i = 1 To UBound(Rng, 1)
                    If Rng(i, 2) <= Den And Rng(i, 2) >= Tu Then
                        k = k + 1
                        Arr(k, 1) = k
                        For j = 1 To 3
                            Arr(k, j + 1) = Rng(i, j)
                        Next j
                    End If
                Next i
        End If
    Next
        If k Then Sheets("Tong Hop").[A5].Resize(k, 4).Value = Arr
        Sheets("Tong Hop").Range([C5], [B65000].End(xlUp)). _
                Sort Key1:=Range("C5"), Order1:=xlAscending
End If
End Sub
 
Tôi đã thử vận dụng trong file bê tông sau, ở sheet Test Results nhưng không chạy được. Nhờ mọi người kiểm tra và tìm lỗi giúp tôi. Thanks.
 

File đính kèm

Má ơi!
File này có giống chút nào với file ở bài #1 mà "chạy" trời.
Phải chi từ đầu bạn đưa file này và nêu rõ yêu cầu từ đầu thì còn có phương giải quyêt.
Tui "thua" với bạn rồi!
Híc!
 
Tôi xin lỗi vì tôi có nh file theo dõi công việc và ban đầu cũng chỉ nghĩ đến phương án dùng hàm để thực hiện chứ ko phải dùng đến VBA. File ở bài 1 là theo dõi công tác thi công trong công trường, còn file này là theo dõi khối lượng và kết quả nén bê tông. Vì cùng một mục đích nên tôi chỉ xin nhờ giúp giải quyết 1 file rồi dựa vào đó chỉnh các file khác. Nếu dùng hàm, khả năng tôi sẽ dựa vào đó để áp dụng cho các file khác được nhưng VBA thì tôi rất kém. Tôi dựa theo code mà bạn đã đưa rồi chỉnh sửa lại nhưng do trình độ VBA còn quá kém nên không kiểm soát đc các lỗi. Mong bạn thông cảm.
 
Lần chỉnh sửa cuối:
Tôi xin lỗi vì tôi có nh file theo dõi công việc và ban đầu cũng chỉ nghĩ đến phương án dùng hàm để thực hiện chứ ko phải dùng đến VBA. File ở bài 1 là theo dõi công tác thi công trong công trường, còn file này là theo dõi khối lượng và kết quả nén bê tông. Vì cùng một mục đích nên tôi chỉ xin nhờ giúp giải quyết 1 file rồi dựa vào đó chỉnh các file khác. Nếu dùng hàm, khả năng tôi sẽ dựa vào đó để áp dụng cho các file khác được nhưng VBA thì tôi rất kém. Tôi dựa theo code mà bạn đã đưa rồi chỉnh sửa lại nhưng do trình độ VBA còn quá kém nên không kiểm soát đc các lỗi. Mong bạn thông cảm.
Thế thì với bài #10 bạn đưa lên thì yêu cầu làm sao, kết quả thế nào, lấy chuẩn bằng cột nào để lọc...
Bài #10 khác với bài #1 mà bạn không nêu lại yêu cầu khác thì làm sao hiểu được.
 
Xin lỗi thầy! Trong file concrete, em lọc dữ liệu theo thời gian ở cột I trong sheet Tracking là ngày đổ bt và đc thể hiện ở cột G trong sheet Test results rồi từ đó lấy các dữ liệu tương ứng như Part, Section, R3, R7, R28, Minute trong sheet Tracking chuyển sang sheet Test results. Em đã thử sửa code trong bài #1 sang file này nhưng bị lỗi.
Mã:
Option Explicit

Public Sub GPE()
Dim Tu As Long, Den As Long, Rng(), I As Long, K As Long
Dim Arr(1 To 1000, 1 To 13), Ws As Worksheet
    Tu = Sheets("Test Results").[G2].Value
    Den = Sheets("Test Results").[G3].Value
If Tu <> 0 Or Den <> 0 Then
    Sheets("Test Results").[A6:M1000].ClearContents
            If Ws.Name = "Tracking" Then
            Rng = Ws.Range(Ws.[B6], Ws.[B65000].End(xlUp)).Resize(, 29).Value
                For I = 1 To UBound(Rng, 1)
                    If Rng(I, 8) <= Den And Rng(I, 8) >= Tu Then
                        K = K + 1
                        Arr(K, 1) = K
                        For j = 1 To 5
                            Arr(K, j + 1) = Rng(I, j)
                        Next j
                        Arr(K, 7) = Rng(I, 8)
                        Arr(K, 8) = Rng(I, 14)
                        Arr(K, 9) = Rng(I, 18)
                        Arr(K, 10) = Rng(I, 19)
                        Arr(K, 11) = Rng(I, 23)
                        Arr(K, 12) = Rng(I, 24)
                        Arr(K, 13) = Rng(I, 28)
                    End If
                Next I
        End If
            If K Then Sheets("Test Results").[A6].Resize(K, 13).Value = Arr
        Sheets("Test Results").Range([B6], [B65000].End(xlUp)). _
                Sort Key1:=Range("B6"), Order1:=xlAscending
End If
End Sub

Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, [G2:G3]) Is Nothing Then
    If Target.Rows.Count = 1 And Target.Columns.Count = 1 Then GPE
End If
End Sub

Em nghĩ là mình bị sai ở phần khai báo biến chung.
 
Lần chỉnh sửa cuối:
Xin lỗi thầy! Trong file concrete, em lọc dữ liệu theo thời gian ở cột I trong sheet Tracking là ngày đổ bt và đc thể hiện ở cột G trong sheet Test results rồi từ đó lấy các dữ liệu tương ứng như Part, Section, R3, R7, R28, Minute trong sheet Tracking chuyển sang sheet Test results. Em đã thử sửa code trong bài #1 sang file này nhưng bị lỗi.
............................
Em nghĩ là mình bị sai ở phần khai báo biến chung.
Thay code cũ bằng code này thử xem. dữ liệu lọc các cột mình không hiểu, tùy bạn chỉnh lại nhé.
PHP:
Public Sub GPE()
Dim Tu As Long, Den As Long, Rng(), I As Long, J As Long, K As Long
Dim Arr(1 To 1000, 1 To 13), WS As Worksheet
Set WS = Sheets("Tracking")
    Tu = Sheets("Test Results").[G2].Value
    Den = Sheets("Test Results").[G3].Value
If Tu <> 0 Or Den <> 0 Then
    Sheets("Test Results").[A6:M1000].ClearContents
            Rng = WS.Range(WS.[B6], WS.[B65000].End(xlUp)).Resize(, 29).Value
                For I = 1 To UBound(Rng, 1)
                    If Rng(I, 8) <= Den And Rng(I, 8) >= Tu Then
                        K = K + 1
                        Arr(K, 1) = K
                        For J = 1 To 5
                            Arr(K, J + 1) = Rng(I, J)
                        Next J
                        Arr(K, 7) = Rng(I, 8)
                        Arr(K, 8) = Rng(I, 14)
                        Arr(K, 9) = Rng(I, 18)
                        Arr(K, 10) = Rng(I, 19)
                        Arr(K, 11) = Rng(I, 23)
                        Arr(K, 12) = Rng(I, 24)
                        Arr(K, 13) = Rng(I, 28)
                    End If
                Next I
            If K Then Sheets("Test Results").[A6].Resize(K, 13).Value = Arr
        Sheets("Test Results").Range([B6], [B65000].End(xlUp)). _
                Sort Key1:=Range("B6"), Order1:=xlAscending
End If
Set WS = Nothing
End Sub
 
Em cảm ơn thầy. Em có thêm một câu hỏi nữa đó là: khi em dùng câu lệnh
Mã:
[LEFT][COLOR=#0000BB][FONT=monospace]Sheets[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Test Results"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]B6[/FONT][/COLOR][COLOR=#007700][FONT=monospace]], [[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]B65000[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlUp[/FONT][/COLOR][COLOR=#007700][FONT=monospace])).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Sort Key1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]:=[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"B6"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]), [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Order1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]:=[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlAscending[/FONT][/COLOR][/LEFT]
để sort dữ liệu thì chỉ có cột đó thay đổi mà các cột khác vẫn giữ nguyên. Thầy giúp em chỉnh sửa câu lệnh trên để khi sort 1 cột thì các cột khác cũng thay đổi theo tương ứng.
 
Em cảm ơn thầy. Em có thêm một câu hỏi nữa đó là: khi em dùng câu lệnh
Mã:
[LEFT][COLOR=#0000BB][FONT=monospace]Sheets[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Test Results"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]B6[/FONT][/COLOR][COLOR=#007700][FONT=monospace]], [[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]B65000[/FONT][/COLOR][COLOR=#007700][FONT=monospace]].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlUp[/FONT][/COLOR][COLOR=#007700][FONT=monospace])).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Sort Key1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]:=[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"B6"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]), [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Order1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]:=[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlAscending[/FONT][/COLOR][/LEFT]
để sort dữ liệu thì chỉ có cột đó thay đổi mà các cột khác vẫn giữ nguyên. Thầy giúp em chỉnh sửa câu lệnh trên để khi sort 1 cột thì các cột khác cũng thay đổi theo tương ứng.
Lỗi đó là do tôi chỉ mới lấy dữ liệu có 1 cột, thiếu cái .Resize (,12).
Thay đoạn đó bằng đoạn này xem
PHP:
Sheets("Test Results").Range([B6], [B65000].End(xlUp)).Resize(, 12). _
                Sort Key1:=Range("B6"), Order1:=xlAscending
Bạn muốn sort theo cột nào thì sửa Sort Key1:=Range("B6") lại cho phù hợp.
Nếu có sai sót nào khác thì cứ báo.
 
Tham chiếu lấy vị trí của dữ liệu trùng cuôi cùng

[/QUOTE]
ndu96081631 đã viết:
phongkiemtinh đã viết:
Vậy để lấy tham chiếu về vị trí dòng và cột của cell trùng cuối cùng thì như thế nào hả anh?
Còn để dò tìm cell trùng cuối cùng này và xuất ra ở cell cùng dòng kế bên là "End" thì phải làm sao?Chỉ xuất cho cell trùng cuối cùng, các cell chứa giá trịtrùng không phải cuối cùng thì để trống?
a xem file dinh kem dum e
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom