Code xác định vị trí và code lấy tổng các dòng trùng thỏa 2 điều kiện sau đó xóa dòng

Liên hệ QC

tutientrung

Thành viên hoạt động
Tham gia
10/3/07
Bài viết
151
Được thích
222
Nghề nghiệp
Quản lý SX
Các bạn giúp mình code để tối ưu file và thao tác ngắn gọn trong công việc .+-+-+-+
Nội dung cần giúp đỡ mình đã trình bày trong file.
Rất cám ơn các bạn đã giúp đỡ và quan tâm đến câu hỏi này.--=0
 

File đính kèm

Bạn chép đoạn code này vào phần code của sheet nhap xem sao


Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Cl As Range
   If Target.Address = "$F$1" Then
      Set Cl = Range("b12:b65536").Find(Target, LookIn:=xlValues,LookAt:=xlWhole)
       If Not Cl Is Nothing Then Cl.Select
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Rất cám ơn bác Sealand. Phần 1 đã được giải đáp.
Code hoạt động tốt ,nhưng em muốn thay đổi vị trí cột trả về linh động như công thức của E thì phải chỉnh code sao cho đúng vậy bác.Em đã thử ở phần( Range("b12:b65536")) thành (d12:d65536 hay y12:y65536) mà không được.
Còn phần 2 mong có hồi âm của bác nha.
Một lần nữa rất cám ơn bác và mong có các bác khác có giải pháp hay giúp em .
 
Upvote 0
Bạn thử kiểm tra tại cột C & cột cuối của bản dữ liệu dùm đúng í chưa nha

PHP:
Option Explicit

Sub TongVaXoaDong()
 Dim WF, Rng As Range, sRng As Range, dRng As Range
 Dim Dat As Date, jJ As Long, TgHMR As Double, HMR As Long
 Dim MyAdd As String, DCTg As String

 Set Rng = Range([A10], [A65500].End(xlUp))
 Range("G12:G65500").ClearContents:       Set WF = WorksheetFunction
 Columns("C:C").Interior.ColorIndex = 0
 
 Dat = WF.Min(Rng):              Set dRng = [A65500]
 For jJ = 0 To Date - Dat
   Set sRng = Rng.Find(Dat + jJ, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      MyAdd = sRng.Address
      Do
         If HMR = 0 Then
            HMR = sRng.Offset(, 1):       DCTg = sRng.Address
            TgHMR = sRng.Offset(, 2).Value
         ElseIf HMR = sRng.Offset(, 1).Value Then
            TgHMR = sRng.Offset(, 2).Value + TgHMR
            Set dRng = Union(sRng, dRng)
            sRng.Offset(, 2).Interior.ColorIndex = 38
         ElseIf HMR <> sRng.Offset(, 1).Value Then
            Range(DCTg).Offset(, 6).Value = TgHMR
            DCTg = sRng.Address
            TgHMR = sRng.Offset(, 2).Value
         End If
         Set sRng = Rng.FindNext(sRng)
      Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
      HMR = 0:            TgHMR = 0:      DCTg = ""
   End If
 Next jJ
 MsgBox dRng.Address
End Sub
 

File đính kèm

Upvote 0
Rất cám ơn bác Sealand. Phần 1 đã được giải đáp.
Code hoạt động tốt ,nhưng em muốn thay đổi vị trí cột trả về linh động như công thức của E thì phải chỉnh code sao cho đúng vậy bác.Em đã thử ở phần( Range("b12:b65536")) thành (d12:d65536 hay y12:y65536) mà không được.
Còn phần 2 mong có hồi âm của bác nha.
Một lần nữa rất cám ơn bác và mong có các bác khác có giải pháp hay giúp em .
Bạn sửa code của bác Sealand chút xíu như sau
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Cl As Range
   If Target.Address = "$F$1" Then
      Set Cl = Range("b12:b65536").Find(Target, LookIn:=xlValues, LookAt:=xlWhole)
       If Not Cl Is Nothing Then Cl.Offset(, [f2]).Select
    End If
End Sub
Khi đó bạn thay đổi số ở ô F2 chính là số cột lệch so với cột B (số dương = lệch sang phải, số âm = lệch sang trái)
 
Upvote 0
Upvote 0
Bạn sửa code của bác Sealand chút xíu như sau
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Cl As Range
   If Target.Address = "$F$1" Then
      Set Cl = Range("b12:b65536").Find(Target, LookIn:=xlValues, LookAt:=xlWhole)
       If Not Cl Is Nothing Then Cl.Offset(, [f2]).Select
    End If
End Sub
Khi đó bạn thay đổi số ở ô F2 chính là số cột lệch so với cột B (số dương = lệch sang phải, số âm = lệch sang trái)
Rất cám ơn bạn ,mình làm theo bạn và đã làm được đúng ý phần 1 rồi .Nhưng chỉ đúng ở file TinhTong ,mình copy code sang file khác và thay "$F$"1 bằng địa chỉ khác và phần (b12:65536) thay bằng cái khác thì code lại không chạy gì cả .Có code nào mà có thể copy sang bất cứ file nào và chỉ chỉnh 2 yếu tố là vị trí ô gõ và chỉnh dãy cần tìm kiếm là có thể dùng vô tư luôn không ? Còn phần 2 mong có tin của các bạn giúp mình.
 
Lần chỉnh sửa cuối:
Upvote 0
Rất cám ơn bạn ,mình làm theo bạn và đã làm được đúng ý phần 1 rồi .Nhưng chỉ đúng ở file TinhTong ,mình copy code sang file khác và thay "$F$"1 bằng địa chỉ khác và phần (b12:65536) thay bằng cái khác thì code lại không chạy gì cả .Có code nào mà có thể copy sang bất cứ file nào và chỉ chỉnh 2 yếu tố là vị trí ô gõ và chỉnh dãy cần tìm kiếm là có thể dùng vô tư luôn không ? Còn phần 2 mong có tin của các bạn giúp mình.

Code trong sheet Nhap
: Thực hiện công việc xác định vị trí và tự ghi thời gian khi nhập HMR

+ Đoạn code xác định và chọn vị trí
PHP:
    icol = IIf([B1] = "C", 1, IIf([B1] = "D", 2, IIf([B1] = "E", 3, 4)))
    If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
        Set Clls = [b12:b65536].Find([A1], LookIn:=xlValues, LookAt:=xlWhole)
        If Not Clls Is Nothing Then Clls.Offset(, icol).Select
    End If
+ Đoạn code Cột A tự cập nhật thời gian khi nhập HMR vào cột B
PHP:
    If Not Intersect(Target, Range("B4:B65535")) Is Nothing Then
        If Target <> "" Then
            Target.Offset(, -1) = Now()
        Else
            Target.Offset(, -1).Value = Empty
        End If
    End If
Code trong sheet KQ: Thực hiện công việc cộng dồn theo ngày và HMR, đưa kết quả sang sheet KQ
PHP:
Private Sub Worksheet_Activate()
Dim Arr(), ArrKQ(1 To 65000, 1 To 6)
With Sheet1
Set data = .[a4].CurrentRegion
    Temp = data.Value
    data.Sort Key1:=.[a4], Order1:=1, Key2:=.[b4], Order1:=1, Header:=1
    Arr = data.Offset(1).Value
End With
s = 1
For i = 1 To UBound(Arr) - 1
    ArrKQ(s, 1) = Arr(i, 1)
    ArrKQ(s, 2) = Arr(i, 2)
    ArrKQ(s, 3) = ArrKQ(s, 3) + Arr(i, 3)
    ArrKQ(s, 4) = ArrKQ(s, 4) + Arr(i, 4)
    ArrKQ(s, 5) = ArrKQ(s, 5) + Arr(i, 5)
    ArrKQ(s, 6) = ArrKQ(s, 6) + Arr(i, 6)
    If (Arr(i, 1) <> Arr(i + 1, 1)) + (Arr(i, 2) <> Arr(i + 1, 2)) Then s = s + 1
Next i
Application.ScreenUpdating = False
With ActiveSheet
    .[a2].CurrentRegion.Offset(1).ClearContents
    .[a2].Resize(s, 6) = ArrKQ
    With .[a2].CurrentRegion
        .AutoFilter Field:=3, Criteria1:="="
        .AutoFilter Field:=5, Criteria1:="="
        .AutoFilter Field:=4, Criteria1:="="
        .AutoFilter Field:=6, Criteria1:="="
    End With
    .[a2].Resize(s, 6).SpecialCells(12).EntireRow.Delete
    .AutoFilterMode = False
End With: data = Temp
Application.ScreenUpdating = True
End Sub

End Sub
Trong đó
1) Đoạn code
data.Sort Key1:=.[a4], Order1:=1, Key2:=.[b4], Order1:=1, Header:=1
Sắp xếp dữ liệu Nhập và hiện kết quả theo ngày tháng (hiện tại trong file đang dùng)
Nếu thay đổi vị trí [a4] với [b4] trong code trên
data.Sort Key1:=.[b4], Order1:=1, Key2:=.[a4], Order1:=1, Header:=1
Thì sắp xếp dữ liệu Nhập và hiện kết quả theo HMR

2) Đoạn code
PHP:
    With .[a2].CurrentRegion
        .AutoFilter Field:=3, Criteria1:="="
        .AutoFilter Field:=5, Criteria1:="="
        .AutoFilter Field:=4, Criteria1:="="
        .AutoFilter Field:=6, Criteria1:="="
    End With
    .[a2].Resize(s, 6).SpecialCells(12).EntireRow.Delete
    .AutoFilterMode = False
dùng để xoá những dòng có kết quả cộng dồn vẫn bằng 0 (bằng không)

----------------------------------------------------------
Bạn kiểm tra lại kết quả trong file đính kèm và cho ý kiến nhé
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình tham gia 1 file bạn xem nha
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Phần 2 em đã kiểm tra kết quả ,cả 2 cách làm của 2 bác Sealand và Boyxin đều cho ra kết quả chính xác theo yêu cầu .Em rất cám ơn và trân trọng các bác đã dành thời gian giúp em .Không dám đòi hỏi nhiều ,còn phần 1 khi nào các bác rảnh rỗi nghiên cứu cho em cái code(có thể cho hyperlink vào code không các bác ) có thể copy đi dùng cho bất cứ file nào ( chỉ thay địa chỉ ô gõ vào và cho dãy tìm kiếm là có thể sử dụng được,E không biết cách làm chỉ gợi ý thế này thôi).Em thấy code này rất hay sử dụng, vì công việc cần tìm kiếm có khi là ngay trong sheet hiên tại ,có lúc thì gõ số cần tìm trong sheet này nhưng cần xác định vị trí nằm trong sheet nào đó mình chỉ định (nội dung tìm kiếm có thể là text,hay number).Hiện tại thì em vẫn dùng công thức để làm việc này ,tại em thấy dư 1 thao tác nên muốn nhờ các bác tối ưu .Một lần nữa rất cám ơn các bác đã quan tâm giúp đỡ cho thằng em này.
 
Upvote 0
Nhưng chưa đúng ý em .Ý em là chẳng hạn có ngày 16/1 và Số HMR là 5 có 3 dòng như vậy thì tíng tổng con trên từng cột và kéo các dòng dưới lên về thành một dòng duy nhất là ngày 16/1 số HMR 5 có 4 cột .Trong file em có tô vàng và có công thức sum ví dụ .Nhờ bác xem lại dùm

Đó là cộng thử 1 cột cho bạn xem thôi & với lại chưa xóa; chứ giải fáp đúng rồi thì cộng cột nào & ghi vô đâu mả chả đặng hở bạn.

Mà trước đó bạn chưa nói là tính tổng ở cả 3 cột đó nha.
Bạn cần kiểm là nếu xóa những dòng có màu do macro tô là đúng hay chưa? Còn chuyện fép cộng đó, thì đã cộng đúng 1 cột thì 3 chứ cả tá cũng rứa mà thôi.

Chờ tin từ bạn!
 
Upvote 0
Cám ơn bạn đã quan tâm ,đôi khi lời văn mình chưa diễn tả được đúng bài toán .Mình xin lỗi vì đã không biết viết cho bạn hiểu ,gây mất thời gian cho bạn .Hiện tại bài của mình phần 1 và 2 đã được 2 bác Boyxin và Sealand giải đúng rồi .Cám ơn các bác và các bạn đã giành thời gian cho bài viết của mình.
 
Lần chỉnh sửa cuối:
Upvote 0
paperclip.png
Trong tập tin đính kèm
Đoạn Code trong sheet Nhap:
PHP:
    icol = IIf([B1] = "C", 1, IIf([B1] = "D", 2, IIf([B1] = "E", 3, 4)))
    If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
        Set Clls = [b3:b65536].Find([A1], LookIn:=xlValues, LookAt:=xlWhole)
        If Not Clls Is Nothing Then Clls.Offset(, icol).Select
    End If

sửa lại xíu xíu như sau sẽ gọn hơn chút
PHP:
    icol = IIf([B1] = "C", 1, IIf([B1] = "D", 2, IIf([B1] = "E", 3, 4)))
    If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
        [b:b].Find([A1]).Offset(, icol).Select
    End If
 
Upvote 0
paperclip.png
Trong tập tin đính kèm
Đoạn Code trong sheet Nhap:
PHP:
    icol = IIf([B1] = "C", 1, IIf([B1] = "D", 2, IIf([B1] = "E", 3, 4)))
    If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
        Set Clls = [b3:b65536].Find([A1], LookIn:=xlValues, LookAt:=xlWhole)
        If Not Clls Is Nothing Then Clls.Offset(, icol).Select
    End If

sửa lại xíu xíu như sau sẽ gọn hơn chút
PHP:
    icol = IIf([B1] = "C", 1, IIf([B1] = "D", 2, IIf([B1] = "E", 3, 4)))
    If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
        [b:b].Find([A1]).Offset(, icol).Select
    End If
Bác Boxyn cho em hỏi là :code này có thể copy đem đi sử dụng cho các file khác được không .Cấu trúc như nhau chỉ khác về,tên file ,tên sheet , dãy tìm kiếm (kết quả trả về sheet hiên tai ,hay sheet khác do mình chỉ định).Bác có thể cho em code dùng chung cho các file khác nhau nhưng tính năng thì tương tự như vậy.Tức là em có một file nào đó ,em xác định ô gõ vào sau đó cung cấp dãy số để tìm kiếm ,xác định cột trả về tuơng ứng với số tìm kiếm,thế là xong .Thao tác cuối cùng là gõ số vào là Enter 1 cái là đến số cần tìm ngay.Cái này em ứng dụng cho nhân viên nhập liệu (gõ số cần tìm ,enter >>đến luôn ô cần nhập )danh sách cần nhập bổ sung thông tin vào rất nhiều ,vài ngàn dòng .Dùng công cụ CTR+F và công thức Hyperlink của em thì cũng được nhưng hơi mất thời gian cho thao tác thừa.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác Boxyn cho em hỏi là :code này có thể copy đem đi sử dụng cho các file khác được không .Cấu trúc như nhau chỉ khác về,tên file ,tên sheet , dãy tìm kiếm (kết quả trả về sheet hiên tai ,hay sheet khác do mình chỉ định).Bác có thể cho em code dùng chung cho các file khác nhau nhưng tính năng thì tương tự như vậy.Tức là em có một file nào đó ,em xác định ô gõ vào sau đó cung cấp dãy số để tìm kiếm ,xác định cột trả về tuơng ứng với số tìm kiếm,thế là xong .Thao tác cuối cùng là gõ số vào là Enter 1 cái là đến số cần tìm ngay.

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Clls As Range, icol As Long
    If Not Intersect(Target, Range("A1:B1")) Is Nothing Then
        Cells([b:b].Find([A1]).Row, [B1]).Select
    End If
End Sub
Với đoạn code này (gắn code này trong sheet): thỏa mãn yêu cầu 1
+ Nhập vào ô [A1]: số hoặc chữ dùng để sẽ tìm trong cột B ([b:b]) để xác định dòng
+ Nhập số vào ô [B1]: để xác định cột
=> Khi đó: đã rõ cột, đã rõ dòng thì dễ dàng xác định được ô như mong muốn

Khi bạn hiểu tính năng, tác dụng của từng đoạn code thì bạn sẽ dễ dàng tùy chỉnh theo ý mình

-----------
Để tìm hiểu: hãy thay đổi dần dần từng phần code, xem kết quả để thấy tính năng tác dụng của đoạn code mà mình vửa mới chỉnh sửa
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã thử code bạn mới đưa mình thấy là kết quả trả về là số thứ tự dòng của excel chứ không phải giá trị cần tìm kiếm .Tức là mình tìm giá trị 3542 ở dòng 1015 thì khi gõ 3542 kết quả trả về ngay dòng 3542 ,sai vị trí .Kết quả đúng là trả về vị trí dòng 1015.Nhờ bạn xem lại dùm mình nha.Cám ơn bạn nhiều.
 
Upvote 0
Mình đã thử code bạn mới đưa mình thấy là kết quả trả về là số thứ tự dòng của excel chứ không phải giá trị cần tìm kiếm .Tức là mình tìm giá trị 3542 ở dòng 1015 thì khi gõ 3542 kết quả trả về ngay dòng 3542 ,sai vị trí .Kết quả đúng là trả về vị trí dòng 1015.Nhờ bạn xem lại dùm mình nha.Cám ơn bạn nhiều.

bạn đưa file mà test ra sai kết quả lên xem thế nào
 
Upvote 0
Nhờ bạn xem dùm mình xem mình chình code có đúng chưa nha.Cám ơn bạn (làm phiền bạn quá ...)
 

File đính kèm

Upvote 0
Nhờ bạn xem dùm mình xem mình chình code có đúng chưa nha.Cám ơn bạn (làm phiền bạn quá ...)

CHỜI CHỜI: File test của bạn gửi lên: HMR ở cột C chỉ có từ 1 đến 18 +-+-+-+

Bạn nói nhập 25, 26 vào ô A4 thì được - mình làm mãi không được, bạn tài thật giỏi hơn cả mình rồi --=0
Nói thêm: Khi nhập HMR vào ô A4 phải đảm bảo là sẽ tìm thấy HMR trong cột C đó nha

-----------------------------------
Bạn dùng thử đoạn code này xem sao (đã bẫy lỗi không tìm thấy HMR trong cột C)
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Clls As Range, icol As Long
On Error Resume Next
    If Not Intersect(Target, Range("A4:A5")) Is Nothing Then
        Cells([C:C].Find([a4]).Row, [A5]).Select
    End If
End Sub
Nếu thay dòng
Cells([C:C].Find([a4]).Row, [A5]).Select
Thành
Cells([C:C].Find([a4]).Row, AscW([a5]) - IIf(AscW([a5]) > 96, 96, 64)).Select
Thì Nhập chữ cái (tên cột, vd:A, B, C, ... hoặc a, b, c, ...) vào ô A5 sẽ được kết quả như mong muốn

Mong nhận được thông tin phản hồi --=0
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bạn nha.Cái vụ mà gõ số 25 ,26 gì đó là do mình lúc đầu thì mình để nhưng sau đó thấy không cần dài vậy nên xóa đi .Thành ra bạn không nhìn thấy ,mình mở ra xem lại mới thấy thế mới chết chứ lỵ(xóa đi xong save lại ,không để ý ghi chú ở trên text box)--=0--=0--=0.Xin lỗi bạn nha .MÌnh lấy code mới của bạn test lại thì phát sinh vấn đề là dãy số cần dò tìm từ nhỏ tới lớn thì Ok .Nhưng khi cho tìm dãy lớn giảm xuống nhỏ thì bị lỗi lấy hai số cuối của dãy đó .Nói hơi dài ,vậy bạn xem trong file mình giử kèm nha.Rất cám ơn sự nhiệt tình của bạn đó.Nói thêm về phần tính tổng mà bạn giúp mình trước đó mình test rrất ok luôn.Code bạn viết rất chuẩn,chạy nhanh cực luôn, mình cho chạy từ 7868 dòng sau khi chạy còn 5215 tiết kiệm được hơn 2653 dòng .Rất vui và ấn tượng với kết quả, khi loại bỏ được những cái dư thừa không đáng có .Bữa giờ nhìn mấy cái dòng dư thừa đó là bức xúc ,bức núc...--=0--=0 mà chưa xly nó được .Cám ơn bạn lần nữa nha.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom