Các câu hỏi về lọc dữ liệu, lọc với nhiều điều kiện

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Các bạn giúp mình 2 bài toán tìm kiếm và lọc các dữ liệu ,vui lòng mở file đính kèm

Một giải pháp cho những ai yêu thích Name

Về phần trích lọc danh sách duy nhất thì trên diển đàn có nói nhiều rồi, tôi chỉ muốn góp phần bài toán trích theo điều kiện (Trần thị)
Đặt 2 name là đủ:

listA = $A$3:$A$12
VT =IF(ISERR(SEARCH($E$1,listA)),"",ROW(INDIRECT("1:"&ROWS(listA))))

Và cuối cùng có công thức:

C3 =IF(ROW(1:1)>COUNT(VT),"",INDEX(listA,SMALL(VT,ROW(1:1)),1))

Kéo fill xuống!
Bạn hoangdanh282vn chú ý: Cẩn thận với hàm INDIRECT vì ko phải khi nào cũng cho kết quả đúng… Bạn hãy thử kéo vùng listA ra khỏi cột A thì sẽ biết liền.. Kết quả sai ngay lập tức
ANH TUẤN

Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM
Khóa học SprinGO phù hợp

Thiết kế Tổng đãi ngộ (Total Rewards) theo khung SHRM

Khóa học “Thiết kế Tổng phần thưởng (Total Reward) chuẩn khung SHRM” giúp bạn nắm vững toàn bộ hệ thống đãi ngộ theo chuẩn...

Xem khóa học
★★★★★ 5 ★ 1 👤 102 ▥ 0
Quảng cáo

Bạn nên đọc

102 Responses

  1. hands says:

    Em có 1 bảng các excel Kế hoạch các giai đoạn của 1 Dự án
    – Gồm 4 cột: Cột 1 ( Các giai đoạn ) Cột 2( Người thục hiện ) Cột 3 ( Người ký duyệt ) Cột 4 ( Ngừoi Hỗ trợ)
    – 1 người A có thể vừa Thực hiện vừa hỗ trợ hay duyệt
    – Em muốn lọc ra công việc của từng ông sẽ làm gì tại các giai đoạnnhưng gặp khó khăn như sau
    Em thử dùng Filter để lọc nhưng do có 3 trường ( thực hiên, ký duyệt, hỗ trợ) mà 1 ông có thể làm ( thực hiên, ký duyệt, hỗ trợ) nên ko thể lọc đầy đủ được giai đoạn của 1 ông tham gia
    XIn hỏi xem có cách nào để lọc ra trong toàn bô đạta nhưu vậy thì ông A sẽ có mặt ở các giai đoạn nào ( trong cả 3 trường luôn)
    Xin anh em chỉ giáo
    ( Có thể em giải thích hơi khó hiểu , em gửi file đính kèm , mong anh em thông cảm)
    @#!^%

    :-= Thì dùng AdvancedFilter là được thôi mà!
    (Xem file đính kèm, nha; Trong menu Insert có 2 Names phản ảnh cách lọc)

    Tôi nghĩ có lẽ bạn sai trong phần thiết kế vùng điều kiện… Xem file nha (Chú ý đây là điều kiện OR)

    gửi bạn 1file lọc bằng công thức theo ý của bạn

  2. hands says:

    Lọc dữ liệu của Column, gộp vào cùng 1 Cell

    Hi all,

    Mình đang có đề bài cần phải xử lý lọc dữ liệu của 1 cột, cho tất cả kết quả vào 1 cell mô tả cụ thể như sau:

    Mình có 1 bảng có 4 cột dữ liệu A, B, C, D. Mình cần lọc dữ liệu tại cột A đưa vào 1 cell ở cột D (Dj), điều kiện như sau:

    • Dòng Dj có giá trị là các giá trị dòng Ai của cột A với điều kiện
    • Bi=Cj
    • với: j – 15<= i <= j + 15
    • Các giá trị có thể phân biệt với nhau bằng : , ; …

    Sorry vì mình ko attach được file mẫu, nên chỉ mô tả bằng lời !$@!!

    Rất mong được mọi ngươi giúp mình xử lý cách lọc dữ liệu này.
    Cảm ơn rất nhiều mọi sự giúp đỡ %#^#$

    Bằng VBA đây, xin mại dô!

    Option Explicit
    Sub Search2Columns()
    Dim SChu As String: Dim Rng As Range, Cell As Range
    Dim lRw As Long, Wf As Long, Ed As Long, Bg As Long

    lRw = .End(xlUp).Row
    For Wf = 2 To lRw
    If Wf < 17 Then Bg = 2 Else Bg = Wf – 15
    If lRw – Wf > 15 Then Ed = Wf + 15 Else Ed = lRw
    Set Rng = Range(Cells(Bg, "B"), Cells(Ed, "B"))
    For Each Cell In Rng
    If Cell.Value = Cells(Wf, "C").Value Then _
    SChu = SChu & "; " & Cell.Offset(, -1).Value
    Next Cell
    If Len(SChu) > 0 Then
    Cells(Wf, "D") = Mid(SChu, 3): SChu = ""
    End If
    Next Wf
    End Sub

    Ver 2.0 xài khi cần tăng tốc bằng phương thức FIND()

    Option Explicit

    Sub SearchForColumns()
    Dim SChu As String, GPE_ As String
    Dim MyRng As Range, Rng As Range
    Dim lRw As Long, Wf As Long, eD As Long, bG As Long

    lRw = .End(xlUp).Row
    For Wf = 2 To lRw
    If Wf < 17 Then bG = 2 Else bG = Wf – 15
    If lRw – Wf > 15 Then eD = Wf + 15 Else eD = lRw
    Set MyRng = Range(Cells(bG, "B"), Cells(eD, "B"))
    With MyRng
    Set Rng = .Find(What:=Cells(Wf, "C"), LookIn:=xlValues)
    If Not Rng Is Nothing Then
    GPE_ = Rng.Address
    Do
    SChu = SChu & "; " & Rng.Offset(, -1).Value
    Set Rng = .FindNext(Rng)
    Loop While Not Rng Is Nothing And Rng.Address <> GPE_
    End If
    End With
    If Len(SChu) > 0 Then
    Cells(Wf, "D") = Mid(SChu, 3): SChu = ""
    End If
    Next Wf
    End Sub

  3. hands says:

    Hình như không phải như vậy, ChanTQ@ à.
    Theo tôi hiểu thì có lẽ là như vầy:

    • Trước hết, xét cái điều kiện j – 15<= i <= j + 15
      Do số hàng nhỏ nhất là 1, nên công thức chỉ có thể áp dụng cho hàng 16 của cột D trở đi mà thôi, nghĩa là từ ô D16.
    • Thứ hai là cái điều kiện này: B(i) = C(j). Nghĩa là dò trong dãy ô B(j-15):B(j+15), nếu có giá trị nào bằng với giá trị tại ô C(j) thì lấy giá trị tương ứng bên cột A, ghép lại và bỏ vào trong D(j).

    Ví dụ, nếu đang đứng tại ô D16, ta sẽ dò trong mảng B1:B31, nếu có giá trị nào bằng giá trị tại C16, thì lấy giá trị tương ứng ở cột A bỏ vào trong D16, còn không thì thôi.

    Tương tự, công thức trong D17, sẽ đi dò trong B2:B32, nếu có giá trị nào bằng giá trị tại C17, thì lấy giá trị tương ứng ở cột A bỏ vào trong D17, còn không thì thôi, v.v…

    Cụ thể hơn, xem cái này:
    1384
    Công thức tại ô D16, là đem cái giá trị ở C16 đi dò trong B1:B31. Bởi vì trong C16 là con số 9, nên các ô trong B1:B31 mà bằng 9 là B2, B12, B19, B21 và B28, vậy kết quả trong D16 là ghép: A2, A12, A19, A21 và A28 lại với nhau, hay nó bằng 8,7,6,6,6 (trong hình, do cột D hơi nhỏ nên thiếu một số 6)

    Nhưng làm sao để cho ra cái kết quả đó thì tôi chưa nghĩ ra.

    Có phải như vậy không tác giả ơi ?

    Sorry vì hôm nay mình với reply lại được %#^#$
    Đúng rồi, bài toàn của mình đặt ra đúng như BNTT mô tả.
    Cảm ơn bạn BNTT đã mô tả lại chi tiết hơn giùm mình %#^#$
    Cảm ơn mọi người đã giúp mình rất nhiều, mình đang ngâm cứu hướng dẫn của các bạn /-*+/

    Góp 1 cách dùng công thức

    Ghép 20 dữ liệu cột A khi dữ liệu cột B giống nhau
    (Có thể tăng thêm được nếu có nhu cầu – rất đơn giản)

    Tập tẹ tý VBA các bác đừng cười em nhé

    Sub boyxin()
    Dim Er As Long, Er1 As Long, i As Long, j As Long, Text As String
    Er = .End(xlUp).Row
    Range("E2:F" & Er).Clear
    Range("B1:B" & Er).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
    "E1"), Unique:=True
    Er1 = .End(xlUp).Row
    Range("E1:E" & Er1).Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    DataOption1:=xlSortNormal
    For i = 2 To Er1
    Text = ""
    For j = 2 To Er
    If Cells(j, 2) = Cells(i, 5) Then
    Text = Text & Cells(j, 1) & ";"
    End If
    Next
    Cells(i, 6) = Left(Text, Len(Text) – 1)
    Next
    ActiveSheet.Names("Extract").Delete
    End Sub
    ——————————————-
    Mượn file bác SA: Sao bác lọc thêm theo điều kiện gì vậy mà em đọc mãi không hiểu

  4. hands says:

    Mượn file bác SA: Sao bác lọc thêm theo điều kiện gì vậy mà em đọc mãi không hiểu

    Mình lọc theo chỉ đạo của BNTT đó mà!
    Dò theo cột 'C' với 15 records trước đó & 15 records sau nó; nếu cột 'B' của vùng mà trị nào bằng trị tại C(i) thì chép nối tất tần tật A tương ứng đến ô D(i)
    Nhưng khi i<15 hay còn 15 records đến dòng cuối thì vùng khảo sát rút ngắn xuống tương ứng!

    Nhờ giúp đỡ:Lọc dữ liệu số trong 1 khoảng giá trị cho trước

    Xin chào mọi người,
    Mình đang gặp khó khăn trong việc sử dụng excel lọc các dữ liệu số trong khoảng cho sẵn, cụ thể:cho khoảng cho sẵn gồm khoảng 10.000 số 78abcd ( trong đó a,b,c,d từ 0 đến 9), lọc lấy dữ liệu số theo yêu cầu: a=c; b= d ….
    Mong được mọi người hướng dẫn thêm.
    Cảm ơn nhiều.

    Hỏi lại:
    a= c HOẶC b = d
    hay
    a =c b = d
    thêm nữa:
    – Tìm được số đúng yêu cầu rồi thì tiếp theo làm gì nữa?
    Ẹc… Ẹc… Ít ra phải có file minh họa, chứ như câu hỏi của bạn, tôi có thể trả lời ngay rằng:
    Số cần tìm là 780000, 781010, 782020… vân vân —> Dùng công thức cũng kéo fill được hết

    yêu cầu của mình thường là VÀ.
    Bộ lọc thì mình xây dựng được.
    Chủ yếu gặp khó khăn là phải đưa ra các con số đầy đủ, tức là 780000,780001,780002 … thì bộ lọc của mình mới thực hiện được; mình muốn tìm công cụ hỗ trợ lọc trong khoảng ( tức là chỉ cần đưa cận trên và cận dưới).
    Rất mong được mọi người giúp đỡ thêm.
    Cảm ơn nhiều.

    bạn dùng advanced Filter để lọc, điều kiện mình lọc trong file là and(a=c,b=d)

    Bạn sử dụng hàm này nhé :
    =and(mid(a1,3,1)=mid(a1,5,1),mid(A2,4,1)=RIGHT(A2,1))

    Sau đó bạn lọc theo giá trị True hoặc False

    Ghi chú
    Hàm MID: Hàm lấy ký tự bên trong của chuỗi.
    -Cú pháp: MID (X, m, n) Hàm MID lấy n ký tự trong chuỗi X bắt đầu từ vị trí m.

    Có phải bạn muốn vậy không

  5. hands says:

    Trích lọc dữ liệu theo nhiều điều kiện

    Em có bảng tính lương này. Đề bài yêu cầu:
    – Trích những người có số con >2
    – Trích những người có số con <=2 và chức vụ là "NV"
    – Trích những người có số con >2 hoặc chức vụ là "TP"

    Hix, em mới học excel nên đã đọc nhưng k hiểu j` về vấn đề trích, lọc dữ liệu
    Ai giúp em với. Chỉ rõ từng bước cho em nhé vì em chậm hiểu lắm. thanks^^}}}}}

    Ngoài cách dùng Advanced Filter, tôi nghĩ với bài của bạn dùng AutoFilter thì dể làm hơn
    Hãy xem file hướng dẩn tôi đính kèm ở đây (có hình)
    (Tôi làm câu 2, các câu khác tương tự)

    xin hỏi bác ndu.. là có cách nào sử dụng autofilter để lọc ra 1 danh sách khách hàng như ví dụ không?

    Ah… yêu cầu của bạn lại phải dùng Advanced Filter mới xong
    Bạn làm theo hướng dẩn trong file tôi đính kèm nhé

    Anh Ndu .
    Em có thêm một cách nửa ko dùng, Advanced Filter,Filter,không công thức luôn .
    hạn chế là khi ra kết quả nó ko có dòng tiêu đề ,nhưng với dử liệu này củng ko khó để nhìn ra .

    Data / consolidate /trong reference ,chọn từ B1:D6
    Xuống chọn left column / ok .
    ra kết quả .
    em biết chỉ vậy thôi .

    Ái chà… cái trò này xem bộ ngon à nha! Dùng để LỌC DUY NHẤT kèm TÍNH TỔNG là bá chấy
    Theo gợi ý này của volga, tôi làm code như sau:

    Sub Test()
    Dim Rng As Range
    Set Rng = Application.InputBox("Chon vung can tong hop", Type:=8)
    Selection.Consolidate "'" & ThisWorkbook.Path & "" & _
    ActiveSheet.Name & "'!" & Rng.Address(ReferenceStyle:=xlR1C1), xlSum, False, True, False
    End Sub
    Mời xem file thử —-> Xem chừng nhanh gọn hơn dùng AF để lọc, rồi lại SUMIF (dài dòng)
    Cảm ơn volga rất nhiều về phát hiện này!

  6. hands says:

    Vui lòng cho mình hỏi về Lọc dữ liệu.

    Mình có một file bao gồm rất nhiều mặt hàng. Mổi mặt hàng gồm nhiều giá biến động từ 2005-2008. Mổi năm có rất nhiều lần nhập hàng nên có nhiều giá khác nhau và cũng có năm ko nhập mặt hàng đó nên không có giá. Ý mình là có cách nào mà lọc dữ liệu từng mặt hàng của từng năm được không? Ví dụ: Bạc đạn 6308 năm 2005 có 5 giá ==> chỉ lấy 1 giá, năm 2006 có 2 ==> lấy 1 ….. năm 2008 …. Mình hơi gà về excel nên tìm hoài mà ko dc. Thanks các bro nhiều. Mình xin gởi kèm file.

    Dùng Consolidate sướng thật, nhưng code lượm thượm quá
    Sửa lại đây:

    Option Explicit
    Sub Test()
    Dim Src As Range, FullPath As String
    Set Src = Application.InputBox("Chon vung can tong hop", Type:=8)
    FullPath = Evaluate("=Cell(" & Chr(34) & "Filename" & Chr(34) & ")")
    Selection.Consolidate FullPath & "!" & Src.Address(, , 2), 9, , True
    End Sub
    Ghi chú: số 9 trong code tương đương với Function_Num trong hàm SUBTOTAL —> (1 là AVERAGE… 9 là SUM)

    Dear Anh NDU
    Trong code của anh em xin phép hỏi một số như sau
    – Type = 8 có nghĩa là gì?
    – Chr(34) có phải là bảng code để viết được tiếng việt trong VBA không? Em chưa có code này. Anh có thế gửi link giúp em không?

    Cám ơn ANh

    Type:=8 —> Khai báo cho Excel biết đây là Range (Nếu không có nó thì khi gọi InputBox lên, bạn không thể dùng chuột chọn vùng được) —-> Có thể vào của sổ VBE, gõ InputBox, bôi đen nó rồi F1 sẽ thấy
    Chr(34) —> là dấu " —> Thí nghiệm gõ thử công thức =CHAR(34) vào 1 cell nào đó sẽ thấy

    Đoạn code trên sửa như sau: nhìn sẽ gọn và dễ nhớ, dễ sử dụng

    Sub Test()
    Dim Src As Range
    Set Src = Application.InputBox("Chon vung can tong hop", Type:=8)
    Src.Name = "Data"
    Selection.Consolidate "data", 9, , True
    Names("Data").Delete
    End Sub

    Chỉ cần thế này là đủ, khỏi cần đặt name

    Sub Test()
    Dim Src As Range
    Set Src = Application.InputBox("Chon vung can tong hop", Type:=8)
    Selection.Consolidate Src.Address(, , 2), 9, , True
    End Sub

    Nhưng có 1 thắc mắc: Src.Address thì không được mà phải là Src.Address(, , 2)

    Thế thì bỏ luôn Src cho gọn:

    Sub Test()
    With Application.InputBox("Chon vung can tong hop", Type:=8)
    Selection.Consolidate .Address(, , 2), 9, , True
    End With
    End Sub

    Tại cái Consolidate nó bắt Address phải là kiểu R1C1 (kiểu thường nó hỏng chịu—> Thử rồi)

    em có chút thắc mắc về consolidate, không hiểu sao mỗi lần thêm vùng giá trị là nó nhân thêm giá trị.

    Tại khi làm xong, bạn lại làm tiếp, cộng dồn vào dử liệu có sẳn nên nó nhân đôi, nhân 3, nhân 4 là chuyện thường (Đây cũng là phát hiện hay à nha)
    Vậy, nếu muốn nó không nhân thì xóa dử liệu vừa tổng hợp đi, làm lại mới (xóa luôn cả Range đang lưu giữ trong Consolidate)

  7. hands says:

    Hỏi cách lọc dữ liệu theo cột không có cột trống!

    Em có bảng dữ liệu thu thập được thế này (file kèm) hiện nay em muốn lọc điều kiện để tổng hợp fân tích nhưng em gặp fải trường hợp sau:
    – Em muốn lọc Q01-code 2, nhưng lọc theo kiểu auto filter thì nó hiện theo dòng, tức là vẫn hiện ra những phiếu (103, 106, 107…..) không thỏa điều kiện đó, do ban đầu em kô đủ cột nên em đành fải để dữ liệu nằm thế này, hi vọng anh/chị giúp đỡ!
    Tức là em có một bảng dữ liệu thô thế này, em muốn sau khi lọc thì sẽ thấy được những phiếu nào thỏa điều kiện Q01-code 2 có số 1, khi đó, em sẽ show all những điều kiện còn lại để phân tích. Nhưng em lọc ra dòng chứa Q01-code 2 có chứa 1 thì vẫn tồn tại cả những cột Q01-code 2 trống!

    Dữ liệu của bạn gây khó khăn cho việc lọc. Xin góp một vài ý như thế này:
    1. Nên tách dòng tên phiếu thành 1 dòng độc lập và lấy nó làm tiêu đề cho các cột luôn thể. Lúc đó có thể đưa chữ "code" xuống dưới để tạo tiêu đề cho cột thứ 2.
    2. Nên để cột 1 có tên, ví dụ Qcode chẳng hạn.

    Lúc đó bạn chỉ cần dùng autofiter lần lượt trên 2 cột: Qcode và code là OK.

    Cám ơn bạn rất nhiều, có điều ý của mình là thế này, trong file test kèm theo mình chỉ đưa dữ liệu 1 fần thôi, thực ra các Q có nhiều code nên phải để theo dòng, nên làm sao đưa tên phiếu thành một dòng độc lập được. Mình kô hiểu ý bạn cho lắm!

    Bạn thử lọc bằng tay ra 1 bảng khác làm ví dụ xem nào (Vì chưa hiểu lắm ý bạn)
    Nghĩa là bạn nên thiết kế lại dữ liệu theo hướng này:
    QCode|Code|Số Phiếu|Số lượng (Đ.Kiện)
    Q01|1|103|1
    Q01|1|106|1
    Q01|1|107|1
    Q01|1|109|1
    Q01|1|110|1
    Q01|1|112|1
    Q01|2|101|1
    Q01|2|102|1
    Q01|2|104|1
    Q01|2|105|1
    Q01|2|108|1
    …|…|…|…
    Không ai thiết kế data theo kiểu của bạn, số phiếu lại cho lên thành cột! Như vậy trong file chỉ có tối đa 255 cột –> 255 phiếu thôi à! Nếu phát sinh thêm phiếu thì sao?

    ah, cám ơn bạn đã quan tâm, do mình chỉ có 140 phiếu nhưng fần Q và code rất nhiều, mình đã từng để phiếu theo dòng, khi đó, Q và code nó là trên cột, mà tổng cộng số code mình nghiên cứu là hơn 300 nên mình đã bị thiếu cột, kết quả mình đã phải đổi lại như bảng bạn thấy đó!

    còn nữa, do mình có tổng cộng 140 phiếu, hơn 34Q, mỗi Q có nhiều code, có Q chứa tới 22 code nên mình nghĩ thiết kế theo hình của bạn là không thể!

    Filter2Criteria

    Trong file đính kèm tôi đã sửa đổi 1 ít về cách bố trí các tiêu đề và dùng VBA để giải quyết bài toán của bạn.
    Cách dùng như sau:
    – Tôi đặt 1 tên dùng làm điểm mốc bắt đầu vùng dữ liệu của bạn (tại A3, tên là Ques). Sau này nếu bạn có muốn thay đổi bảng thì nhớ là giữ lại tên tại điểm bắt đầu của bảng để code hoạt động đúng.
    – Trong file tôi chèn 1 nút lệnh để gọi macro (nếu thích thì bạn có thể gán phím nóng để dùng cho nhanh)
    – Trước khi nhấn nút, bạn chọn 2 ô liên tiếp chứa điều kiện cần lọc, ví dụ: chọn 2 ô A4:B4 (Q01-code 2) và nhấn nút lệnh. Mã lệnh sẽ lọc dòng và cột đúng như yêu cầu của bạn.
    – Nếu muốn hiện lại toàn bộ dữ liệu thì chọn 1 ô bất kỳ, nhấn nút lệnh.
    (Ngoài ra, tôi đã freez tại dòng số 2 để bạn dễ theo dõi)
    – Bạn xem trong file để test và cho ý kiến nhé.

    Sub Filter2Criteria()
    Const Ques = "Ques"
    Dim Sh As Worksheet
    Dim Rng As Range, Cri As Range
    
    Set Sh = ActiveSheet
        Sh.AutoFilterMode = False
        Set Cri = Selection
        If Cri.Cells.Count <> 2 Or Cri.Areas.Count > 1 Then
            Sh.Columns.EntireColumn.Hidden = False
            GoTo endSub
        End If
        Set Rng = Sh.Range(Ques).CurrentRegion
        Rng.Columns.EntireColumn.Hidden = False
        Rng.AutoFilter field:=1, Criteria1:=Cri(1)
        Rng.AutoFilter field:=2, Criteria1:=Cri(2)
        Set Rng = Rng.Offset(Cri.Row - Sh.Range(Ques).Row, 2).Resize(1, Rng.Columns.Count - 1)
    
    On Error Resume Next
            Set Rng = Rng.SpecialCells(Type:=xlCellTypeBlanks)
        If Err.Number = 0 Then Rng.Columns.EntireColumn.Hidden = True
    endSub:
        Sh.Cells(1).Activate
        Set Sh = Nothing: Set Rng = Nothing: Set Cri = Nothing
    End Sub
  8. hands says:

    Ui ui, cám ơn bạn nhiều lắm!
    Đúng là cái mình cần rồi, nhưng mình đã copy đoạn code của bạn để làm vào file chính (dài hơn) thì mình kô làm được. Bạn có thể hướng dẫn mình kô? nhất là cái ô A3 ques đó! mình cũng đang tự mò về mí cái code gì bạn vik đó, hi vọng bạn kô fiền nha! thanks!-=.,,

    Mình đã thử làm theo code của bạn nhưng thiệt là xấu hổ, mình hem làm được! hix hix…
    Mình gởi file hoàn chỉnh, hi vọng bạn giúp mình nhé!
    Tức là tạo dùm mình cái command như thế đó!
    Cám ơn rất nhiều!

    Rồi, đã tạo lại file giúp bạn.
    Có mấy bước như thế này:
    1. Chọn ô đầu tiên chứa các Q (vdụ A3), click vào name-box (bạn có biết nó ở đâu không? +-+-+-+) và nhập tên Ques, nhấn Enter
    2. Chọn thanh Control Toolbar (cố gắng tìm @#!^%), chọn nút command rồi vẽ lên ô B1
    Nhấn D-click vào nút sẽ mở cửa ổ VBE và xuất hiện 2 dòng:
    Sub Command1_Click()

    End Sub

    Gõ thêm vào giữa 2 dòng này: Call Filter2Criteria
    Ở của số bên trái, nhấn R-Click, chọn Insert Module, sẽ xuất hiện cửa sổ để viết mã lệnh. Copy cái đoạn code rồi dán vào đó.

    Trở lại Excel, click vào biểu tượng hình thước eke trong thanh Control Toolbar để thoát khỏi design mode. Thế là xong.

    mình đã làm được rùi, cám ơn bạn, chỉ có điều có một số code, lớn hơn 2 như code 3,4,5,6…. hình như nó kô hiện ra!

    Trong bảng dữ liệu mình đã post, có những ô chứa công thức nhưng giá trị là " " hoặc "-" nên khi lọc sẽ không đúng. Mình thử copy và paste giá trị trở lại nhưng khi đó thì công thức lọc của bạn kô chạy!
    Bạn test thử dùm nha!

    Bạn copy code này và thay vào code cũ nhé.
    (mở file, nhấn Alt-F11, bên trái có dòng Module1, nhấn d-click sẽ thấy code cũ)

    Sub Filter2Criteria()
    Const Ques = "Ques"
    Dim Sh As Worksheet
    Dim Rng As Range, Cri As Range
        Application.ScreenUpdating = False
        Set Sh = ActiveSheet
        Sh.AutoFilterMode = False
        Set Cri = Selection
        If Cri.Cells.Count <> 2 Or Cri.Areas.Count > 1 Then
            Sh.Columns.EntireColumn.Hidden = False
            GoTo endSub
        End If
        Set Rng = Sh.Range(Ques).CurrentRegion
        Rng.Columns.EntireColumn.Hidden = False
        Rng.AutoFilter field:=1, Criteria1:=Cri(1)
        Rng.AutoFilter field:=2, Criteria1:=Cri(2)
        Set Rng = Rng.Offset(Cri.Row - Sh.Range(Ques).Row, 2).Resize(1, Rng.Columns.Count - 1)
        Rng.Columns.EntireColumn.Hidden = True
        On Error Resume Next
        For Each Cri In Rng
            If IsNumeric(Cri) And (Cri > 0) Then Cri.Columns(1).EntireColumn.Hidden = False
        Next
        'On Error Resume Next
        '    Set Rng = Rng.SpecialCells(Type:=xlCellTypeBlanks)
        'If Err.Number = 0 Then Rng.Columns.EntireColumn.Hidden = True
    endSub:
        Sh.Cells(1).Activate
        Application.ScreenUpdating = True
        Set Sh = Nothing: Set Rng = Nothing: Set Cri = Nothing
    End Sub

    To bạn hoangvuluan:
    cám ơn bạn nhiều, sẵn bạn cho mình hỏi thăm là viết đoạn code trên bằng VBA fk? cái đó học có khó không? mình có thấy trên diễn đàn nhiều topic nhưng thật sự mình kô rành, bạn có thể chia sẻ link nào hướng dẫn cơ bản dùm mình đc kô?

  9. hands says:

    hỏi về lọc dữ liêu

    các anh giúp viết giúp em lọc dữ liêu từ 1 sheet khác , em muốn lọc cột ngày ra khi em bấm ngày vào thì nó sẽ hiện ra là ngày đó có ai đã đặt tiệc chưa , nhưng cái này em phải up hàng ngày , em đạ thử sử dụng pivot table nhưng khi em thêm vào em xem lại thi thấy cái mới ko có , cám ơn các anh+-+-+-+

    Dùng Pivottable bạn nên đặt Thêm một Name động nữa (dùng Offset) để excel tự cập nhật dữ liệu khi ta thêm vào! (vào Insert/Name/Define). Sau đó khi updated dữ liệu xong, bạn phải qua Pivottable, click chuột phải vào nó và chọn Refresh Data.

    Bạn xem file đính kèm, mình dùng Pivottable với 1 Name động (dùng Offset).

    Công thức thì có nhiều trên diễn đàn ,bạn tham khảo thêm cái này nhe .
    File bạn không có dử liệu nên mình thêm có 2 ngày hà , bạn thêm vào và text thử xem
    Thân

  10. hands says:

    Xin hỏi thêm về bài toán trích lọc

    Giả sử em có một cột có rất nhiều các Công ty, trong đó em muốn lọc ra Công ty có tên là Vieba. Nhưng từ Vieba tại các hàng trong cột trên lại không quy luật nào (ví dụ Công ty Vieba trả lãi; Hoàn trả cho Vieba…) thì các lọc sẽ như thế nào. Mong các cao thủ chỉ giúp.

    AutoFilter: Custom – Contains : Vieba
    Advanced Filter: từ khoá: *Vieba

    Bài toán của em là trích ra một bảng khác để in chứ không phải là lọc bình thường.

    Trích ra bản khác thì bạn dùng cái này nè, nó không bình thường đâu: Advanced Filter, trong đó có mục Copy to another location.
    Bạn xem File này nhe ,có phải lọc như thế không ?
    File của anh Anhtuan1066 .Nhìn dử liệu của bạn thật sự không hiểu !

    Về Advanced Filter thì em đã biết, nhưng em lại muốn lọc một cách tự động khi danh sách đầu vào cứ dài thêm. Anh có thể giúp em trường hợp này không?

    Thêm cách thứ 2+n

    Xài macro này, nếu lười thiết kế:
    Option Explicit

    Sub FindFilter()
    Dim Rng As Range, sRng As Range, rRng As Range
    Dim MyAdd As String
    Set Rng = Range(, .End(xlUp))
    Set sRng = Rng.Find("Vieba", , xlFormulas, xlPart)
    If Not sRng Is Nothing Then
    MyAdd = sRng.Address: = "KQLoc"
    Range(, .End(xlDown)).Clear
    Do
    .End(xlUp).Offset(1) = sRng.Value
    Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And MyAdd <> sRng.Address
    End If
    End Sub

    Từ cần tìm có thể thông qua bàn fím nhập vô biến kiểu chuỗi
    Bạn đưa dử liệu thật lên đi.. dù lọc trong sheet hay lọc sang sheet khác gì thì Advanced Filter vẫn làm được tuốt! … Đương nhiên là tự động rồi
    (dử liệu ít quá… lười làm lắm —> Sợ bạn ráp vào dử liệu thật không đúng, lại la làng)

  11. hands says:

    Trích lọc số liệu theo ngày

    Chào các bạn!
    Mình có 1 vấn đề về Excel nhờ các bạn giải quyết dùm như sau:
    Trong 1 Workbook có 2 sheet, sheet1 mình đặt tên là "Phieuthu"; sheet2 là "TôngTienCuaTungNgay".
    Trong đó sheet1 có 2 cột chính là B và C. Cột B dùng để ghi ngày tháng, cột C dùng để ghi số tiền.
    ở sheet2 có 2 cột chính là A và C. Cột A dùng để ghi ngày còn cột C mình dùng để đặt công thức sao cho nó tính tổng số tiền theo ngày ở sheet1.
    Rất mong các bạn chỉ giúp. Mình xem cảm ơn các bạn trước nhé.
    File đính kèm:

    2 sheet kèm theo đây:
    sheet1:
    |

    A

    |

    B

    |

    C

    |

    1

    |

    Số phiếu thu

    |

    NGÀY…

    |

    SỐ TiỀN

    |

    2

    |

    0801

    |

    01/02/2009

    |

    2.000

    |

    3

    |

    0802

    |

    01/02/2009

    |

    1.000

    |

    4

    |

    0803

    |

    01/02/2009

    |

    5.000

    |

    5

    |

    0804

    |

    01/02/2009

    |

    2.000

    |

    6

    |

    0805

    |

    02/02/2009

    |

    5.000

    |

    7

    |

    0806

    |

    02/02/2009

    |

    5.000

    |

    8

    |

    0807

    |

    02/02/2009

    |

    4.000

    |

    9

    |

    0808

    |

    02/02/2009

    |

    3.000

    |

    10

    |

    0809

    |

    20/02/2009

    |

    1.500

    |

    11

    |

    0810

    |

    20/02/2009

    |

    1.500

    |

    12

    |

    0811

    |

    20/02/2009

    |

    1.500

    |

    13

    |

    0812

    |

    20/02/2009

    |

    25.000

    |

    14

    |

    0813

    |

    20/02/2009

    |

    25.000

    |

    Sheet2:
    |

    A

    |

    B

    |

    C

    |

    D

    |

    1

    |

    NGÀY….

    |

    |

    TỔNG TiỀN
    (theo từng ngày)

    |

    |

    2

    |

    01/02/2009

    |=|

    9.000

    | |

    3

    |

    02/02/2009

    |=|

    15.300

    | |

    4

    |

    20/02/2009

    |=|

    49.050

    | |

    5

    | | | | |

    6

    |

    Công thức ở cột C phải đặt như thế nào để tính tổng số tiền được trích lọc theo ngày ở sheet1. Bạn nào biết xin chỉ giáo. Mình xin cảm ơn trước.

    | | | |

    Đã dùng VBA thì khỏi công thức —> Xài Consolidate là ăn tiền nhất

    Sub Tonghop()
    Sheet2.Range("A1").CurrentRegion.Offset(1).ClearContents
    With Sheet1.Range("A1").CurrentRegion.Offset(1, 2)
    Sheet2.Range("B2").Consolidate "'" & .Parent.Name & "'!" & .Address(, , 2), 9, , 1
    End With
    With Sheet2.Range("A1").CurrentRegion.SpecialCells(4)
    .Value = Evaluate("=ROW(R1:R1000)")
    End With
    End Sub

    Nhờ anh ndu96081631 giải thích đoạn code "Sheet2.Range("B2").Consolidate "'" & .Parent.Name & "'!" & .Address(, , 2), 9, , 1" có nghĩa là như thế nào? Xin chân thành cảm ơn anh.

    Consolidate bắt buộc ta biểu diển địa chỉ vùng dử liệu nguồn theo dạng R1C1 … và nếu dử liệu nguồn nằm tại sheet khác, file khác thì phải ghi rõ đường dẩn nơi chứa dử liệu
    Ở trong code của tôi:
    .Parent.Name là tên sheet —> Do phía trên có With Sheet1.Range(gì đó )… —> mà Parent là CHA MẸ —> Vậy cha mẹ của Sheet1.Range( gì đó ) chính là Sheet1
    .Address(, , 2) biểu diển địa chỉ vùng dử liệu theo dạng R1C1
    Số 9 là tổng hợp dử liệu theo kiểu SUM —> tham số này gần giống với tham số trong hàm SUBTOTAL ấy
    đại khái là vậy!
    Bạn có thể record macro quá trình tổng hợp dử liệu bằng Consolidate rồi xem code để biết thêm chi tiết (tôi cũng làm theo cách này đấy)
    Cách đây 1 tháng tôi chưa biết gì về Consolidate cả… May mắn được bạn Volga gợi ý cách dùng.. và tôi thấy nó khá hay khi dùng để tổng hợp số liệu —> Các bạn nghiên cứu thử xem!

    Kiến thức trên mạng thì nhiều lắm (không chỉ trên GPE) —> Có điều mọi người phải thừa nhận 1 điều rằng: Chỉ khi nào ta đụng đến 1 vấn đề nào đó có ứng dụng công cụ thì ta sẽ nhớ đến công cụ ấy lâu hơn
    Tôi thì chi xài công cụ, hoặc code nào đó mà tôi thật sự lãnh hội được
    Hồi đó tôi không đê ý đến Consolidate (dù có rất nhiều tài liệu đề cập) là vì tôi chẳng có gì đê ứng dụng nó cả —> Đến 1 hôm, vừa đúng lúc có 1 bài toán mà khi dùng Consolidate thì nó trở nên đơn giãn đến không ngờ (Và người gợi ý tôi dùng Consolidate cho bài toán ấy chính là bạn Volga)
    Bời vậy mới biết: Học, đọc cả ngàn quyển sách mà không ứng dụng cũng bằng thừa

    anh volga ơi cho em hỏi cái "=vt" là gì vậy anh em, cái đó khi em muốn thêm cột thì nó có vấn đề anh ah , cám ơn anh

    Bạn vào Insert>>Name>>Define sẽ biết "vt" là cái gì liền.
    Bạn có thể bấm Ctrl+ F3 sẽ thấy liền .
    bài lọc này không hay nữa bạn thử xem link này xem nhe ,nhìn xem những gì anh NDU chỉ nè
    [URL='https://www.giaiphapexcel.com/forum/showpost.php?p=131315&postcount=5'%5DLọc
    Thân

  12. hands says:

    Lọc theo khoảng dữ liệu có trong validation

    Em đưa lên một file ví dụ mẫu. Giờ em muốn lọc tên người theo độ tuổi từ 18 – 35 , 35 – 40 và từ 40 được ghi sẵn trong validation thì làm thế nào

    Lâu rồi không sử dụng Name động với công thức mảng. Gặp bài này hay quá nên làm liền. Bạn xem file nha

    Em rất thích cách bác [URL="https://www.giaiphapexcel.com/forum/member.php?u=29993"%5Dhoangdanh282vn làm, nhưng đọc và bắt chước hoài vẫn chưa làm được, mong bác [URL="https://www.giaiphapexcel.com/forum/member.php?u=29993"%5Dhoangdanh282vn cùng các bác trong GPE giúp em với. Em cũng đang có 1 vấn để tương tự:
    – Em có Sheet TongHop
    – Em muốn Lọc theo khoảng dữ liệu có trong validation như bác hoangdanh282vn làm, nhưng ở tại 1 sheet khác: VD: Sheet BaoCao
    – Dữ liệu em muốn lọc là theo tuần:
    VD:
    .Từ 02-03 đến 08-03
    .Từ 09-03 đến 15-03
    .Từ 16-03 đến 22-03

    Cám ơn các bác đã quan tâm giúp đỡ.

    Bài này tác giả tự mình gây khó khăn khi Validation là dạng text (18 —> 35) —> Thay vì thế, tôi đề nghị nên tách riêng tuổi nhỏ và lớn ra 2 cell khác nhau
    Như file đính kèm đây! Bạn tham khảo thử

    lại

  13. hands says:

    Nhờ giúp đỡ về lọc dữ liệu để báo cáo hàng xuất trong tháng!

    Chào các bạn, mình cũng thuộc dạng gà excel, nhưng đang phụ trách mảng xuất hàng hóa cho các đơn vị trong 1 khu du lịch.
    Mình có 1 bảng chi tiết hàng xuất cho các đơn vị trong tháng gồm có nhiều mặt hàng (có mã hàng, tên hàng, sl, đơn giá…) Mình có gửi kèm file.
    vấn đề đặt ra ở đây là:
    1. Có 1 số mặt hàng được xuất nhiều lần trong bảng chi tiết nên mình muốn lọc ra những mặt hàng nào đã xuất trong tháng và tổng của nó là bao nhiêu
    2. Khi đã có dữ liệu của phần 1. các bạn giúp mình làm 1 bảng báo cáo tổng hợp của tất cả các mặt hàng đã xuất trong tháng đó (mỗi mã hàng hoặc tên hàng chỉ xuất hiện 1 lần trong bảng tổng hợp nhưng có số lượng tổng)
    3. Nếu Các bạn dùng công thức vui lòng diễn giải dùm mình với nhé, để mình có thể áp dụng cho những tháng kế tiếp (có thể ít hoặc nhiều mặt hàng hơn tháng này…)
    rất mong sớm được sự giúp đở của các bạn trên diễn đàn.

    Bạn dùng PivotTable để thực hiện bài toán này nhé
    Tham khảo trong file đính kèm nhe
    Thân

    Thanks bạn nhiều lắm, nhưng bạn có thể làm 1 file mới nhưng bỏ cái ngày ra dùm mình được không? mình muốn tập hợp cả tháng không dùng từng ngày.
    Mà cái PivotTable mình cũng chưa rành lắm…bạn có thể nói thêm cho mình rõ được k?

    Đối với dữ liệu cửa bạn, cách làm như sau:
    1. Điền tháng: Thêm Cột sau cột Q, ghi tiêu đề là tháng. Tại ô R3, gõ công thức MONTH(P3) sau đó copy xuống đến dòng 178
    2. Tạo Pivot Table:
    – Vào menu DataPivort Table and PivotChart report…
    – Bước 1: Chọn Microsoft Office Excel list or database, và chọn PivotTable. Bấm Next
    – Bước 2: Chọn vùng dữ liệu. Tại Range: Chọ dữ liệu từ A2 đến R178. Kết quả hiển thị là Sheet1!$A$2:$R$178. Bấm Next
    – Bước 3: Chọn nơi hiển thị kết quả: Chọn New worksheet rồi chọn Layout
    – Màn hình Layout:
    + Bấm và rê nút Tháng vào vùng PAGE
    + Vùng ROW bạn có thể bấm và rê nút Mã hàng, Tên hàng ,…
    + Vùng COLUMN bạn có thể để Mã đơn vị nếu muốn
    + Vùng DATA, bạn để SL, Thành tiền, … Mặc nhiên là tính tổng. Sau khi để dữ liệu vào, bạn có thể thay đổi công thức và định dạng bằng các nhấp đúp chuột lên nó. Sau đó bấm OK và Finish.
    Ngoài ra bạn có thể nghiên cứu thêm phần Option để có kết quả như mong muốn.

    Cám ơn bạn solomon, để mình làm thử, có gì bạn giúp mình nhé 🙂

    Ah, các bạn ơi, cái file mình đưa lên vừa rồi đó mình muốn lọc theo tên hàng và mã hàng rồi đưa qua 1 sheet khác với đầy đủ các trường giống trong cái bảng đó luôn để làm thành 1 file báo cáo có dạng như vậy. Các bạn giúp mình với nhé.

    Nếu bạn muốn trích dòng hàng nào, trong bảng chi tiết hoặc bảng tổng hợp, bạn chỉ việc đến dòng có số lượng tương ứng bạn nhấp đúp chuột vào ô đó, tự động dữ liệu sẽ được mang sang 1 sheet mới, sau đó bạn muốn làm gì thì làm.

    Em cám ơn anh solomen nhiều lắm. Cái anh làm cho em đã đúng ý của em rồi. Tuy nhiên vấn đề em đặt ra vừa rồi có lẽ anh chưa hiểu hết ý em.
    Em muốn trong bảng BCCT và BCTH có luôn trường đơn giá vốn chưa VAT, đơn giá vốn có VAT, tiền VAT, đơn giá bán chưa VAT, đơn giá bán có VAT, Thành tiền vốn, thành tiền bán chưa VAT, thành tiền bán có VAT, ngày xuất, số phiếu… để em làm 1 báo cáo đầy đủ luôn.
    Trường hợp này sẽ có 1 vấn đề phát sinh thêm đó là giá của hàng hóa xuất nhiều đợt sẽ thay đổi theo thời điểm…nên khi báo cáo số lượng thì không sao nhưng về trị thì hoặc là lấy trung bình của các đơn giá nhân với tổng số lượng hoặc là số lượng nhân đơn giá theo thời điểm rồi sum lại.
    Nếu rãnh anh nghiên cứu giúp em cái này với nhé.
    Cám ơn anh!

    Bạn xem trong file đính kèm coi có đúng ý chưa nhé
    Đơn giá là đơn giá tính bình quân nhé
    Thân

    Thanks dom nhiều, đúng là như vậy đó, nhưng sao cái tên nó dài quá giờ muốn cho xuống thêm 1 dòng nữa để rút ngắn tên lại có được k? (giống alt + enter vậy)
    Trong phần PivotTable vùng DATA có 1 trường blank ở trên cùng là sao vậy…có như vậy nó mới ra 1 cái bảng hoàn chỉnh…còn mình làm mà đưa hết các trường vô trong vùng Row và data nó báo lỗi, chỉ cho có 2-3 trường gì đó thôi. Không hiểu chỗ này là sao Dom giải thích dùm nha. Rồi khi mình dưa 2-3 trường vô thì nó chạy mà cái giao diện khó coi lắm không có trật tự giống của Dom nó chạy ra kiểu bậc thang…nhìn rất khó hiểu.
    Dom có rãnh thì giải thích dùm mình nha
    Thanks nhiều nhe' !

    Bạn vào trang này để tham khảo nhá:
    https://www.giaiphapexcel.com/forum/showthread.php?t=6121
    Hoặc:
    https://www.giaiphapexcel.com/forum/showthread.php?t=6216

    Hi vọng bạn sẽ gặt hái nhiều điều ở đó
    Thân

  14. hands says:

    Lọc theo điều kiện

    Chào các Anh Chị!
    Tôi có một vấn đề cần được các anh chị giúp đở như sau:
    Gia đình tôi làm dịch vụ cung cấp khoảng 50 loại sản phẩm cho khoảng 10 khách hàng; số sản phảm này được mua từ bán thành phẩm của 4 nhà cung cấp khác (theo yêu cầu của khách hàng). Giá cả mua, bán cho từng loại sản phẩm tùy theo yêu cầu khách hàng.
    Để thống kê đầy đủ và chính xác cũng như tính được lợi nhuận thì phải dùng công thức như thế nào (tôi không biết gì về VBA, công thức Excel thì lơ mơ). Tôi gởi kèm theo file ví dụ mong các anh chị giúp đở.

    Nhìn vào như thế thì trước mắt dùng AutoFilter Cho nhanh đi bạn !
    Công thức của bạn quá hay chứ lơ mơ gì

    Về công thức thì cũng biết tí tí nhưng kẹt ở chổ không biết dùng công thức kiểu nào cho phần nhập liệu ở sheet nhatky ấy. Làm thế nào để lấy nhanh nhất và chính xác nhất giá của một loại hàng khi biết nhà CC và KH (50 loại hàng của 4 nhà cung cấp bán cho 10 khách hàng) dò thủ công thì phê quá.
    Tôi đã thử đặt mã khách và mã hàng nhưng vẫn còn trục trặc sao ấy nên nhờ các anh chị giúp đở hướng dẩn thêm
    cảm ơn nhiều nhiều!!!

    Bạn dùng macro sự kiện sau, như là thêm một tham khảo

    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next: Dim Col As Byte
    'NhatKy'
    If Not Intersect(Target, Columns("D:D")) Is Nothing Then
    3 Col = 5 + Choose(Right(Target.Value, 1) + 1, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8)
    Target.Offset(, 2).Value = Sheets("QuiUoc").Columns("B:B").Find(Target.Offset(, -2), _
    , xlFormulas, xlWhole).Offset(, Col)
    ElseIf Not Intersect(Target, Columns("E:e")) Is Nothing Then
    6 Col = Switch(Target.Value = "A", 1, Target = "B", 2, Target = "C", 3, Target = "D", 4)
    Target.Offset(, 2).Value = Sheets("QuiUoc").Columns("B:B").Find(Target.Offset(, -3), _
    , xlFormulas, xlWhole).Offset(, Col)
    End If
    End SubHướng dẫn sử dụng:
    * Bạn Copy macro này & dán vô SheetName có tên là 'NhatKy' (Phải chuột vô thanh SheetName, chọn dòng cuối để mở cửa sổ VBE & . . .
    * Để sử dụng hàm Choose() cho ngắn câu lệnh dòng thứ 3, mình đã gán tên (mã) khách hàng biến thiên từ K1. . K10. Như vậy tên trường của 'QuyUoc' từ 'G2..P2' có tên tương ứng là K1. . K10 (Việc này cũng không quan trọng cho lắm,so với việc phải nhập mã khách hàng chỉ là các mã như vậy. Nếu có thêm khách hàng nữa thì phải chuyển đổi khác – ta sẽ tính sau!–=0)
    * Khi nhập 1 mã khách hàng đúng tại dòng nào đó của cột 'D', cột 'F' qui chiếu sẽ được cập nhật;
    Tương tự như vậy, khi nhập nhà cung cấp vô cột 'E', sẽ có giá trị thích ứng tại cột 'G' với dong tương ứng

  15. hands says:

    Xin được giúp đỡ về lọc tên hàng

    Em có file hàng cắt trong đó có một số lô cắt lại với các size khác nhau( như trong bảng).Em muốn lọc các lô hàng trùng tên này để mục đích chia mỗi chuyền làm một size. Vì các lô hàng này rất nhiều nên nhiều khi không để ý hết nên có lần chia 1 chuyền 2 size. Xin được các anh chị trong diễn đàn chỉ giúp có cách nào để nó tự lọc sang bên phải và hiện size ở chuyền nào đó đã chia không ( kể cả trường hợp lỡ chia MTL+MTD cho một chuyền)

    Bạn thử xài macro sau

    Option Explicit
    Sub FilterAll()
    Dim jJ As Long: Dim MyAdd As String
    Dim Rng As Range, sRng As Range, Clls As Range

    Set Rng = Range(, .End(xlDown))
    Range("H2:M" & Rng.Rows.Count).Clear
    Rng.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=, Unique:=True
    For Each Clls In Range(, .End(xlDown))
    Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
    MyAdd = sRng.Address
    Do
    jJ = sRng.Offset(, 3)
    If Clls.Offset(, jJ).Value = "" Then
    Clls.Offset(, jJ).Value = sRng.Offset(, 1)
    Else
    Clls.Offset(, jJ).Value = Clls.Offset(, jJ).Value & _
    "+" & sRng.Offset(, 1)
    End If
    Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    Next Clls
    End Sub

    :-=

    Bài này có "nối chuổi" nếu dùng công thức thì sẽ rất cồng kềnh
    Tặng bạn 2 hàm tự tạo: 1 cái để trích lọc duy nhất và 1 cái dùng để nối chuổi theo điều kiện!

    Function JoinIf(VungDK1 As Range, DK1 As Variant, VungDK2 As Range, DK2 As Variant, VungKQ As Range, Optional PC As String = "") As String
    Dim i, Temp As String
    For i = 1 To VungKQ.Count
    If VungDK1(i) = DK1 And VungDK2(i) = DK2 Then Temp = Temp & PC & VungKQ(i)
    Next
    JoinIf = Mid(Temp, Len(PC) + 1, Len(Temp))
    End Function
    Function Unique(Vung As Range, STT As Long) As Variant
    Dim i As Long, K As Long
    For i = 1 To Vung.Cells.Count
    If Vung(i) <> "" Then
    If i = Application.WorksheetFunction.Match(Vung(i), Vung, 0) Then
    K = K + 1
    End If
    If K = STT Then Unique = Vung(i): Exit For
    End If
    Next i
    End FunctionXem file đính kèm
    ———————

    Công nhận bác HYen đúng là chuyên gia về Find —> Với Find và FindNext, học hoài vẫn thấy ngu!

  16. hands says:

    Nhờ giúp đỡ lọc dữ liệu

    Nhờ các bạn giúp mình lọc dữ liệu theo Mã tài khoản và mã đối tượng (một đối tượng có thể có nhiều tài khoản và ngược lại).
    Ví dụ mình muốn lọc mã đối tượng NN_CTVT trong mã tài khoản là 138822
    Mình gởi file dữ liệu cần lọc, các bạn giúp mình nhe.

    Cảm ơn các bạn

    https://upload.haynhat.com/locdulieu.rar

    Bạn muốn lọc là lọc như thế nào. Căn cứ vào sheet Data, ta sẽ trích lọc dữ liệu theo điều kiện ở một sheet mới hay lọc ngay tại sheet Data luôn. Lọc theo tài khoản là lọc ở bên Nợ hay bên Có.

    Nếu chỉ đơn thuần là trích lọc dữ liệu ngay tại sheet Data thì ta chỉ cần dùng Autofilter theo cột Mã đối tượng và Tài khoản là ok rồi. Nếu cần thiết thì có thể dùng VBA để giải quyết yêu cầu của bạn

    Bạn nói rõ hơn tí nha.

    Mình muốn lọc sang sheet mới, và lấy cả 2 cột có và nợ luôn. Mục đích của mình là muốn làm 1 bảng tổng hợp các phát sinh theo đối tượng và theo tài khoản, và phải có chi tiết của từng mục tổng hợp đó để khi cần mình có thể giải trình nên không dùng Filter được

    Giúp mình nhé

    Mình sẽ hướng dẫn từ xa, bạn làm theo xem sao nha

    (*) Dùng chuột chọn 4 dòng đầu tiên của trang tính;
    Vô menu Insert để thêm 4 dòng trống;
    (*) Bạn copy tiêu đề tại dòng 5 chép sang vùng 'G5:K5'
    Sau đó chép vùng 'G5:J5' đến vùng 'G1:J1'
    (*) Bạn nhập 'NN_CTVT' vô ô 'G2' & '138822' vô 'I2'

    (*) Sau đó vô menu Data -> Fỉlte -> Advanced Fỉlte
    Tại ngăn Action ta chọn dòng thứ 2 (Copy to another location)
    Tại CS (cửa sổ) Lít range ta nhập $Ạ:$E2156
    Tại CS Criteria range ta nhập $G1:$I$1
    Ngăn tiếp ta nhập $G5:$K5 & nhấn chọn 'OK'

    Chiêm nghiệm kết quả tại vùng dữ liệu mới xuất hiện.

    Chúc thành công! –=0

    Bạn ơi, nếu lọc như vậy thì chỉ được 1 bên nợ thôi, còn cũng mã đó và tài khoản đó nhưng phát sinh bên có sẽ không ra. Và như vậy thì mỗi đối tượng mình lại phải làm 1 lần đúng không bạn?

    Bạn xem file đính kèm xem có đúng ý bạn ko?

    Hi
    Bạn xem thử cái này nhe ,lâu quá không sử dụng hơi lúng túng .
    Riêng ngay chỗ Validation thì làm như bạn CPH làm là ok ,(Trích lọc ra một ds duy nhất rồi đưa vào Validation)
    Thân

    Cảm ơn các bạn nhiều!

    Mình đang nghiên cứu file của các bạn gởi. Có lẻ file của bạn Huuthang_bd phù hợp với mình nhất.

    Mời bạn xem file này.

    Mấy cái list thì bạn tự làm nha.

  17. hands says:

    lọc dl theo mã và trong khoảng thời gian

    EM muốn lọc ra trong khoảng thời gian mình nhập vào theo mã mình nhập vào xem máy đó sữa chữa những gì. Mong các bác giúp

    Gửi cho bạn file này

  18. hands says:

    Lọc dữ liệu

    Nhờ các sư huynh đệ tỷ mụi.
    Mấy ngày nay loay hoay mãi cái vụ lọc dữ liệu rồi mà vẫn không thỏa mãn.Sau khi đã dạo một vòng trong diễn đàn.Đành post lên nhờ bà con cô bác giúp đỡ vậy 🙁
    Mình có 1 bảng nhật trình hàng ngày cho các tổ thợ ( Sheet1) rùi giờ muốn tổng kểt lại trong Sheet2 yêu cầu là nhập ngày và tổ thợ trong cái sheet2 sẽ hiện ra ngày đó tổ thợ đó làm những nội dung gì và vật tư dùng như thế nào?
    Huynh nào biết chỉ dùm e nó cái nha.Tks trước luôn }}}}}

    Mình dùng 1 cột phụ cho bạn dễ hình dung.
    Bạn xem file đính kèm nha

    Gửi bạn file này, không cần dùng cột phụ

  19. hands says:

    Bác XuanThanh ơi!bác cho em pass để e xem code được không? Mà em ko muốn dùng VBA,em muốn dùng hàm excel. Bác giúp em với.EM muốn lọc ra trong khoảng thời gian mình nhập vào theo mã mình nhập vào xem máy đó sữa chữa những gì. Mong các bác giúp

    Xin lỗi, Pass là xuanthanh

    Bạn xem file đình kèm nha.
    Bài làm chỉ hướng dẫn thôi. Khi làm bạn có thể kết hợp với hàm Offset để làm cho dữ liệu được tinh gọn và làm cho máy chạy nhanh hơn nếu dữ liệu lớn.

    Nếu dùng công thức thì cách của Hoangdanh282vn là hay lắm rồi… Còn muốn dùng code thì tham khảo tại đây:
    https://www.giaiphapexcel.com/forum/showthread.php?t=23166&page=2
    Bài số #18 gần giống với yêu cầu của bạn đấy —> Code dựa trên cơ sở của AutoFilter nên bảo đảm tốc độ cực nhanh

  20. hands says:

    Cho mình hỏi xíu, trong cột vật tư đó mình thấy khi nào có vật tư thì mới hiện còn ko có thì không hiện ( đang hiển thị là 0 ) để nhiều khi rối mắt quá.
    Tks nha!

    Tôi có 2 cách tùy bạn chọn nhé

    Cách 1 :
    Vào Menu/Tools/Options, tại tab View bỏ chọn Zero value.

    Cách 2 :
    Tại F6 sửa thêm công thức sau rồi fill xuống :

    F6=IF(OR(ROW(1:1)>MAX(Sheet1!$A$7:$A$37),ISBLANK(VLOOKUP(ROW(1:1),Sheet1!$A$7:$L$37,12,0))),"",VLOOKUP(ROW(1:1),Sheet1!$A$7:$L$37,12,0))

  21. hands says:

    EM xài offset cho DATA bằng công thức:OFFSET(NKSUACHUA!$A$5,,,COUNTA(NKSUACHUA!$B:$B)-1,7)
    Lại không ra kết quả. Bác xem em dùng công thức đúng chưa?

    Bạn thử lại xem, mình dùng được đấy thôi

    Bác xem em lỗi ở đâu với. Em tìm mãi không ra

    Bạn không chỉ rõ chổ lỗi của bạn là gì thì sao mình biết mà sửa được chứ.
    RIêng cột STT, dùng hàm if thì bạn nên trả vể rỗng "" thay vì trả về khoảng trắng " ". Như thế sẽ bị lỗi #N/A

    Em bị lỗi ở sheet THRIENG. Em dùng công thức như của bác nhưng không lọc ra được

    Bạn xem lại công thức trong cột H của sheet "NKSUACHUA" xem. Không thể nào cùng một lúc mà ta có thể trích lọc dữ liệu theo điều kiện ở 2 sheet khác nhau được.

    Bạn nên thêm một cột I nữa, cột này để dùng cho sheet "THRIENG". Cột H dùng cho sheet "BCSUACHUA".

    Bác hoangdanh ơi!Em xem ở file QL thiet bi ver 2.0 em up lên ấy. Ở đó mỗi cột em lọc một sheet khác nhau rồi mà vẫn không ra kết quả ở sheet THRIENG

  22. hands says:

    để biết dữ liệu bị nhập trùng

    Xin các bạn chỉ giúp: VD Trong vùng A1:A500 để biết dữ liệu bị nhập trùng (bị lặp lại) có cách nào bảo Excel thông báo cho ta biết dự liệu này đã lặp lại lầm thứ mấy …? được khộng (DL có thể là số, chữ hoặc ngày tháng năm).

    Bạn dùng công thức này:

    B1=COUNTIF($A$1:A1,A1)-1

    Copy công thức xuống.
    Lập cho bạn macro khó nhứt, cái còn lại bạn thử sửa từ cái này nha!

    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Columns(1)) Is Nothing And Target.Value <> "" Then
    Dim Rng As Range, sRng As Range: Dim Dem As Byte
    Dim Format_ As String, MyAdd As String

    Set Rng = Range(, Target.Offset(9))
    5 If IsDate(Target.Value) Then
    Format_ = Target.NumberFormat: Rng.NumberFormat = "m/d/yyyy"
    7 End If
    Set sRng = Rng.Find(Format(Target.Value, "m/d/yyyy"), , xlFormulas, xlWhole)
    If sRng Is Nothing Then
    MsgBox "Chua Co Trung"
    Else
    MyAdd = sRng.Address
    Do
    Dem = 1 + Dem
    Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    MsgBox Dem & " La So Lan Nhap Trung", , "GPE.COM"
    sRng.NumberFormat = Format_
    End If
    End Sub

    Bạn hãy sử dụng công thức của bạn huuthang_bd trong data->validation->chọn custom để điền công thức vào. Mình toàn dùng công thức này để kiểm tra dữ liệu có trùng không

  23. hands says:

    lọc và sắp xếp nội dung theo cùng một mã

    Em muốn khi điền đk lọc theo năm ở sheet 2 thì sẽ ra được nội dung lọc if cùng cùng một mã thì xếp chung với nhau. Lọc thì em biết lọc rồi nhưng làm sao để lọc cùng một mã thì sếp chung với nhau thì phải làm như thế nào?

    Bạn xem trong file kèm nhé.

    Nếu như bài này muốn đưa công thức vào Name thì sao anh ?
    Em kém quá suy nghỉ mãi mà không có cách nào ?
    Thanks!!!!!!!!!!!!!!!!!!!!!!!

    Làm cho bạn bằng name đây!
    Salam dùng RANK còn tôi dùng MATCH –> Có thể ngắn hơn đấy!

  24. hands says:

    DL lọc bị thừa,mọi người tìm lỗi giùm

    Ở sheet BCCN, nếu em nhập vào tháng 3 thì lọc đúng, nhưng nếu nhập đk là tháng 4 hay một tháng bất kỳ thì nó luôn lọc thừa 1 tháng 3 vào. mọi người xem công thức và chỉ giùm xem em sai ở đâu

    bác thay công thức

    =IF(OR(MONTH(B7)=BCCN!$E$6,YEAR(B7)=BCCN!$G$6),MAX($I$6:I6)+1,"")

    thành

    =IF(AND(MONTH(B7)=BCCN!$E$6,YEAR(B7)=BCCN!$G$6),MAX($I$6:I6)+1,"")

    NHÉ

    Giờ em muốn nếu ở NKCN có dòng nào ở phần ghi chú là CĐ mới thì số lượng cổ phần chuyển nhượng sẽ tự động điền vào ô CPTDCN ở sheet DS và không cộng số cổ phần đó vào Tổng số cp sở hữu thì làm thế nào?

    Các ô ở cột Vùng lọc bạn dùng hàm if( or …..) nên mới bị bạn hãy thay bằng hàm if(and….)như sau :

    =IF(AND(MONTH(B11)=BCCN!$E$6,YEAR(B11)=BCCN!$G$6),MAX($I$6:I10)+1,"")

  25. hands says:

    Lọc ra danh theo 3 điều kiện .

    Giúp em lọc danh sách này ra theo 3 điều kiện .
    -Từ ngày
    – Đến ngày
    -Tên Khách hàng
    Em tìm cách đưa vào name mà không được ?
    + Giúp em tạo ra name STT ,mà nó trả ra vị trí dòng thỏa mảng 3 điều kiện trên là được !
    + Nếu không thỏa 3 điều thì lấy hết dử liệu
    + Nếu thoả 1 trong 3 điều kiện củng lọc ra
    Thanks!
    Em có làm thử ở cột tô màu đỏ mà nó ra sai .

    Em muốn có kết quả như thế vì ,yêu cầu tương [URL='https://www.giaiphapexcel.com/forum/showthread.php?t=21259'%5Dtự như bài này của anh DOSNET ,nhưng điều kiện and ở đây thì phải làm sau cho đúng ?

    Bạn xem đã hợp ý bạn chưa

    Cám ơn bạn !
    Mình muốn dưa nó vào name luôn !
    Công thức của bạn cần cố định dòng đk lại mới đúng ở cột phụ á!
    Thanks!

    Bạn sai 2 chổ:
    OFFSET(ds,,9,,)
    Phải sửa lại thành:
    OFFSET(ds,,9,,1) —> Resize nó thành 1 cột thôi chứ
    và:
    ROWS(ds)
    Đúng ra phải là:
    ROW(ds) —> ROWS và ROW hoàn toàn khác nhau cơ mà
    Tuy nhiên nếu là tôi thì tôi thích cái này hơn:
    ROW(INDIRECT("1:"&ROWS(DS)))
    Nó giúp cho công thức lọc sau này ngắn gọn hơn
    Vậy là đặt name được rồi:
    DK=IF((OFFSET(ds,,,,1)>=Loc!$F$3)*(OFFSET(ds,,,,1)<=Loc!$I$3)+(OFFSET(ds,,9,,1)=Loc!$H$4),ROW(ds),"")

    Cám ơn Anh !
    Nhưng công thúc trên vẫn chưa đúng .
    +Từ ngày đến ngày mà ,Những ngày nào lớn hơn hoặc bằng 01/07/09 & nhỏ hơn hoặc bằng 20/07/09 & Khách hàng = Chị Tuyết .
    + Nếu không thỏa 3 điều thì lấy hết dử liệu
    + Nếu thoả 1 trong 3 điều kiện củng lọc ra
    Công thức của anh em áp vào nó ra thế này .(Cột màu đỏ ).
    ở đây chỉ có ngày 01/07/09 là thỏa đk thôi .
    Thanks!!!!!!!!!!!!!!!!!

    DK=IF((OFFSET(ds,,,,1)>=Loc!$F$3)*(OFFSET(ds,,,,1)<=Loc!$I$3)[COLOR=Red]*[/COLOR](OFFSET(ds,,9,,1)=Loc!$H$4),ROW(ds),"")

    Cái này hình như là dấu * chứ Bác ndu.

    Tôi đâu có biết —> Tôi chỉ sửa lại công thức sao có nó đúng thôi… còn việc ràng buộc điều kiện thế nào là việc của các bạn chứ

    Giúp em tạo name làm sau mà khi .
    Có đk ngày mà không có đk khách hàng thì củng lọc lấy dử liệu ra và ngược lại .
    Hu hu ….

    Chưa hiểu lắm! KHÔNG CÓ D/K KHÁCH có phải là khi ta xóa cell KHÁCH đi, đúng không?

    Volga chú ý name STT trong bài của DOSNET, phải thật sự hiểu vấn đề mới ứng dụng tốt được. Xem lại ví dụ và làm thử nhé. Thân!

    Đúng rồi anh ,Trường hợp không có ngày củng vậy (Lọc theo tên khách hàng )thì lúc đó ngày củng bị xoá hết .

    Thử xem như thế này được chưa:

  26. hands says:

    Nhớ Thắng mà mình làm được thế này nè .Công nhận mình tệ ghê thật +-+-+-+.
    Đứng trước một câu hỏi sau mình không biết làm gì hết vậy ta ?Hoàn toàn không biết cách đặc ra hướng giải quyết …+-+-+-+
    Một vấn đề gây khó khăn cho em nữa .Làm sau lấy số lượng tương ứng với mã hàng ?các anh giúp dùm em .

    Cám ơn Bạn nhiều …
    Mình rút lại nè

    Càng lúc yêu cầu càng cao.. cho đến 1 lúc bạn sẽ thấy công thức không thể đáp ứng nổi —> Vậy sao bạn không thử dùng PivotTable hoặc VBA nhỉ?

    – VBA thì không thể ,không biết thì không nên sử dụng ,nữa chừng bị hỏng gì đó thì chết em .Không biết đường đâu mà mò …
    – Pivot Table không rành lắm .
    ???.Em rất thích công thức ,VBA lúc này em chưa cần phải tìm hiểu ,chưa đến lúc (Anh đã từng chỉ em ghi một Macro ra sao rồi mà ).
    Thanks!

    Cái này dùng sumproduct được mà

    Bạn giúp mình đi ,có khi tên khách hàng bị xoá đó nhe .Bạn xem từ đầu sẽ hiểu mình muốn kết quả như thế nào. Trong File đó có một Name thoả 3 đk trên …(Trả ra vị trí dòng )Bây giờ làm sao lấy số lượng tương ứng với các mả mình ghi dấu ? đó .
    Thanks!

  27. hands says:

    Giúp mình lọc bộ số liệu

    Mình có bộ số liệu cần mọi người giúp mình với! Mình cần lọc bộ số liệu nhưng chưa biết cách nào ngoài làm vo!. Bộ số liệu đó mình cần lọc ra những cột mình đã đánh dấu bằng màu sang một trang mới!! số liệu cần lọc là "DN01_8Nam" mọi người giúp mình vơi, số liệu này mình đã cắt bớt đi!

    Chưa rõ hết ý của bạn

    Macro sau sẽ copy toàn bộ các dữ liệu đã tô màu sang Sheet2
    Option Explicit
    Sub FilterForColor()
    Dim Rng As Range, fRng As Range, Clls As Range
    Dim eRw As Long: Dim Sh As Worksheet

    Set Rng = Range(, .End(xlToLeft))
    eRw = .End(xlUp).Row: Set Sh = Sheets("Sheet2")
    For Each Clls In Rng
    With Clls.Interior
    If .ColorIndex > 2 Then
    Sh..End(xlToLeft).Offset(, 1).Resize(eRw).Value = Clls.Resize(, eRw).Value
    End If
    End With
    Next Clls
    End Sub

  28. hands says:

    Cám ơn mọi người đã giúp mình, Mình có 90 bộ số liệu và muốn tách ở từng bộ số liệu những Phần mình đã đánh dấu mỗi bộ số liệu gồm có 253 cột và 16384 dòng! Ý mình là trong 253 cột đó mình muốn tách ra những cột bắt đầu bằng LHDN,laođộng,ngangkd,thunhap,doanhthu,loinhuan " lần trước gửi là mình đã đánh dấu sẵn rồi cho mọi người dễ nhận biết ý của mình thôi!! Mình sẽ trích một đoạn của bộ số liệu mình chưa tô màu.. mọi người giúp mình tách những cột bắt đầu bằng " LHDN, laođộng,ngangkd,thunhap,doanhthu,loinhuan " Mọi người cố gắng giúp mình với vì mình đang bị mắc. Mình xin cám ơn!

    Ý của bạn phải thế này không vậy!

    Cám ơn bạn! Mình muốn có cả các năm sau nữa! Cậu xem rồi giúp mình với nhé!
    Cậu xem lại file này nhé!
    Cậu làm thế này cũng gần đúng rùi, nhưng mình muốn có cả các năm sau nữa? kết quả cuồi cùng nếu làm được sẽ như sau file mình đính kèm,," mình chỉ làm vo một cái thôi" mình còn 90 số liệu nữa mọi người giúp mình với!

    Chạy Maro này ở Sheet1. Nhớ sửa lại code cho phù hợp với file dữ liệu thật.
    Sub RutTrich()
    Dim Data As Range
    MyArray = Array("lhdn", "laodong", "nganhkd", "thunhap", "doanhthu", "loinhuan")
    For Each Rng In Range(, .End(xlToLeft))
    For i = 0 To UBound(MyArray)
    If Left(Rng, Len(MyArray(i))) = MyArray(i) Then
    If Data Is Nothing Then
    Set Data = Rng.Resize(.End(xlUp).Row)
    Else
    Set Data = Union(Data, Rng.Resize(.End(xlUp).Row))
    End If
    End If
    Next
    Next
    Data.Copy Sheets("Sheet2").
    End Sub

  29. hands says:

    Giúp lọc dữ liệu!

    Mong các anh (chị) giúp dùm em code lọc báo cáo theo file em đính kèm.
    Dữ liệu lọc được lấy từ sheets "data", kết quả lọc ra ở sheets "results". Kết quả sau khi lọc em có làm mẫu ở sheets "results2" (Em làm thủ công ^^).
    Điều kiện lọc dựa vào "nơi đăng ký " ở sheet data.
    Cảm ơn anh (chị).

    Macro của bạn đây:

    Option Explicit
    Sub DSDK()
    Dim Rng As Range, sRng As Range, Clls As Range, Sh As Worksheet, dRng As Range
    Dim eRw As Long, fRw As Long, TTu As Byte
    Dim MyAdd As String

    Sheets("Data").Select: Set Sh = Sheets("Results")
    eRw = .End(xlUp).Row: Set Rng = Range("F1:F" & eRw)
    Sh.Range("A5:Z" & eRw + 29).Clear
    1 ' Tìm & Chép Theo Loai Hình Dich Vu:'
    For Each Clls In Range("AA2:AA" & .End(xlUp).Row)
    Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
    MyAdd = sRng.Address: TTu = TTu + 1
    With Sh..End(xlUp)
    If TTu > 1 Then
    .Offset(1).FormulaR1C1 = "=TCong"
    .Offset(2, -1).Value = Choose(TTu, "I", "II", "III", "IV", "V", "VI")
    .Offset(2).Value = Clls.Value
    Else
    .Offset(1, -1).Value = "I"
    .Offset(1).Value = Clls.Value
    End If
    End With
    Do
    With Sh..End(xlUp).Offset(1, -1)
    .Resize(, 18).Value = sRng.Offset(, -5).Resize(, 18).Value
    End With
    Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    Next Clls
    eRw = Range("AA2:AA" & .End(xlUp).Row).Rows.Count
    Sh.Select
    2 'Tô Màu Cho Vui!'
    With .Interior
    If .ColorIndex < 42 Then
    .Resize(, 20).Interior.ColorIndex = .ColorIndex + 1
    Else
    .Resize(, 20).Interior.ColorIndex = 34
    End If
    End With
    3 ' Dinh Dang & Tính Tong:'
    For TTu = 1 To eRw
    MyAdd = Choose(TTu, "I", "II", "III", "IV", "V", "VI")
    Set sRng = Columns(1).Find(MyAdd)
    If Not sRng Is Nothing Then
    If sRng = "I" Then
    sRng.Resize(, 2).Font.Bold = True
    fRw = sRng.Row + 1
    Else
    sRng.Offset(-1).Resize(2, 2).Font.Bold = True
    '14 & 15
    sRng.Offset(-1, 13).FormulaR1C1 = "=sum(R[-" & (sRng.Row – fRw) & "]C:RC)"
    sRng.Offset(-1, 14).FormulaR1C1 = "=sum(R[-" & (sRng.Row – fRw) & "]C:RC)"
    fRw = sRng.Row + 1
    End If
    End If
    Next TTu
    End Sub

    Cảm ơn anh SA nhiều. Ở phần Other không có dòng tổng cộng? Em muốn thêm dòng tổng cộng của 4 phần trên vào bên dưới nữa thì phải thêm như thế nào vậy?

    Tôi có cảm giác dử liệu của bạn nếu dùng PivotTable sẽ nhanh hơn đấy —> Sao bạn không thử xem!
    Trong khi chờ đợi, xài lối truyền thống này tiếp đi nha.

    Option Explicit
    Sub DSDK()
    Dim Rng As Range, sRng As Range, Clls As Range, Sh As Worksheet, dRng As Range
    Dim eRw As Long, fRw As Long, TTu As Byte
    Dim MyAdd As String

    Sheets("Data").Select: Set Sh = Sheets("Results")
    eRw = .End(xlUp).Row: Set Rng = Range("F1:F" & eRw)
    Sh.Range("A5:Z" & eRw + 29).Clear: Application.ScreenUpdating = False
    1 ' Tìm & Chép Theo Loai Hình Dich Vu:'
    For Each Clls In Range("AA2:AA" & .End(xlUp).Row)
    Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
    MyAdd = sRng.Address: TTu = TTu + 1
    With Sh..End(xlUp)
    If TTu > 1 Then
    .Offset(1).FormulaR1C1 = "=TCong": fRw = 1
    End If
    .Offset(1 + fRw, -1).Value = Choose(TTu, "I", "II", "III", "IV", "V", "VI")
    .Offset(1 + fRw).Value = Clls.Value
    End With
    Do
    With Sh..End(xlUp).Offset(1, -1)
    .Resize(, 18).Value = sRng.Offset(, -5).Resize(, 18).Value
    End With
    Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    Next Clls
    eRw = Range("AA2:AA" & .End(xlUp).Row).Rows.Count
    Sh.Select
    2 'Tô Màu Cho Vui!'
    With .Interior
    If .ColorIndex < 42 Then
    .Resize(, 20).Interior.ColorIndex = .ColorIndex + 1
    Else
    .Resize(, 20).Interior.ColorIndex = 34
    End If
    End With
    3 ' Dinh Dang & Tính Tong:'
    For TTu = 1 To eRw
    Set sRng = Columns(1).Find(Choose(TTu, "I", "II", "III", "IV", "V", "VI"))
    If Not sRng Is Nothing Then
    If sRng = "I" Then
    sRng.Resize(, 2).Font.Bold = True
    fRw = sRng.Row + 1
    Else
    sRng.Offset(-1).Resize(2, 2).Font.Bold = True
    MyAdd = "=sum(R[-" & (sRng.Row – fRw) & "]C:RC)"
    39 sRng.Offset(-1, 13).FormulaR1C1 = MyAdd
    310 sRng.Offset(-1, 14).FormulaR1C1 = MyAdd
    fRw = sRng.Row + 1
    End If
    End If
    Next TTu
    4 ' Xu Lí 2 Dòng Cuoi:'
    With .End(xlUp).Offset(1)
    .Resize(2).FormulaR1C1 = "=TCong": .Resize(2).Font.Bold = True
    MyAdd = "=sum(R[-" & (.Row – fRw) & "]C:RC)"
    43 .Offset(, 12).FormulaR1C1 = MyAdd: .Offset(, 13).FormulaR1C1 = MyAdd
    .Offset(1).Value = .Value & " chung:"
    MyAdd = "=sum(R[-" & (.Row – 4) & "]C:RC)/2"
    46 .Offset(1, 12).FormulaR1C1 = MyAdd: .Offset(1, 13).FormulaR1C1 = MyAdd
    .Offset(1, 12).Resize(, 2).Font.Bold = True
    End With
    End Sub

    To anh NDU: PivotTable em cũng biết sơ sơ nên cũng không linh hoạt lắm. Anh có thể dành chút thời gian test lên file đính kèm luôn dùm em được không?
    To ChanhTQ: Mình sẽ test thử code của bạn xem như thế nào rồi có ý kiến sau.
    Code hoạt động tốt nhưng có một số cột chưa có dòng tổng cộng, chỉ có tổng cộng 2 cột cuối thôi. Các bạn sửa giúp mình với.
    Cảm ơn tất cả.
    Option Explicit
    Sub DSDK()
    Dim Rng As Range, sRng As Range, Clls As Range, Sh As Worksheet, dRng As Range
    Dim eRw As Long, fRw As Long, TTu As Byte
    Dim MyAdd As String

    Sheets("Data").Select: Set Sh = Sheets("Results")
    eRw = .End(xlUp).Row: Set Rng = Range("F1:F" & eRw)
    Sh.Range("A5:Z" & eRw + 29).Clear: Application.ScreenUpdating = False
    1 ' Tìm & Chép Theo Loai Hình Dich Vu:'
    For Each Clls In Range("AA2:AA" & .End(xlUp).Row)
    Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
    MyAdd = sRng.Address: TTu = TTu + 1
    With Sh..End(xlUp)
    If TTu > 1 Then
    .Offset(1).FormulaR1C1 = "=TCong": fRw = 1
    End If
    .Offset(1 + fRw, -1).Value = Choose(TTu, "I", "II", "III", "IV", "V", "VI")
    .Offset(1 + fRw).Value = Clls.Value
    End With
    Do
    With Sh..End(xlUp).Offset(1, -1)
    .Resize(, 18).Value = sRng.Offset(, -5).Resize(, 18).Value
    End With
    Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    Next Clls
    eRw = Range("AA2:AA" & .End(xlUp).Row).Rows.Count
    Sh.Select
    2 'Tô Màu Cho Vui!'
    With .Interior
    If .ColorIndex < 42 Then
    .Resize(, 20).Interior.ColorIndex = .ColorIndex + 1
    Else
    .Resize(, 20).Interior.ColorIndex = 34
    End If
    End With
    3 ' Dinh Dang & Tính Tong:'
    For TTu = 1 To eRw
    Set sRng = Columns(1).Find(Choose(TTu, "I", "II", "III", "IV", "V", "VI"))
    If Not sRng Is Nothing Then
    If sRng = "I" Then
    sRng.Resize(, 2).Font.Bold = True
    fRw = sRng.Row + 1
    Else
    sRng.Offset(-1).Resize(2, 2).Font.Bold = True
    MyAdd = "=sum(R[-" & (sRng.Row – fRw) & "]C:RC)"
    sRng.Offset(-1, 7).FormulaR1C1 = MyAdd
    sRng.Offset(-1, 8).FormulaR1C1 = MyAdd
    sRng.Offset(-1, 9).FormulaR1C1 = MyAdd
    sRng.Offset(-1, 10).FormulaR1C1 = MyAdd
    sRng.Offset(-1, 11).FormulaR1C1 = MyAdd
    sRng.Offset(-1, 12).FormulaR1C1 = MyAdd

    sRng.Offset(-1, 13).FormulaR1C1 = MyAdd
    sRng.Offset(-1, 14).FormulaR1C1 = MyAdd

    fRw = sRng.Row + 1
    End If
    End If
    Next TTu
    4 ' Xu Lí 2 Dòng Cuoi:'
    With .End(xlUp).Offset(1)
    .Resize(2).FormulaR1C1 = "=TCong": .Resize(2).Font.Bold = True
    MyAdd = "=sum(R[-" & (.Row – fRw) & "]C:RC)"
    .Offset(, 12).FormulaR1C1 = MyAdd: .Offset(, 13).FormulaR1C1 = MyAdd
    .Offset(1).Value = .Value & " chung:"
    MyAdd = "=sum(R[-" & (.Row – 4) & "]C:RC)/2"

    .Offset(1, 12).FormulaR1C1 = MyAdd:
    .Offset(1, 6).FormulaR1C1 = MyAdd
    .Offset(1, 7).FormulaR1C1 = MyAdd
    .Offset(1, 8).FormulaR1C1 = MyAdd
    .Offset(1, 9).FormulaR1C1 = MyAdd
    .Offset(1, 10).FormulaR1C1 = MyAdd
    .Offset(1, 11).FormulaR1C1 = MyAdd
    .Offset(1, 12).FormulaR1C1 = MyAdd
    .Offset(1, 13).FormulaR1C1 = MyAdd
    .Offset(1, 6).Resize(, 8).Font.Bold = True
    End With
    End Sub
    Em nhìn theo code thêm 1 tí để tính tổng các cột ở các phần nhưng phần IV thì tính tổng được có 2 cột cuối cùng thôi.
    Các anh chị sửa giúp em nha.

    To anh NDU: PivotTable em cũng biết sơ . . .
    (4)To ChanhTQ:
    Code hoạt động tốt (1) nhưng có một số cột chưa có dòng tổng cộng, chỉ có tổng cộng 2 cột cuối thôi. Các bạn sửa giúp mình với. Cảm ơn tất cả.

    (2) Em nhìn theo code thêm 1 tí để tính tổng các cột ở các phần (3)nhưng phần IV thì tính tổng được có 2 cột cuối cùng thôi.
    Các anh chị sửa giúp em nha.

    (1) Bạn chỉ được giải quyết 2 cột tính tổng là do bạn hoàn toàn đó nha: Trong file đính kèm ban đầu, bạn chỉ tính tổng có 2 cột thôi mà!
    Bảo sao làm vậy, làm hơn tổ phí sức (–=0 ?! :-= –=0)

    (2) Mình vừa đánh số các dòng lệnh ở bài gần đây của mình & chúng ta xét theo các dòng lệnh có số đó;
    Bạn đã thay 2 dòng lệnh 39 & 310 của mình bằng 8 dòng lệnh khác để macro tính tồng cho các vùng miền;
    Mình đề xuất 8 dòng lệnh của bạn nên thay bằng các dòng lệnh như sau:

    Set dRng = sRng.Offset(-1, 7).Resize(, 8) '*Thay cho 2 dòng lệnh 39 & 310'
    For Each Clls In dRng
    Clls.FormulaR1C1 = MyAdd
    Next Clls
    Nhưng dù sao cũng ngợi khen bạn rất nhiều & chắc rằng sau này bạn sẽ bảo trì được đứa con tinh thần của chúng ta 1 cách hoàn hảo! Xin chúc mừng;

    (3) Hai dòng lệnh 43 & 46 được thay bằng các câu lệnh sau:

    Set dRng = .Offset(, 6).Resize(, 8) '* Dòng tổng của vùng cuối'
    For Each Clls In dRng
    Clls.FormulaR1C1 = MyAdd
    Next Clls&

    Set dRng = .Offset(1, 6).Resize(, 8) '* Tổng cộng chung – dòng cuối dữ liệu'
    For Each Clls In dRng
    Clls.FormulaR1C1 = MyAdd
    Next Clls
    Bạn thử sức với dòng lệnh để thay cho dòng 47 xem sao

    (4) Bạn gọi NDU bằng anh, thì phải gọi mình bằng 'Bác' đó nha! :-= –=0 –=0

    1. Trước tiên cảm ơn "BÁC" trước, để cháu thử rùi báo cáo lại.
    2. Trong file cháu đính kèm có tính tổng cộng các cột và các phần nhưng do bác ko tải file đó mà tải file của SA tiên sinh nên hiểu lầm.
    3. Nhưng dù sao cũng ngợi khen bạn rất nhiều & chắc rằng sau này bạn sẽ bảo trì được đứa con tinh thần của chúng ta 1 cách hoàn hảo!
    Câu này không biết phải nói sao nhưng khả năng cháu không có, chỉ máy móc mà làm theo chứ không biết gộp các trường hợp lại.
    4. Bác giúp thì giúp cho trót đừng đánh đố nhau tội cháu.
    5. Code chạy báo lỗi ở dòng lệnh: .Offset(1).Value = .Value & " chung:"

    Ta có thể 'Đặt thừa số chung' như toán học cơ sở

    Bạn có thấy 3 cụm dòng lệnh na ná giống nhau không?

    Mình xin nhốt chung chúng vô 1 macro để cần thì gọi cho tiện

    Bạn xem cặp macro này ha:

    Option Explicit
    Sub DSDK()
    Dim Rng As Range, sRng As Range, Clls As Range, Sh As Worksheet, dRng As Range
    Dim eRw As Long, fRw As Long, TTu As Byte
    Dim MyAdd As String

    Sheets("Data").Select: Set Sh = Sheets("Results")
    eRw = .End(xlUp).Row: Set Rng = Range("F1:F" & eRw)
    Sh.Range("A5:Z" & eRw + 29).Clear: Application.ScreenUpdating = False
    1 ' Tìm & Chép Theo Loai Hình Dich Vu:'
    For Each Clls In Range("AA2:AA" & .End(xlUp).Row)
    Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
    MyAdd = sRng.Address: TTu = TTu + 1
    With Sh..End(xlUp)
    If TTu > 1 Then
    .Offset(1).FormulaR1C1 = "=TCong": fRw = 1
    End If
    .Offset(1 + fRw, -1).Value = Choose(TTu, "I", "II", "III", "IV", "V", "VI")
    .Offset(1 + fRw).Value = Clls.Value
    End With
    Do
    With Sh..End(xlUp).Offset(1, -1)
    .Resize(, 18).Value = sRng.Offset(, -5).Resize(, 18).Value
    End With
    Set sRng = Rng.FindNext(sRng)
    Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    Next Clls
    eRw = Range("AA2:AA" & .End(xlUp).Row).Rows.Count
    Sh.Select
    2 'Tô Màu Cho Vui!'
    With .Interior
    If .ColorIndex < 42 Then
    .Resize(, 20).Interior.ColorIndex = .ColorIndex + 1
    Else
    .Resize(, 20).Interior.ColorIndex = 34
    End If
    End With
    3 ' Dinh Dang & Tính Tong:'
    For TTu = 1 To eRw
    Set sRng = Columns(1).Find(Choose(TTu, "I", "II", "III", "IV", "V", "VI"))
    If Not sRng Is Nothing Then
    If sRng = "I" Then
    sRng.Resize(, 2).Font.Bold = True
    fRw = sRng.Row + 1
    Else
    sRng.Offset(-1).Resize(2, 2).Font.Bold = True
    38 Set dRng = sRng.Offset(-1, 7).Resize(, 8) '*'
    TongCong dRng, "=sum(R[-" & (sRng.Row – fRw) & "]C:RC)"
    fRw = sRng.Row + 1
    End If
    End If
    Next TTu
    4 ' Xu Lí 2 Dòng Cuoi:'
    With .End(xlUp).Offset(1)
    .Resize(2).FormulaR1C1 = "=TCong": .Resize(2).Font.Bold = True
    43 Set dRng = .Offset(, 6).Resize(, 8) '*'
    TongCong dRng, "=sum(R[-" & (.Row – fRw) & "]C:RC)"
    .Offset(1).Value = .Value & " chung:"
    46 Set dRng = .Offset(1, 6).Resize(, 8) '*'
    TongCong dRng, "=sum(R[-" & (.Row – 4) & "]C:RC)/2"
    .Offset(1, 6).Resize(, 8).Font.Bold = True
    End With
    End Sub

    ' * * * * * * * * *

    Sub TongCong(dRng As Range, MyAdd As String)
     Dim Clls As Range
    
    For Each Clls In dRng
       Clls.FormulaR1C1 = MyAdd
     Next Clls
    End Sub

    Em đã tải file anh đính kèm, chạy không xảy ra lỗi gì hết.
    Các anh chị giúp em khi xử lý dữ liệu xong rồi định dạng lại những con số theo #,##0.00 dùm em với.

    Quá dễ!; Bạn thêm 1 dòng lệnh duy nhất vô macro con (tạm gọi là thế!) dòng lệnh sau

    dRng.NumberFormat = "#,##0.00"

    vào phía trên, hay tốt nhất vào phía dưới vòng lặp For. . .Next

    Chúc mọi sự như í!

    Thêm vào nhưng không thấy gì khác biệt anh à. Các anh chị giúp em Format tất cả các số nằm trong khu vực cột H đến cột O nha.

    Sao lại không?

    Bạn xem các dòng tổng cộng & tổng cộng chung xem sao?

    Còn muốn format toàn bộ vùng thì không cần dòng đó nữa; mà là

    [b4].CurrentRegion.Offset(, 7).Resize(, 9).NumberFormat = "#,##0.00"

    nhưng e rắng dữ liệu của bạn quá nhiều số không to đùng, chưa chắc thẩm mỹ hơn.

    (Dòng lệnh này cho vô cuối macro bự đó nha! –=0 :-= –=0)

    Sau khi xem kỹ lại dử liệu của bạn, tôi hơi ngạc nhiên là tại sao bạn không dùng Subtotals nhỉ? Cần gì code
    Bạn xem file đây —> Thao tác chưa đầy 10s —> Cần gì phải lọc ra 1 sheet khác cho tốn dung lượng —> Thích xem thì Subtotal, không thích lại trả về như củ

  30. hands says:

    Bác nào giúp em viết code để lọc những cột có tên bắt đầu là "lndn" sang sheet 2 với!!file đính kèm như sau!

    Thử code này xem:

    Sub Test()
    Dim Clls As Range
    With Sheet1.Range("A1").CurrentRegion
    For Each Clls In .Resize(1)
    If Left(Clls, 4) <> "lhdn" Then Clls.EntireColumn.Hidden = True
    Next Clls
    .SpecialCells(12).Copy: Sheet2.Range("A1").PasteSpecial 3
    .EntireColumn.Hidden = False
    End With
    Application.CutCopyMode = False
    End Sub

  31. hands says:

    Lọc nhiều dòng

    Tôi có vấn đề này xin mọi người giúp đỡ:
    – 1 bảng có các cột: Lớp, môn, ….(file đính kèm)
    – Cột lớp chứa Tên lớp, và chứa nhiều dòng với các dl tương ứng ở các cột còn lại của bảng
    – Yêu câu: lọc theo danh sách từng lớp (gồm tên lớp và các dữ liưệu liên quan nữa)
    Nếu dùng autofiltter thì cũng lọc đwọc theo tên lớp nhưng dữ liệu liên quan cũng chỉ có 1 dòng thôi.
    Vậy xin mọi người giúp đỡ mình mới, cảm ơn mọi người nhiều

    Bạn tham khảo cách cùi bắp này của DOSNET nhé!

  32. hands says:

    Lọc nơi sinh và sắp sếp

    Các bạn.Mình có file này sinh ở nhiều nơi khác nhau.Mình muốn lọc xong rồi sắp sếp lại từ nơi nhiều nhất rồi xuông thấp nhất.
    Nếu là như thế này thì mất công quá.Em lọc ra những người ở Phú Yên copy sang sheet khác,rôi lại lọc tới Bình Định,rôi lạ tiếp Khánh Hòa và các Tỉnh khác như thế rất là tốn thời gian và còn tìm tỉnh để lọc nữa.Anh chị có cách nào hay không?
    File em đính kèm sau.

    1 cột phụ thôi, dùng công thức này nè:
    =SUMPRODUCT(1*(MID($E$3:$E$63,FIND("Tỉnh",$E$3:$E$63),LEN($E$3:$E$63))=MID($E3,FIND("Tỉnh",$E3),LEN($E3))))

    Xin lỗi ndu, tôi tự dưng không dám xài sumproduct vì cái này:
    https://www.giaiphapexcel.com/forum/showthread.php?p=175617#post175617
    Bạn khuyên tôi nên quên sumproduct đi nếu có thể, vậy thì: sumproduct hoặc sum-if có lợi hơn như thế nào trong trường hợp này, phải vận dụng ra sao?
    Rất trân trọng được hiểu biết!
    Ba Tê.

    Ôi chao —> Tức là nếu có thể thay hàm SUMPRODUCT thành SUMIF thì cứ nên thay —> Còn như không còn cách nào thì cứ xài —> Ai cấm
    Bạn dùng 2 cột thì giải thuật cũng như tôi dùng 1 cột thôi —> Tức sẽ bằng nhau về tốc độ —> Và trong trường hợp này tôi chọn cách GỌN NHẤT (gọn ở chổ đở tốn 1 cột)
    Hạn chế chứ không phải là bỏ luôn không xài

    Vì em là sinh viên nên chỉ dung công thưc thôi.Mà đặc biệt là công thức ngắn gọn nữa.Chứ dài quá thì em không hiểu lắm.Nên nhờ các anh chỉ công thức ấy,chứ đừng dùng VBA là được.

    Trong này có bài nào làm bằng VBA đâu bạn —> Toàn công thức thường

  33. hands says:

    Lọc và copy dữ liệu từ cột này sang cột khác

    Em có một bài toán nhờ các bác hướng dẫn em cách xử lý với.
    Đề bài em gửi trong file đính kèm.
    Cảm ơn các bác trước.

    bạn mở dự án excel bật Alt+f11.
    chuột phai insert module
    sau đó viết code trong module như sau:

    sub copy()
    Sheets("Sheet1").[a1:a11].Copy: Sheets("Sheet1").[g8:g18].PasteSpecial _
               'Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    
    end sub

    hiiihi đang chút việc nên quen chưâđư file lên giờ mới đưa

    Code và file của bạn chẳng "ăn nhậu" gì với yêu cầu của tác giả cả
    Có điều tôi nhìn vào yêu cầu này cũng chả hiểu ý nghĩa của nó là thế nào nữa
    Đoán là:
    – Cột 1 lấy các giá trị là TEXT
    – Cột 2 lấy các giá trị là NUMBER
    Hic… chả biết đúng không

    Ý của em đúng là như thế. Em muốn lấy Number ở cột 2 thay cho number ở cột 1, text ở cột 1 vẫn giữ nguyên.
    Em chạy thử macro của bác khoavu87 nhưng không đúng kết quả.

    Bạn thử code này xem:

    Sub Test()
    Dim Clls As Range, i As Long, j As Long
    Dim Cot1 As Range, Cot2 As Range
    On Error GoTo Thoat
    Set Cot1 = Application.InputBox("Chon cot 1", Type:=8)
    Set Cot2 = Application.InputBox("Chon cot 2", Type:=8)
    Cot1.Copy Destination:=
    With .Resize(Cot1.Rows.Count)
    For Each Clls In Cot2.SpecialCells(2, 1)
    i = i + 1
    .SpecialCells(2, 1).Areas(j + 1)(i).Value = Clls.Value
    If .SpecialCells(2, 1).Areas(j + 1).Count = i Then
    j = j + 1: i = 0
    End If
    Next
    End With
    Thoat:
    End Sub

    Cám ơn bác ndu96081631 đã giúp, thực ra em đang chỉnh sửa mấy file phụ đề của phim. Có mấy chỗ không biết xử lý thế nào nên nhờ các bác chuyên gia excel giải quyết giúp.
    Em muốn lấy thời gian của file phụ đề tiếng anh và lấy lời thoại trên file phụ đề tiếng việt.
    Em gửi các bác file excel: cột 1 là phụ đề tiếng việt, cột 2 là phụ đề tiếng anh. Các bác xem giúp em nhé.
    P/s: nếu bác nào đã xem prison break mà có phụ đề chuẩn thì cho em xin 1 bản.
    Cảm ơn các bác nhiều nhiều.

    Chúng ta sẽ làm gì với 2 cột phụ đề này?
    (Từ đầu bạn đưa lên luôn cho rồi —> Mất thời gian quá)

    Từ đầu em gặp vấn đề khác bác ndu ạ. Với 2 cột phụ đề này em muốn những ô thời gian của cột 2 thay vào những ô thời gian của cột 1. Bác xem giúp em với ạ.

    Vậy thì thử với code này —> Càng dể:

    Sub Test()
    Dim Clls As Range, i As Long, j As Long
    Dim Cot1 As Range, Cot2 As Range
    On Error GoTo Thoat
    Set Cot1 = Application.InputBox("Chon cot 1", Type:=8)
    Set Cot2 = Application.InputBox("Chon cot 2", Type:=8)
    For Each Clls In Cot2.SpecialCells(2, 1)
    i = i + 1
    Cot1.SpecialCells(2, 1).Areas(j + 1)(i + 1).Value = Clls.Offset(1).Value
    If Cot1.SpecialCells(2, 1).Areas(j + 1).Count = i Then
    j = j + 1: i = 0
    End If
    Next
    Thoat:
    End Sub

    Khi hộp InputBox hiện ra, bạn chọn Cot1 là cột A, Cot2 là cột B —> Nói chung code sẽ lấy thời gian ở cột 2 thay vào cột 1

    Cảm ơn bác ndu96081631 nhé. Nhờ có bác giúp em làm được rồi. Mong được các bác giúp đỡ nhiều.

  34. hands says:

    Lọc dữ liệu, If 3 điều kiện text

    Hi may ban nhe.

    Minh đang làm nhập dữ liệu vô file excel đấy. Mà đụng đến hàm If này thì mình bị khựng lại vì hic hic hổng biết làm sao.

    Mình muốn lọc cột dữ liệu đấy sao cho : Nếu có chữ A, thì cột khác hiện lên chữ B.
    Mấy bạn có thể xem file đính kèm vì mình nêu rõ trong đấy hết đấy ạh

    Hồi đấy giờ làm if hai điều kiện thôi, giờ nhiều hơn 2 dk không biết làm sao. Dốt thật nhỉ!

    Đa tạ mọi người nhé.

    Bạn dùng công thức dưới:

    =IF(ISNUMBER(SEARCH("doc than";E2));"s";IF(ISNUMBER(SEARCH("da ket hon";E2));"m";""))

    Xin đề xuất một công thức thô sơ nữa nè, cũng tạm giải quyết dược yêu cầu của bạn

    =IF(E2="","",IF(RIGHT(E2,8)="doc than","s","m"))

    Dữ liệu bạn nhập khác đi coi như tiêu …
    Chúc may mắn và thành công!

    Bạn nên ghép hàm TRIM() vào để loại bỏ các ký tự trống " " thừa khỏi chuỗi. công thức sẽ hoàn chỉnh hơn.
    =IF(E2="","",IF(RIGHT(TRIM(E2),8)="doc than","s","m"))

  35. hands says:

    Xin Hỏi Về Lọc Dữ Liệu Theo Khách Hàng, Hình Thức, Loại Hàng Và Trích Ngang

    Cho tôi xin hỏi về trích lọc dữ liệu theo từng khách hàng, hình thức, loại hàng và trích ngang theo phiếu.
    Rất mong các anh em trên GPE xem và giúp.
    Xin cám ơn.
    Đính kèm file
    ( Nếu không rõ, anh em vui lòng cho biết )

    Dùng Maro này thử xem. Gán vào Nút lệnh hoặc 1 sự kiện nào đó.
    Bạn xem trong file nhé.

    —–
    Bạn giúp tôi cám ơn bạn nhiều lắm, thong thả bạn ơi :-=
    Phiền bạn kiểm tra lại xem sao, đã test code: chưa đạt.
    —–
    Bạn ơi: Nên trích lọc ra sheet KhachHang, không nên trích lọc trực tiếp trên sheet XuatHang vì đây là sheet dùng để nhập liệu ( thực tế trích trực tiếp => phức tạp lắm ) và sheet xuất hàng luôn ở chế độ autofilter.

    Mong tin bạn.

    Thì sau khi lọc xong bạn copy qua Sheet KhachHang là được mà. Tôi sửa lại. Bạn xem nhé.

    Mình tạm gán vào nút lệnh, sau này bạn gán vào sự kiện nào đó cho phù hợp. Bạn lọc tùy ý ròi nhấn nút tạo chi tiết

    —–
    Em đã test code, code không thể hiện được số phiếu giao hàng để đối chiếu anh ơi !
    Bạn huuthang_bd đã giúp em vấn đề này rồi.
    —–
    Cám ơn bạn thật nhiều, tôi đã test code : kết quả đúng theo mong muốn.
    Bạn vui lòng hướng dẩn thuật toán của bạn được không ? ( Để tôi học )

    Sub GPE()
    Application.ScreenUpdating = False
    Dim Str As String, R [B][COLOR=red]???[/COLOR][/B]
    Str = ""
    R = 8
    On Error Resume Next
        ActiveSheet.ShowAllData
        ActiveSheet.Range("$A$6:$G$65536").AutoFilter Field:=2, Criteria1:=[G1].Value
        ActiveSheet.Range("$A$6:$G$65536").AutoFilter Field:=5, Criteria1:=[G2].Value
        ActiveSheet.Range("$A$6:$G$65536").AutoFilter Field:=6, Criteria1:=[G3].Value
    [COLOR=red]Từ chổ này :[/COLOR]
    For Each cll In Range([D7], [D65536].End(xlUp)).SpecialCells(xlCellTypeVisible)
        If InStr(Str, "," & cll.Value) = 0 Then
        Str = Str & "," & cll.Value
        Cells(5, R).Value = cll.Value
        R = R + 1
        End If
    Next
    If [H5].Value <> "" Then Range([H6], [IV5].End(xlToLeft).Offset(1)).FormulaR1C1 = "=INDEX(R7C3:R65536C3,MATCH(R5C,R7C4:R65536C4,))"
    If [H5].Value <> "" Then Range([H7], Cells([D65536].End(xlUp).Row, [IV5].End(xlToLeft).Column)).SpecialCells(xlCellTypeVisible).FormulaR1C1 = "=IF(RC4=R5C,RC7,"""")"
    Sheets("KhachHang").[5:65536].ClearContents
    Range([A5], Cells([D65536].End(xlUp).Row, [IV5].End(xlToLeft).Column)).SpecialCells(xlCellTypeVisible).Copy
        Sheets("KhachHang").Select
        [A5].Select
        Selection.PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
    Sheets("XuatHang").[H:IV].ClearContents
    Application.ScreenUpdating = True
    End Sub

    Chúc bạn luôn vui, khỏe.
    Chúc anh luôn khỏe.

    For Each cll In Range(, .End(xlUp)).SpecialCells(xlCellTypeVisible)
    If InStr(Str, "," & cll.Value) = 0 Then
    Str = Str & "," & cll.Value
    Cells(5, R).Value = cll.Value
    R = R + 1
    End If
    NextĐoạn này dùng để trích ngang số phiếu vào dòng 5, từ ô H5. Tôi dùng một chuỗi phụ (Trong Code là biến Str) để kiểm tra xem một số phiếu nào đó đã được trích ngang chưa.
    Duyệt qua các Cell hiện ở cột D (Cột số phiếu). Nếu không tìm thấy số phiếu trong chuỗi Str (InStr(Str, "," & cll.Value) = 0) thì trích ngang (Cells(5, R).Value = cll.Value) đồng thời ghép số phiếu đó vào chuỗi Str (Str = Str & "," & cll.Value), Tăng R lên một đơn vị để dịch chuyển sang cột tiếp theo. Đương nhiên các số phiếu đã được trích ngang thì sẽ được ghép vào chuỗi Str và khi có duyệt qua một Cell khác có số phiếu đã được trích ngang thì InStr() sẽ trả về giá trị >0 và không trích ngang số phiếu đó nữa.

    If .Value <> "" Then Range(, .End(xlToLeft).Offset(1)).FormulaR1C1 = "=INDEX(R7C3:R65536C3,MATCH(R5C,R7C4:R65536C4,))"
    If .Value <> "" Then Range(, Cells(.End(xlUp).Row, .End(xlToLeft).Column)).SpecialCells(xlCellTypeVisible).FormulaR1C1 = "=IF(RC4=R5C,RC7,"""")"Đoạn này dùng để nhập công thức tính ngày giao và số lượng cho vùng trích ngang. Bạn có thể bỏ dòng Sheets("XuatHang")..ClearContents chạy code và xem công thức.
    Sheets("KhachHang").Cells.ClearContents
    Range(, Cells(.End(xlUp).Row, .End(xlToLeft).Column)).SpecialCells(xlCellTypeVisible).Copy
    Sheets("KhachHang").Select
    .Select
    Selection.PasteSpecial Paste:=xlPasteValuesĐoạn này dùng để xóa dữ liệu cũ ở Sheet KhachHang, Copy các dòng hiện ở Sheet XuatHang dán vào Sheet KhachHang.
    Thuật toán nếu diễn đạt bằng lời có lẽ sẽ khó hiểu. Nếu bạn rành về Code, tự đọc code để biết thuật toán sẽ dễ hơn.

  36. hands says:

    Nhờ giúp đỡ lọc dữ liệu

    Các bạn chỉ giúp mình cách để lọc lấy giá trị nhỏ nhất và lớn nhất của mỗi mặt hàng trong file mình gởi kèm ha.

    Cảm ơn nhiều!

    Nếu giá trị nhỏ nhất hoặc lớn nhất có trùng thì bạn tính sao? Lấy toàn bộ hay chỉ lấy 1 —> Và nếu lấy 1 thì lấy theo tiêu chí gì?
    Ngoài ra có nhiều mặt hàng xuất hiện nhiều lần, vậy ta có cộng số lượng của chúng lại với nhau trước rồi mới so sánh không?
    ——————–
    Ah… sorry, tôi đọc không kỹ yêu cầu: lấy giá trị nhỏ nhất và lớn nhất của mỗi mặt hàng
    Bài này bạn dùng Consolidate hoặc Subtotals là nhanh nhất (trong menu Data)

    Nếu dùng consolidate nghĩa là mình phải lấy 2 lần rồi copy lại đúng không bạn? có cách nào lấy 1 lần được min và max luôn không? Và làm sao để mình lấy luôn được cột ngày, mình cons chỉ lấy được mặt hàng và trọng lượng, cột ngày nó lấy không đúng

    vậy dùng SUBTOTALS đi
    Viết cho bạn 1 code tự động luôn

    Sub LocMax()
    With Range("A1").CurrentRegion
    .Subtotal 2, 4, 3, True, False, True
    End With
    End Sub
    Sub LocMin()
    With Range("A1").CurrentRegion
    .Subtotal 2, 5, 3, True, False, True
    End With
    End SubNếu khéo tay, bạn có thể gộp 2 code này thành 1

    Cảm ơn bạn nhe, chắc mình phải dùng đỡ Subtotal hoặc Consolidate thôi, VBA mình thích lắm nhưng……….mù tịt về nó

    Dể lắm bạn ơi —> Thật ra code trên không phải tôi tự viết… tôi record macro mà ra đấy chứ! (Record quá trình dùng SUBTOTALS)
    Bạn cũng làm thử đi, vài lần sẽ quen!

    Record nghĩa là sao bạn? Bạn chỉ mình đi

    Là vầy:
    – Bạn vào menu ToolsMacroRecord new macro
    – 1 hộp thoại xuất hiện yêu cầu đặt tên cho macro (bạn có thể không làm gì, cứ OK đại)
    – Từ thời điểm này, bạn làm bất cứ điều gì thì record macro sẽ ghi lại thành code (giống như máy ghi âm)
    – Giờ bạn có thể dùng SUBTOTALS để thao tác
    – Xong quá trình tổng hợp bằng SUBTOTALS, bạn bấm nút tắt record maco đi —> vậy là có được 1 code
    Ta có thể thí nghiệm xem macro chạy thế nào bằng cách:
    – Remove SUBTOTALS đi, xong bấm Alt + F8, chọn tên macro và bấm nút Run —> Bạn sẽ thấy macro đã làm lại công việc mà bạn vừa làm khi nảy (giống như máy ghi âm phát lại)

  37. hands says:

    Lọc thỏa điều kiện đồng thời nhiều cột

    Nhờ mọi người xem và chỉ giúp có cách nào lọc được tất cả các dòng có chứa chữ "a" như file em đính kèm không?Em xin cảm ơn trước!

    Nguyên tắc lọc bằng Advanced Filter, nếu vùng đích và nguồn khác nhau thì điều kiện tiên quyết là ta phải đứng tại sheet đích để gọi Advanced Filter
    Cụ thể là:
    – Sheet nguồn của bạn là sheet1
    – Sheet đích của bạn là sheet2
    – Vậy đầu tiên bạn phải chuyển sang sheet2, sau đó mới vào menu DataFilterAdvanced Filter
    – Nếu bạn đứng tại sheet1 mà thao tác thì nó sẽ báo lổi
    ————
    Có thể viết thành 1 code, đại khái như sau:

    Sub Loc()
    Sheet2.Range("A1").CurrentRegion.Clear
    With Sheet1.Range("A1").CurrentRegion
    .AdvancedFilter 2, Sheet1.Range("F1:I4"), Sheet2.Range("A1")
    End With
    End Sub

    Nếu dử liệu bạn khác hơn, tốt nhất nên đưa file thật lên đây… hoặc ít nhất, nếu file giả lập thì cũng phải cùng cấu trúc với file thật

    Cảm ơn thầy Ndu rất nhiều!}}}}}. Thường em rất thích dùng Advanced Filter và rất thường dùng cái này nhưng lại không hề biết j về nguyên tắc này cả nên bị hạn chế rất nhiều. HÔm nay thì em đã hiểu!Hihi!

    Nguyên tắc lọc bằng Advanced Filter, nếu vùng đích và nguồn khác nhau thì điều kiện tiên quyết là ta phải đứng tại sheet đích để gọi Advanced Filter
    Cụ thể là:
    – Sheet nguồn của bạn là sheet1
    – Sheet đích của bạn là sheet2
    – Vậy đầu tiên bạn phải chuyển sang sheet2, sau đó mới vào menu DataFilterAdvanced Filter
    – Nếu bạn đứng tại sheet1 mà thao tác thì nó sẽ báo lổi
    ————

  38. hands says:

    Xin hỏi bài toán về lọc dữ liệu

    Xin hỏi có ai biết vấn đề này xin chỉ giúp em.
    Em có file ví dụ đính kèm.
    Một bên là số lượng quả đã bán từng ngày còn một bên là liệt kê số lượng tổng quả đã bán của tháng.
    Bài toán của em đặt ra là bất kỳ lúc nào em thêm mặt hàng mới bên cột hàng bán hàng ngày thì nó tự động cập nhật thêm loại hàng mới và số lượng mới vào cột hàng bán của tháng. Hoặc em thêm mặt hàng đã bán của ngày hôm trước mà ngày hôm sau em cũng bán được mặt hàng đó nhưng số lượng khác thì số lượng đó cũng tự động cập nhật vào bảng số lượng của tháng.
    Rất các anh chị có ai biết về hàm này chỉ giúp em.
    Cám ơn các anh chị nhiều.
    Thân.

    Cách đơn giản là bạn làm như minhthien321 là dùng Advance Filter. Nếu bạn chưa biết cách sử dụng nó bạn có thể vào đây tham khảo là có thể tự mình làm được
    https://www.giaiphapexcel.com/forum/showthread.php?t=11552
    Chúc thành công!

    Cám ơn anh duongdv nhưng vấn chưa đúng ý em. Chắc là do em giải thích chưa kỹ.
    Ý em là Bên cột hàng bán của tháng tự động liệt kê những mặt hàng mà bên cột hàng bán hàng ngày có. mặc dù hàng ngày thì ngày nào cũng bán được mặt hàng Táo chẳng hạn nhưng bên cột hàng của Tháng thì chỉ liệt kê 1 lần là Táo. Mặt hàng này chỉ xuất hiện 1 lần bên cột hàng bán của Tháng thôi chứ không phải là 2 lần như anh đã làm. Anh giúp lại em nha. Cám ơn anh nhiều.

    Thế thì bạn thử file này xem.

    Đúng ý của em rồi nhưng phiền anh thanh_tks giải thích giúp em về bài anh đã làm giúp em được không anh. Về cách đặt tên "loc", "DS" và một số hàm trong công thức =IF(COUNT(loc)<ROW(A1),"",INDEX(DS,SMALL(loc,ROW(A1)),)) vv. Anh giúp em nha.
    Cám ơn anh nhiều.

  39. hands says:

    Giúp tôi Filter theo điều kiện

    Tôi có bảng sản tổng hợp nhiều mã sản phẩm. Cho hỏi có cách nào lọc mã SP theo điều kiện ở 1 ô validation không? khi chọn mã này thì tất cả mã SP khác bị ẩn đi. (ngay trên bảng dữ liệu, không cột phụ).
    Mong mọi người giúp đỡ.

    Bạn xem file, nhớ Enable Macro.

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, ) Is Nothing Then Exit Sub
    Range("B3").AutoFilter 2,
    If = "" Then ActiveSheet.AutoFilterMode = False
    End Sub

    Xem file này cũng tương tự như Bạn nhé.

    Cảm ơn bạn rất nhiều:) Nhưng cho hỏi 1 chút! có cách nào không cần dùng Macro mà vẫn thực hiện được ý tưởng không vậy?
    Cảm ơn bạn MinhCông nhưng điều kiện của mình là (ngay trên bảng dữ liệu, không cột phụ) vì trong file đã có rất nhiều sheet rồi nên không muốn có sheet phụ.
    À. Cho mình hỏi thêm! Nếu sử dụng với nhiều sheet có cùng 1 mẫu bảng biểu, 1 Macro như vậy có xài đc ko?

    – Bạn nhập dữ liệu 1 ô nhưng lại muốn dùng nó để lọc cho 1 vùng khác, theo mình dùng macro là gọn nhẹ nhất.

    – Nếu muốn dùng cho Sheet khác, bấm Alt F11 –> Click đôi Sheet1 ở cửa sổ bên trái –> Copy đoạn mã –> Click đôi Sheet muốn dùng –> Paste đoạn mã vào.

    * Chú ý vùng dữ liệu : ô B1 chứa mã bạn muốn lọc, ô B3 là ô Mã sản phẩm. Nếu trong Sheet mới của bạn, vị trí các ô có thay đổi, hãy sửa lại code cho đúng.

    Tôi vẫn không hiểu tại sao bạn không lọc trực tiếp bằng AutoFilter mà phải thông qua Validation?

    Chắc là bạn này muốn cái bảng tính trông nó pro 1 chút í mà **~****~****~**

    Dù lại vậy nhưng cũng phải hiệu quả chứ —> Tính toán chuẩn, nhanh… trình bày rõ ràng là những tiêu chí đầu tiên, sau đó mới tính đến chuyện Pro gì đó
    Mặc khác: Nếu muốn CỰC PRO sao không dùng PivotTable? (xài cái này đâu cần code hay công thức gì)

  40. hands says:

    Xin hỏi thêm bạn huuthang_bd


    Tôi đã vận dụng code của bạn vào thực tế, chạy rất tốt. Có phát sinh 1 vấn đề bạn cho tôi hỏi thêm : khi trích lọc theo khách hàng, hình thức, loại hàng => các tên hàng trùng tên có thể để cùng 1 dòng được không ? và cột số lượng lúc này thể hiện là tổng số giao hàng của tên hàng đó. Cụ thể được thể hiện trong file đính kèm.
    Mong tin bạn :-=

    ( Cộng dồn xong xóa cột C và D )

    Bạn nhiệt quá, tôi sẽ test code bài ( #11)
    Thân chào bạn.

    Bạn xem trong file nhé. Với yêu cầu mới này không thể sửa code cũ mà phải làm lại theo cách khác.

  41. hands says:

    Xin được hỏi thêm


    Cho tôi được hỏi thêm các bạn trong trường hợp này thì code viết như thế nào ?
    Đính kèm file.
    Cám ơn các bạn.

    Cám ơn ptlong04x1 nhiều, đúng việc tôi đang cần (bài #11)

    Private Sub Worksheet_Change(ByVal Target As Range)
    If = "" Then
    ActiveSheet.AutoFilterMode = False
    Exit Sub
    End If
    If Intersect(Target, ) Is Nothing Then Exit Sub
    Range("B3").AutoFilter 2,
    If Range("B4", .End(xlUp)).Find() Is Nothing Then
    MsgBox "Khong co " & "[ " & & " ] trong danh sach", , "Thong bao"
    .ClearContents
    End If
    End Sub

    Anh xem file.

  42. hands says:

    Lọc và tính tổng theo ngày tháng

    Các bác giúp em với ạ!

    Em có 1 báng dữ liệu trong sheet "Data" ở file đính kèm. Trong bảng này, ngày tháng năm theo thứ tự tăng dần, và ứng với mỗi ngày là số tiền chuyển trong các Accounts.

    Trong sheet "Makro", ô D8 và F8 dùng để nhập khoảng thời gian của báo cáo. Vậy các bác làm ơn, giúp em viết 1 cái macro để khi nhấn vào nút "Generate report" thì:

    – Sheet "Statement" sẽ tự động liệt kê tất cả các tháng có trong sheet "Data" và tính tổng tiền của các Accounts tương ứng với mỗi tháng. Trong đó, tiêu đề của mỗi tháng sẽ là ngày đầu tiên của tháng, rồi dấu gạch "-", rồi tới ngày cuối cùng của tháng. (Các bác coi phần minh họa của em ở vùng bôi màu vàng ạ)
    À, vị trí và số cột của các cột Accounts trong sheet "Data" có thể thay đổi ạ.

    – Sau đó, macro sẽ tạo ra 1 report giống với mẫu trong sheet "Statement" nhưng chỉ liệt kê những tháng trong khoảng thời gian mình nhập vào ở sheet "Makro". Report này đuợc tạo trên workbook mới ạ.

    Em cảm ơn các bác nhiều ạ.

    Câu I của bạn đây, xin xem trong file đính kèm

    Option Explicit
    Sub TongHop()
    Dim Sh As Worksheet, Rng As Range, Clls As Range
    Dim Dat As Date, Dat0 As Date, Dat9 As Date
    Dim sDate As String
    Dim Col As Byte, Jj As Byte

    Sheets("Data").Select:
    Col = Range(, .End(xlToRight)).Columns.Count – 1
    ReDim Acc(Col) As Integer
    Set Rng = Range(, .End(xlUp))
    Set Sh = Sheets("Statement")
    Sh..Resize(Sh..CurrentRegion.Rows.Count, 13).Clear
    For Each Clls In Rng
    If IsDate(Clls.Value) Then
    If (Clls.Value <> "" And Month(Clls.Value) <> Month(Dat)) Then
    Dat = Clls.Value
    Dat0 = DateSerial(Year(Dat), Month(Dat), 1)
    Dat9 = DateSerial(Year(Dat), 1 + Month(Dat), 1) – 1
    sDate = Format(Dat0, "DD/MM/YY") & "-" & Format(Dat9, "dd/mm/yy")
    Sh..End(xlToLeft).Offset(, 1).Value = sDate
    For Jj = 0 To Col
    If Clls.Row > 3 Then
    Sh.Cells(7 + Jj, "iV").End(xlToLeft).Offset(, 1).Value = Acc(Jj)
    End If
    Acc(Jj) = Clls.Offset(, 2 + Jj).Value
    Next Jj
    Else
    For Jj = 0 To Col
    Acc(Jj) = Acc(Jj) + Clls.Offset(, 2 + Jj).Value
    Next Jj
    End If: End If
    Next Clls
    For Jj = 0 To Col
    Sh.Cells(7 + Jj, "iV").End(xlToLeft).Offset(, 1).Value = Acc(Jj)
    Next Jj
    With Sh..End(xlToLeft).Offset(, 1)
    .Value = "ToTal": .Resize(Col + 1).Font.Bold = True
    .HorizontalAlignment = xlCenter
    With .Offset(1)
    .FormulaR1C1 = "=SUM(RC[-" & (.Column – 3) & "]:RC)"
    .AutoFill Destination:=.Resize(Col + 1), Type:=xlFillDefault
    .Resize(Col + 1).NumberFormat = "#,##0"
    End With: End With
    End Sub

    Thứ tự các Accounts thay đổi

    Cảm ơn Bác! Cho em hỏi 1 câu nữa: Nếu mình thứ tự các Accounts ở Sheet "Statement" không như thứ tự của chúng ở sheet "Data" (Ví dụ: ở sheet "Data", Account 1 rồi tới Account 2; nhưng ở sheet "Statement", mình có sẵn Account 2 trước rồi mới tới Account 1). Vậy thì phải viết sao hả bác?

    Nếu Đông không chịu Đoài thì Đoài phải sang Đông, & ngược lại!

    Trong trường hợp đã có macro trên thì nên thêm công đoạn chép tên trường của các cột sau cột 'C' của trang 'Data' sang 'Statement'

    Nếu muốn thử sức viết macro khác, thì làm ngược lại.

  43. hands says:

    Lọc danh sách

    Ai Giúp mình dùng công thức để chuyển Tên mọi người trong cột 1 sang cột 2, loại bõ những cell trắng.
    [URL="https://www.megafileupload.com/en/file/151257/Book1-xls.html"%5D
    https://www.megafileupload.com/en/file/151257/Book1-xls.html

    Bạn muốn như thế này ?

    Cảm ơn bạn nhiều. Tuy nhiên sao mình lập công thức tương tự như thế mà nó báo lỗi. Mình upload luôn file lên bạn xem giúp mình honà thiện luôn. Thật sự mình gà mấy cái đó lắm. bạn giúp mình phần công thức ở những cột tô màu vàng đó nhé.
    https://www.mediafire.com/file/mw5gyafymhy/TRUC.xls

    Bạn xem file, mở file ra chọn Enables macros. Vì dùng VBA nên thao tác khoẻ re, muốn cập nhật chỉ cần nhấn nút.

    Cảm ơn bạn nhiều. Tuy nhiên sao mình lập công thức tương tự như thế mà nó báo lỗi. Mình upload luôn file lên bạn xem giúp mình honà thiện luôn. Thật sự mình gà mấy cái đó lắm. bạn giúp mình phần công thức ở những cột tô màu vàng đó nhé.
    https://www.mediafire.com/file/mw5gyafymhy/TRUC.xls

    công thức mảng kết thúc bằng ctrl + shift + enter .bạn thử làm đi nhé

  44. hands says:


    Bạn ptlong04x1 cho anh hỏi thêm còn trong trường hợp này nữa nhé: có trong danh sách nhưng không có phát sinh ( Code trong modul)

    Đính kèm file
    :-= :-= :-=

    Không hiểu ý anh lắm, viết đại code này, anh test thử xem sao cái đã
    Chú ý :
    Thay đổi –> AutoFilter.
    Thay đổi –> Trích phát sinh.

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Cll As Range
    If Intersect(Target, ) Is Nothing Then Exit Sub
    If Target = Then
    Range("B3", .End(xlUp)).AutoFilter 2,
    Exit Sub
    End If
    If Target = Then
    For Each Cll In Range("B4", .End(xlUp))
    If Cll = And Cll.Offset(, 1) = And Cll.Offset(, 2) = Then
    MsgBox "Khong co phat sinh"
    Exit Sub
    End If
    Next Cll
    MsgBox "Co phat sinh –> Xem Sheet Trich-PS"
    Sheets(2)..End(xlUp).Offset(1).Resize(, 3) _
    = WorksheetFunction.Transpose()
    End If
    End Sub


    :-= :-= :-=

    Không phải như thế ptlong ơi, anh nghĩ việc này chắc khó rồi.
    Anh nêu thật chi tiết trong file đính kèm, mong hiểu.

    To: ptlpng04x1 rất cám ơn sự nhiệt tình của bạn.

    To: SA_DQ……………….ĐÁNG NỂ
    ( tôi làm việc sao gặp toàn những trường hợp …!!!)

    Hãy xem VBA làm điều đó như thế nào!

    Option Explicit
     Dim Rng As Range
    [B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
     Const NTh As String = "Nothing "
     If Not Intersect(Target, [G1]) Is Nothing Then
       T3 1
     ElseIf Not Intersect(Target, [G2]) Is Nothing Then
       T3 1:             T3 2
       If Rng Is Nothing Then
          MsgBox "Nothing " & [G2].Value, , [G1]
          Exit Sub
       End If
     ElseIf Not Intersect(Target, [G3]) Is Nothing Then
       T3 1:             T3 2
       If Rng Is Nothing Then
          MsgBox NTh & [G2].Value, , [G1]
       Else
          T3 3
          If Rng Is Nothing Then
             MsgBox NTh & [G3].Value & " in " & [G2].Value, , [G1]
          Else
             Dim Sh As Worksheet, Clls As Range
    
    Set Sh = Sheets("Trich-PSinh")
             Sh.[b2].Resize([b4].CurrentRegion.Rows.Count, 4).Clear
             For Each Clls In Rng
                If Clls.Column = 2 Then _
                   Sh.[B65500].End(xlUp).Offset(1).Resize(, 4).Value = Clls.Resize(, 4).Value
                Sh.Select
             Next Clls
          End If
       End If
     End If
    [B]End Sub[/B]

    Sub T3(Jj As Byte)
    Dim Clls As Range, Rng0 As Range
    Select Case Jj
    Case 1
    Set Rng = Nothing
    For Each Clls In Range(, .End(xlDown))
    If Clls.Value = .Value Then
    If Rng Is Nothing Then
    Set Rng = Clls.Resize(, 4)
    Else
    Set Rng = Union(Rng, Clls.Resize(, 4))
    End If
    End If
    Next Clls
    Case 2
    If Not Rng Is Nothing Then
    Set Rng0 = Rng.Cells(1, 2).Resize(Rng.Rows.Count)
    Set Rng = Nothing
    For Each Clls In Rng0
    If Clls.Value = .Value Then
    If Rng Is Nothing Then
    Set Rng = Clls.Offset(, -1).Resize(, 4)
    Else
    Set Rng = Union(Rng, Clls.Offset(, -1).Resize(, 4))
    End If
    End If
    Next Clls
    Else
    End If
    Case 3
    If Not Rng Is Nothing Then
    Set Rng0 = Rng.Cells(1, 3).Resize(Rng.Rows.Count)
    Set Rng = Nothing
    For Each Clls In Rng0
    If Clls.Value = .Value Then
    If Rng Is Nothing Then
    Set Rng = Clls.Offset(, -2).Resize(, 4)
    Else
    Set Rng = Union(Rng, Clls.Offset(, -2).Resize(, 4))
    End If
    End If
    Next Clls
    Else
    End If
    End Select
    End Sub

    (Giống như gọi đệ quy, nhỉ?) ; Xin xem thêm trong file đính kèm
    Mình rút gọn lại macro T3, như sau

    Sub T3(Jj As Byte)
    Dim Clls As Range, Rng0 As Range
    Select Case Jj
    Case 1
    Set Rng = Nothing
    For Each Clls In Range(, .End(xlDown))
    If Clls.Value = .Value Then
    If Rng Is Nothing Then
    Set Rng = Clls.Resize(, 4)
    Else
    Set Rng = Union(Rng, Clls.Resize(, 4))
    End If
    End If
    Next Clls
    Case 2, 3
    If Not Rng Is Nothing Then
    Set Rng0 = Rng.Cells(1, Jj).Resize(Rng.Rows.Count) 'jj=2'
    Set Rng = Nothing
    For Each Clls In Rng0
    If Clls.Value = Cells(Jj, "G").Value Then ''
    With Clls.Offset(, 1 – Jj) '-1'
    If Rng Is Nothing Then
    Set Rng = .Resize(, 4)
    Else
    Set Rng = Union(Rng, .Resize(, 4))
    End If
    End With
    End If
    Next Clls
    Else
    End If
    End Select
    End Sub

    Trong nổ lực 'Đặt thừa số chung'

    Option Explicit
     Dim Rng As Range
    [B]Private Sub Worksheet_Change(ByVal Target As Range)[/B]
     Const NTh As String = "Nothing "
    
    If Not Intersect(Target, [G1]) Is Nothing Then
       T3 1
     ElseIf Not Intersect(Target, [G2]) Is Nothing Then
       T3 1:             T3 2
       If Rng Is Nothing Then GoTo GPE
     ElseIf Not Intersect(Target, [G3]) Is Nothing Then
       T3 1:             T3 2
       If Rng Is Nothing Then
          GoTo GPE
       Else
          T3 3
          If Rng Is Nothing Then
             MsgBox NTh & [G3].Value & " in " & [G2].Value, , [G1]
          Else
             Dim Sh As Worksheet, Clls As Range
    
    Set Sh = Sheets("Trich-PSinh")
             Sh.[b2].Resize([b4].CurrentRegion.Rows.Count, 4).Clear
             For Each Clls In Rng
                If Clls.Column = 2 Then _
                   Sh.[B65500].End(xlUp).Offset(1).Resize(, 4).Value = Clls.Resize(, 4).Value
                Sh.Select
             Next Clls
          End If
       End If
     End If
     Exit Sub
    GPE:     MsgBox NTh & [G2].Value, , [G1]
    End Sub

    Sub T3(jj As Byte)
    Dim Clls As Range, Rng0 As Range
    If jj = 1 Then
    Set Rng0 = Range(, .End(xlDown))
    Else
    Set Rng0 = Rng.Cells(1, jj).Resize(Rng.Rows.Count)
    End If
    Set Rng = Nothing
    For Each Clls In Rng0
    If Clls.Value = Cells(jj, "G").Value Then
    With Clls.Offset(, 1 – jj)
    If Rng Is Nothing Then
    Set Rng = .Resize(, 4)
    Else
    Set Rng = Union(Rng, .Resize(, 4))
    End If
    End With
    End If
    Next Clls
    End Sub

  45. hands says:

    Các câu hỏi về lọc dữ liệu được post ở đây

    Xin chào các anh, chị GPE !
    Tôi phải chuyển đổi file dữ liệu chiết xuất từ CDDL ra excel có dung lượng khá lớn. Tôi muốn nhờ mọi người viết giúp hàm trích lọc ra mã hiệu, tên gọi của Khách hàng, công trình (có pfile kèm theo). Xin chân thành cảm ơn !

    Có nhiều cách, dùng tạm cái này (vì tôi thấy dữ liệu của bạn có vậy, nếu đầy đủ hơn thì lại khác…):
    Bạn xem file đính kèm!

    Hihi, phải nói thật là mình bái phục bạn dat_butmuc, với cái mớ dữ liệu "tả pí lù" đó mà bạn có kiên nhẫn đặt công thức, nếu như mình có chiêu đãi 5 ve mình cũng ứ làm
    Nhưng thấy bạn làm mình cũng tham gia mấy cái hàm "xi-ma-chao" cho "dzui" và đỡ chóng mặt
    to: longlt08_ Dữ liệu bạn nên sắp xếp lại cho nó "pha học" một tý
    Thân

    Chào bạn ! Cảm ơn bạn đã quan tâm giúp đỡ. Dữ liệu "mớ" này mình lấy từ 1 CSDL để chuyển về excel nên chẳng có thứ tự gì cả. Mình đã xem ví dụ của bạn nhưng chẳng xem được hàm của bạn để vận dụng. Bạn cho unhide lên để mình học tập thêm với. Cảm ơn bạn !

    "Unhide công thức" của bác concongia cho bạn đây (Alt+F11 thì sẽ thấy)
    Public Function makh(vung As Range) As String
    Dim i, j As Integer
    For i = 4 To Len(vung)
    If Mid(vung, i, 1) = "-" And IsNumeric(Mid(vung, i – 1, 1)) And IsNumeric(Mid(vung, i + 1, 1)) = False Then j = i
    Next
    makh = Left(vung, j – 1)
    End Function
    Public Function tenkh(vung As Range) As String
    Dim i, j As Integer
    For i = 4 To Len(vung)
    If Mid(vung, i, 1) = "-" And IsNumeric(Mid(vung, i – 1, 1)) And IsNumeric(Mid(vung, i + 1, 1)) = False Then j = i
    Next
    tenkh = Right(vung, Len(vung) – j)
    End Function
    Public Function macv(vung As Range) As String
    Dim i, j As Integer
    For i = 4 To Len(vung)
    If Mid(vung, i, 1) = ":" And IsNumeric(Mid(vung, i – 1, 1)) And IsNumeric(Mid(vung, i + 1, 1)) = False Then j = i
    Next
    macv = Left(vung, j – 1)
    End Function
    Public Function congtrinh(vung As Range) As String
    Dim i, j As Integer
    For i = 4 To Len(vung)
    If Mid(vung, i, 1) = ":" And IsNumeric(Mid(vung, i – 1, 1)) And IsNumeric(Mid(vung, i + 1, 1)) = False Then j = i
    Next
    congtrinh = Right(vung, Len(vung) – j)
    End Function

  46. hands says:

    Xin chào các anh chị
    Em làm dự toán, cần link giá trị VL, NC, MTC từ bảng định mức sang bảng tiên lượng. Em link thủ công thì mất nhiều thời gian quá. Nhờ các anh chị viết giùm hàm truy xuất các giá trị VL, NC, MTC (như comment ở ô bôi vàng) để em chỉ việc copy công thức đó xuống các hàng dưới là được.
    Em xin cảm ơn các anh chị!

    Cách thực hiện:
    Nhập định mức bên sheet dinh muc, sau đó qua sheet tien luong copy dòng trên xuống và nhập khối lượng công tứhc sẽ tự tính.

    Em lắp công thức đó của bác vào bảng của em, muốn sửa tí chút cho phù hợp nhưng vẫn chưa chạy được. Em gửi cả file của em lên nhờ bác sửa lại trực tiếp vào bảng giúp em nhé. Em xin cảm ơn!

    Tôi có chỉnh sửa lại trong file của Bạn để tiện lập công thức, chứ nếu thực hiện như Bạn sẽ khó khăn cho việc liên kết công thức. bạn xem file nhé!

  47. hands says:

    Hỏi cách lọc điều kiện ngày và đếm ngày

    Em mới tiếp xúc excel không lâu nên không biết mong các bác giúp.
    Vấn đề thứ nhất là: 1 bảng cho thông tin học sinh gồm có ngày tháng năm sinh. bây giờ cần lọc những học sinh có số tuổi <=15 nhưng tính đến thời điểm năm 2005
    Vấn đề thứ hai là: 1 bảng cho thông tin khách hàng có ngày đến và ngày đi của một nhà nghỉ và bây giờ cần tính các các khách ở trong một ngày nằm trong khoảng giữa.
    Đây em gửi các bác bảng excel mong các bác giúp em càng sớm càng tốt
    2 bài nắm ở 2 sheet khác nhau
    Em xin cảm ơn trước.

    Bạn nói rằng:

    Lọc ra những học sinh <=15 tuổi (năm hiện tại là 2005)

    Đã tính tuổi (chính xác) thì phải có mốc thời gian bao gồm cả NGÀY, THÁNG, NĂM —> năm hiện tại là 2005, vậy NGÀY là ngày mấy và THÁNG là tháng mấy?

    Đề nó chỉ cho như thế thôi bác ạh. Bác cứ tính là này cuối cùng của năm 2005 đi. 31/12/2005. Bác làm được em xin cảm ơn

    Theo dữ liệu của bạn, tính đến ngày 31/12/2005 thì ai cũng.. <15 tuổi cả —> Vậy nên… khỏi cần lọc luôn
    Còn nếu tổng quát hơn (có ai đó > 15 tuổi) thì sẽ dùng Advanced Filter để lọc với cell điều kiện có công thức =DATEDIF(C3,"2005/12/31","Y")<=15
    Advanced Filter bạn biết chứ, giống như hình này đây:
    1456

    Thank bác. em làm được rồi. Bác giúp em luôn vấn đề 2 ở sheet 2 bác xử lý giúp em luôn cái

    Bạn dùng hàm SUMPRODUCT nhé!

    =SUMPRODUCT(($D$2:$D$9<=DATE(2008,5,1))*($E$2:$E$9>=DATE(2008,5,1)))
  48. hands says:

    Lọc Danh Sách

    Mình có ví dụ như bài gởi bạn nào có thể làm được xin chỉ giáo dùm
    Cảm ơn các bạn rất nhiều.

    Bạn dùng công thức mảng này cho ô G3

    =IF(COUNTIF($A$3:$A$11,G$2)<ROW(A1),"",INDEX($C:$C,SMALL(IF($A$3:$A$11=G$2,ROW($A$3:$A$11),""),ROW(A1))))

    Chú ý: Nhập công thức xong kết thúc bằng tổ hợp phím Ctrl + Shift + Enter

  49. hands says:

    Cách dùng Criteria để nhập điều kiện …

    Em có 1 bảng dữ liệu có 2 cột: Ngaythang và TonKho.Đề bài là tìm Giá trị TonKho lớn nhất từ ngày 1 đến ngày 15 là bao nhiêu? Các bác giúp em lập vùng điều kiện này…em cảm ơn…

    Dùng Advanced Filter
    – Click vào Copy to another location
    – Mục List range: lấy vùng dữ liệu $A$2:$D$9
    – Mục Copy to: chọn $A$14:$D$14
    – Click vào Unique records only
    – OK

    Bác ndu96081631 ơi, B làm ơn giúp em với, bài em hỏi ở trên về lọc màu. Thanks

    Tôi gữi bạn file ví dụ này.
    Chú ý
    – Công thức tính giá trị màu nằm trong name nha (Menu InsertNameDefine)
    – Quy định màu sắc đã được liệt kê tại vùng H1:BK2 cho bạn tham khảo
    – Hãy filter cột phụ (Cột D) để lọc theo màu
    – Mỗi lần thay đổi màu sắc, hãy bấm F9 để cập nhật giá trị

  50. hands says:

    Em chào các bác, E có 1 bảng tính 1 sheet là dữ liệu 1 sheet cần lọc. Khi chọn từ ô A1 lô hàng số 1 thì vùng dữ liệu A6:A21 hiện lên đúng số liệu lô hàng số 1 bên sheet1, tương tự lô hàng 2 và 3. +-+-+-+

    Thích công thức thì có công thức,
    Xem file:

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm