Nhờ viết hàm tìm kiếm trong VBA (1 người xem)

Liên hệ QC

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

LuongVanHieu

Thành viên mới
Tham gia
24/8/17
Bài viết
18
Được thích
2
Giới tính
Nam
Lần trước đã nhờ các bác giúp đỡ nhưng giờ nảy sinh vấn đề mới là:
Hiện tại mình có file dự liệu
Bình thường mình dùng hàm Vlookup để tìm kiếm dự liệu ở sheets du lieu
Nhưng đợt này do tính chất công việc thay đổi nên mình buộc phải làm giá trị bằng link trực tiếp
Mong các bác giúp đỡ viết hộ mình cái đoạn code này được không
 

File đính kèm

Lần chỉnh sửa cuối:
Xin lỗi các bác em đã có sai sót trong up file
Cảm ơn @chisinhvnn nhắc nhở
Nội dung em muốn làm là như sau:
Viết 1 VBA để link dự liệu từ cột bên Sheet DuLieu vào Sheet DG
Nó là link trực tiếp
Hồi trước em dùng Vlookup để làm công việc này. Nhưng giờ do công việc cần nên mới chuyển sang link trực tiếp dự liệu
Mong các bác giúp đỡ
 

File đính kèm

Upvote 0
Tạm thời là macro cái đã; Hàm thì tính tiếp:
PHP:
Sub GPE()
 Dim WF As Object, Cls As Range, Rg0 As Range

 Set Rg0 = Range([c2], [c65500].End(xlUp).Offset(1)).SpecialCells(xlCellTypeBlanks)
 Set WF = Application.WorksheetFunction
 For Each Cls In Rg0
    With Cls.Offset(, 1)
        .Value = WF.Sum(Range(.Offset(0), .End(xlDown)))
    End With
 Next Cls
End Sub
 
Upvote 0
Tạm thời là macro cái đã; Hàm thì tính tiếp:
PHP:
Sub GPE()
 Dim WF As Object, Cls As Range, Rg0 As Range

 Set Rg0 = Range([c2], [c65500].End(xlUp).Offset(1)).SpecialCells(xlCellTypeBlanks)
 Set WF = Application.WorksheetFunction
 For Each Cls In Rg0
    With Cls.Offset(, 1)
        .Value = WF.Sum(Range(.Offset(0), .End(xlDown)))
    End With
 Next Cls
End Sub

Thực sự buổi sáng dậy thấy có câu trả lời rất chi là vui mừng rồi bác ah!
Nhưng khi chạy nó thật sự không được hiệu quả như mong muốn
Cái mình thực sự là: mình có vùng dự liệu (Dulieu) cần link trực tiếp bên DG sang dữ liệu
Dù sao cùng cảm ơn @Hoang2013 và mong bác và các bác giúp thêm
 
Upvote 0
Thực sự buổi sáng dậy thấy có câu trả lời rất chi là vui mừng rồi bác ah!
Nhưng khi chạy nó thật sự không được hiệu quả như mong muốn
Cái mình thực sự là: mình có vùng dự liệu (Dulieu) cần link trực tiếp bên DG sang dữ liệu
Dù sao cùng cảm ơn @Hoang2013 và mong bác và các bác giúp thêm
Bạn thử:
PHP:
Sub abc()
    Dim Rng1 As Range, Rng2 As Range, LR&, i&, sum1
    Dim GT As Range, Cll As Range
    LR = Sheets("dulieu").Rows.Count
    Set Rng1 = Sheets("Dulieu").Range("B2", Sheets("Dulieu").Range("B" & LR).End(3))
    Set Rng2 = Sheets("DG").Range("B3", Sheets("DG").Range("B" & LR).End(3))
    With Rng1
        For Each Cll In Rng2
            Set GT = .Find(Cll, , xlValues, xlWhole, , , True)
            If Not GT Is Nothing Then
                Range(GT.Offset(0, 1), GT.Offset(0, 1)).Copy
                Cll.Offset(0, 1).PasteSpecial (xlPasteValues)
                Application.CutCopyMode = False
            End If
        Next
    End With
    For i = Cells(Rows.Count, 2).End(3).Row To 2 Step -1
        If Cells(i, 1) = "" Then
            sum1 = sum1 + Cells(i, 3).Value
        Else
            Cells(i, 4) = sum1 + Cells(i, 3)
            sum1 = 0
        End If
    Next
End Sub
 
Upvote 0
Bạn thử:
PHP:
Sub abc()
    Dim Rng1 As Range, Rng2 As Range, LR&, i&, sum1
    Dim GT As Range, Cll As Range
    LR = Sheets("dulieu").Rows.Count
    Set Rng1 = Sheets("Dulieu").Range("B2", Sheets("Dulieu").Range("B" & LR).End(3))
    Set Rng2 = Sheets("DG").Range("B3", Sheets("DG").Range("B" & LR).End(3))
    With Rng1
        For Each Cll In Rng2
            Set GT = .Find(Cll, , xlValues, xlWhole, , , True)
            If Not GT Is Nothing Then
                Range(GT.Offset(0, 1), GT.Offset(0, 1)).Copy
                Cll.Offset(0, 1).PasteSpecial (xlPasteValues)
                Application.CutCopyMode = False
            End If
        Next
    End With
    For i = Cells(Rows.Count, 2).End(3).Row To 2 Step -1
        If Cells(i, 1) = "" Then
            sum1 = sum1 + Cells(i, 3).Value
        Else
            Cells(i, 4) = sum1 + Cells(i, 3)
            sum1 = 0
        End If
    Next
End Sub
Nhờ bác kiểm tra hộ em cái
Khi chạy nó chưa link được file
Nó mới cho giá trị về đùng ô cần tìm
 
Upvote 0
Lần trước đã nhờ các bác giúp đỡ nhưng giờ nảy sinh vấn đề mới là:
Hiện tại mình có file dự liệu
Bình thường mình dùng hàm Vlookup để tìm kiếm dự liệu ở sheets du lieu
Nhưng đợt này do tính chất công việc thay đổi nên mình buộc phải làm giá trị bằng link trực tiếp
Mong các bác giúp đỡ viết hộ mình cái đoạn code này được không
Tôi không biết VBA nhưng có cách khác có được không?
Tôi thấy dạo này diễn đàn lạm dụng VBA nhiều quá, từ những trường hợp có thể giải quyết bằng công thức đên những trường hợp có thể dùng công cụ có sẵn của Excel đều là VBA hết. Kiểu như bấm phát có kết quả sướng hơn ngồi xem và làm theo hướng dẫn.
 
Upvote 0
Tôi không biết VBA nhưng có cách khác có được không?
Tôi thấy dạo này diễn đàn lạm dụng VBA nhiều quá, từ những trường hợp có thể giải quyết bằng công thức đên những trường hợp có thể dùng công cụ có sẵn của Excel đều là VBA hết. Kiểu như bấm phát có kết quả sướng hơn ngồi xem và làm theo hướng dẫn.
Cám ơn bác!
Đúng thật là có lạm dụng VBA vì có 2 nguyên nhân bác ah:
+ Thứ 1: Em muốn học thêm tý VBA vì em quá kém
+ Thứ 2: Do tính chất công việc
Nhưng nếu thật bác có cách thủ công nào hay hãy chỉ cho em với
Hiện tại em đang link bằng cách chọn filter để link nhưng quá lâu ( vì bảng quá nhiều)
 
Upvote 0
Cám ơn bác!
Đúng thật là có lạm dụng VBA vì có 2 nguyên nhân bác ah:
+ Thứ 1: Em muốn học thêm tý VBA vì em quá kém
+ Thứ 2: Do tính chất công việc
Nhưng nếu thật bác có cách thủ công nào hay hãy chỉ cho em với
Hiện tại em đang link bằng cách chọn filter để link nhưng quá lâu ( vì bảng quá nhiều)
Bạn nhập công thức này:
Mã:
="="&CELL("address",INDEX(Dulieu!$C$2:$C$5,MATCH(B3,Dulieu!$B$2:$B$5,)))
Nếu muốn tham chiếu tương đối thì dùng thêm hàm SUBSTITUTE
Mã:
="="&SUBSTITUTE(CELL("address",INDEX(Dulieu!$C$2:$C$5,MATCH(B3,Dulieu!$B$2:$B$5,))),"$","")
Sau khi copy công thức cho cả cột thì Copy - Paste value, Dùng Find and replace chuyển chuỗi công thức thành công thức (Thay = thành =)
 
Upvote 0
Bạn nhập công thức này:
Mã:
="="&CELL("address",INDEX(Dulieu!$C$2:$C$5,MATCH(B3,Dulieu!$B$2:$B$5,)))
Nếu muốn tham chiếu tương đối thì dùng thêm hàm SUBSTITUTE
Mã:
="="&SUBSTITUTE(CELL("address",INDEX(Dulieu!$C$2:$C$5,MATCH(B3,Dulieu!$B$2:$B$5,))),"$","")
Sau khi copy công thức cho cả cột thì Copy - Paste value, Dùng Find and replace chuyển chuỗi công thức thành công thức (Thay = thành =)

Vâng cám ơn bác đây là 1 cách rất hay, và em đã dùng nó
Nhưng có 1 nhược điểm ko hiểu sau khi em Thay = thành = nó ko cho ấy. Em phải click trực tiếp vào nó mới nhảy
 
Upvote 0
Cám ơn bác!
Đúng thật là có lạm dụng VBA vì có 2 nguyên nhân bác ah:
+ Thứ 1: Em muốn học thêm tý VBA vì em quá kém
+ Thứ 2: Do tính chất công việc
Nhưng nếu thật bác có cách thủ công nào hay hãy chỉ cho em với
Hiện tại em đang link bằng cách chọn filter để link nhưng quá lâu ( vì bảng quá nhiều)
Bạn đang nghiên cứu VBA thì cho mình góp vui 1 Code nha:
Mã:
Sub TimDonGia()
    Dim sArr, tArr, dArr, I As Long, K As Long, R As Long, Er As Long, Et As Long
    Dim Dic As Object
Application.ScreenUpdating = False
Const Nguon = "'Dulieu'!"
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Dulieu")
    tArr = .Range("B1", .Range("B65535").End(3)).Resize(, 2).Value
End With
For I = 2 To UBound(tArr)
    Dic.Item(tArr(I, 1)) = I
Next I
With Sheets("DG")
    Er = .Range("B65535").End(3).Row
    sArr = .Range("A1:A" & Er).Resize(, 3).Value
    ReDim dArr(1 To UBound(sArr), 1 To 1)
    For I = 2 To UBound(sArr)
        K = K + 1
        If sArr(I, 1) = Empty Then
            R = Dic.Item(sArr(I, 2))
            If R Then dArr(K, 1) = "=" & Nguon & "C" & R
        End If
    Next I
   If K Then .Range("C2").Resize(K, 1) = dArr
    Et = Er
    For I = Er To 2 Step -1
        If .Range("A" & I) <> Empty Then
            .Range("D" & I) = "=Sum(C" & I + 1 & ":C" & Et & ")"
            Et = I - 1
        End If
    Next I
End With
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom