Nếu chịu sử dụng VBA thì xem thử File này thủ coi.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!
Em nghỉ fải giới hạn số Sheet bị lấy số liệu, chứ trừ sheet Tonghop, sheet nào cũng lấy thì mệt!Nếu chịu sử dụng VBA thì xem thử File này thủ coi.
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.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.
If Ws.Name <> "Tong Hop" Then
Rng = Ws.Range(Ws.[B3], Ws.[B65000].End(xlUp)).Resize(, 3).Value
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)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ệnhResize(, 3).Value sẽ thay đổi thông số như thế nào.
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
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...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.
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
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
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é.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.
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
[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]
Lỗi đó là do tôi chỉ mới lấy dữ liệu có 1 cột, thiếu cái .Resize (,12).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
để 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.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]
Sheets("Test Results").Range([B6], [B65000].End(xlUp)).Resize(, 12). _
Sort Key1:=Range("B6"), Order1:=xlAscending
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