Cần giúp đỡ phần vlookup ảnh trong cell (1 người xem)

Liên hệ QC

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

vova2209

Thành viên tích cực
Tham gia
5/4/17
Bài viết
835
Được thích
112
Giới tính
Nam
Nghề nghiệp
Đường bộ
Em muốn 1 code VBA vlookup hình ảnh theo ô P12, link từ sheet 3.Data Cong thay cho công thức trong cell
Vì code dãn dòng trong file của em cứ liên quan đến Vlookup link anh là code chạy chậm lên hàng 20s, nên phải thay công thức cell bằng code VBA..
Mong được các a giúp đỡ!

=INDEX('3.Data Cong'!$D$3:$D$10000,MATCH($P$12,'3.Data Cong'!$A$3:$A$10000,0))
 
anh be09 nói đúng đấy, nhưng thầy Ndu nói cũng có lý đấy vì thực tế khi vba link hàm ngoài file dung lượng tăng 1mb ko hiểu lý do là sao
Nguyên nhân tăng dung lượng có thể là vầy:
Khi Load ảnh vào không xóa ảnh mà lại load tiếp thì ảnh sẽ chồng lên nhau mà mình không hay biết.
Nếu ai đã từng Copy dữ liệu từ 1 phần mềm vào Excel thì sẽ bị tình trạng này (dung lượng File càng ngày càng phình to mà không biết nguyên nhân).
 
Upvote 0
Nguyên nhân tăng dung lượng có thể là vầy:
Khi Load ảnh vào không xóa ảnh mà lại load tiếp thì ảnh sẽ chồng lên nhau mà mình không hay biết.
Nếu ai đã từng Copy dữ liệu từ 1 phần mềm vào Excel thì sẽ bị tình trạng này (dung lượng File càng ngày càng phình to mà không biết nguyên nhân).
à! mỗi lần next sang ảnh mới nó sẽ lưu lại giữ liệu à anh. Để e nhờ a lãng tử chỉnh lại ít code xóa ảnh cũ rồi mới chuyển giữ liệu sang!
 
Upvote 0
chưa hiểu cách bạn muốn thế nào nhưng nếu muốn chèn ảnh bằng hàm thì bạn tham khảo tại đây
http://www.giaiphapexcel.com/diendan/threads/chèn-hình-vào-cell-bằng-hàm-tự-tạo.51408/
hoặc tham khảo code này, cách hoạt động cũng như link trên, mình có chỉnh sửa lại là ảnh chèn vào sẽ theo kích thước của ảnh mà zoom lớn nhỏ đi để khớp với vùng chèn. tránh trường hợp ảnh ví dụ 400x400 khi chèn vào lại thành 400x600 (1 cạnh giữ nguyên, 1 cạnh bị kéo dài)
Mã:
'Tac gia: anhtuan1066
'---------------------------------------------------------------------------------------
' Chú Thích   : Tien ich chen Anh
'---------------------------------------------------------------------------------------
Public Function CommPic(ByVal PicPath As String, Optional ByVal PicCel As Range, _
            Optional ByVal ScaleWidth As Single = 1, Optional ByVal ScaleHeight As Single = _
            1) As String
    Dim mRng As Range, cmt As Comment, fso As Object, bChk As Boolean
    Dim NameOld As String
    Dim FormatPic(), LinkPic()
    Dim KichThuoc
    Dim TLe As Double
    Dim j As Byte, i As Byte
    On Error Resume Next
    Application.Volatile
    Set fso = CreateObject("Scripting.FileSystemObject")
    If PicCel Is Nothing Then Set PicCel = Application.ThisCell 'meu ko chon vung chen thi lay o hien tai
    PicCel(1, 1).Comment.Delete 'xoa comment
    On Error GoTo Thoat
    'neu duong dan nhap vao dung thi thuc hien lenh chen anh, nguoc lai thi kiem tra va chinh sua lai duong dan
    If fso.FileExists(PicPath) Then GoTo Nex
    'khai bao mang duoi dinh dang anh
    FormatPic = Array(".JPG", ".JPEG", ".JPE", ".TIFF", ".GIF", ".PNG", ".BMP")
    'khai bao duong dan 1: file hien tai, 2: picture
    LinkPic = Array(ActiveWorkbook, _
            CreateObject("Shell.Application").Namespace(&H27&).Self)
    'ten duong  dan anh nhap vao
    NameOld = UCase(PicPath)
    For i = 0 To UBound(FormatPic)
        If NameOld Like "*" & FormatPic(i) Then NameOld = Replace(NameOld, FormatPic(i), "")           'xoa dinh dang cu di
    Next i
    For j = 0 To UBound(LinkPic)
        For i = 0 To UBound(FormatPic)
            PicPath = LinkPic(j).Path & "\" & NameOld & FormatPic(i)    'thay the duong dan moi va dinh dang moi
            If fso.FileExists(PicPath) Then GoTo Nex
        Next i
    Next j
Nex:
    'neu link  chinh xac thi chen hinh anh
    If fso.FileExists(PicPath) Then
        If PicCel(1, 1).MergeCells Then
            Set mRng = PicCel(1, 1).MergeArea
            If mRng Is Nothing Then Set mRng = PicCel(1, 1)
        Else
            Set mRng = PicCel
        End If
        'KichThuoc d c d c
        KichThuoc = PicDimensions(PicPath)
        'KichThuoc = Mid(KichThuoc, 2, Len(KichThuoc) - 2)
        KichThuoc = Split(Replace(KichThuoc & "x" & mRng.Width & "x" & mRng.Height, " ", ""), "x")
        TLe = Application.WorksheetFunction.Min(KichThuoc(2) / KichThuoc(0), _
                KichThuoc(3) / KichThuoc(1))
        With Application.ThisCell
            If .Comment Is Nothing Then .AddComment
            .Comment.Text vbLf
            Set cmt = .Comment
            'CommPic = ""
        End With
        'Set cmt = mRng(1, 1).Comment
        cmt.Visible = True
        ActiveSheet.PageSetup.PrintComments = xlPrintInPlace
        With cmt.Shape
            .LockAspectRatio = msoFalse
            .Shadow.Visible = msoFalse
            .Line.ForeColor.RGB = PicCel.Interior.Color
            .AutoShapeType = msoShapeRectangle
            .Left = mRng.Left + (mRng.Width - (KichThuoc(0) * TLe)) / 2
            .Top = mRng.Top + (mRng.Height - (KichThuoc(1) * TLe)) / 2
            .Width = KichThuoc(0) * TLe 'mRng.Width
            .Height = KichThuoc(1) * TLe 'mRng.Height
            .ScaleWidth ScaleWidth, msoFalse, msoScaleFromMiddle
            .ScaleHeight ScaleHeight, msoFalse, msoScaleFromMiddle
            .Fill.UserPicture PicPath
        End With
    Else
        Application.ThisCell.Comment.Delete 'nguoc  lai xoa hinh di
    End If
Thoat:
    Set fso = Nothing
    Set PicCel = Nothing
    Set mRng = Nothing
    Set cmt = Nothing
End Function
Function PicDimensions(ByVal FileName As String) 'lay size anh
    On Error Resume Next
    Dim sName As String, sFolder As String
    Dim fso As Object, oShel As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oShel = CreateObject("Shell.Application")
    If fso.FileExists(FileName) Then
        sFolder = fso.GetFile(FileName).ParentFolder.Path
        sName = fso.GetFile(FileName).Name
        With oShel.Namespace("" & sFolder & "")
            PicDimensions = .Getdetailsof(.ParseName("" & sName & ""), 31)
        End With
    End If
    PicDimensions = Mid(PicDimensions, 2, Len(PicDimensions) - 2)
End Function
Anh ơi! file Dung lượng bị tăng lên nhiều quá, có thể do mỗi lần next nó lưu lại nên làm tăng dung lượng vài MB liền, a sửa dùm code xóa ảnh rồi mới đến chèn ảnh vào. em cảm ơn ạ!
 
Upvote 0
Anh ơi! file Dung lượng bị tăng lên nhiều quá, có thể do mỗi lần next nó lưu lại nên làm tăng dung lượng vài MB liền, a sửa dùm code xóa ảnh rồi mới đến chèn ảnh vào. em cảm ơn ạ!
bạn làm thế nào? file nào? code nào? mới biết đường chỉnh chứ bạn
 
Upvote 0
vậy giải nén file này vào ổ C nhé. xem đúng ý không
File này anh ơi! a sửa cho em code khi chọn sang số thứ tự ảnh cần lấy thì cái hình ảnh ở Vùng E9:J29 xóa đi, bởi vì giữ liệu nó bị lưu lại nguyên nhân làm kích thước file tăng lên dần.
 
Upvote 0
Upvote 0
File ở #6 anh ơi! File này anh ơi! a sửa cho em code khi chọn sang số thứ tự ảnh cần lấy thì cái hình ảnh ở Vùng E9:J29 xóa đi, bởi vì giữ liệu nó bị lưu lại nguyên nhân làm kích thước file tăng lên dần.
theo file đó thì bạn dùng công thức vloopkup rồi. cách đó mình không biết dùng nhé. thông cảm
 
Upvote 0
File ở #6 anh ơi! File này anh ơi! a sửa cho em code khi chọn sang số thứ tự ảnh cần lấy thì cái hình ảnh ở Vùng E9:J29 xóa đi, bởi vì giữ liệu nó bị lưu lại nguyên nhân làm kích thước file tăng lên dần.
Nếu tuần này rảnh anh sẽ làm giúp, Cần làm File bài 6 như thế này phải không?
- Tại P12 của sheet 3.KTHH Cong thay đổi thì lấy ảnh tương ứng từ sheet 3.Data Cong sang.

Tôi cần rõ ràng, khi hiểu thì mới giúp được.
 
Upvote 0
Nếu tuần này rảnh anh sẽ làm giúp, Cần làm File bài 6 như thế này phải không?
- Tại P12 của sheet 3.KTHH Cong thay đổi thì lấy ảnh tương ứng từ sheet 3.Data Cong sang.

Tôi cần rõ ràng, khi hiểu thì mới giúp được.
Đúng rồi anh! file ở bài #6. em dùng hàm này gán F3 "=INDEX('3.Data Cong'!$D$3:$D$10000,MATCH($P$12,'3.Data Cong'!$A$3:$A$10000,0))" để vookup sang sheet 3.KTHH Cong, chất lượng hình ảnh tốt vậy nên không có lý do gì ảnh bị mờ đi.
Theo em hiểu thì dùng VBA lệnh voolup tìm được sẽ coppy ảnh đó sang và fix chiều rộng và cao theo ý muốn, khi next số thứ tự tìm kiếm thì nó sẽ xóa ảnh cũ trong vùng copy sang.
 
Upvote 0
Đúng rồi anh! file ở bài #6. em dùng hàm này gán F3 "=INDEX('3.Data Cong'!$D$3:$D$10000,MATCH($P$12,'3.Data Cong'!$A$3:$A$10000,0))" để vookup sang sheet 3.KTHH Cong, chất lượng hình ảnh tốt vậy nên không có lý do gì ảnh bị mờ đi.
Theo em hiểu thì dùng VBA lệnh voolup tìm được sẽ coppy ảnh đó sang và fix chiều rộng và cao theo ý muốn, khi next số thứ tự tìm kiếm thì nó sẽ xóa ảnh cũ trong vùng copy sang.
Do File có dung lượng lớn đến 1.56 MB nên tôi gửi File qua Mail cho bạn (mà không tải lên đây).
Trong File tôi không có xem lại code như thế nào mà chỉ bổ sung vầy thôi:
1/ Sheet 3.Data Cong:
- Từ A3:A203 tôi đặt Name là Ma_ThuTu
- Từ D3 đến D203 tôi đặt Name là Link_HinhAnh (trong khung Refes to) gán hàm này vào.

=INDEX('3.Data Cong'!$D$3:$D$203,MATCH('3.KTHH Cong'!$P$12,Ma_ThuTu,0))

- Tiếp theo Click chọn hình 1 (Picture 1) có số thứ tự là 100, vào Home và chọn Copy (không được nhấn Ctrl+C), rồi sang sheet 3.KTHH Cong

2/ Sheet 3.KTHH Cong:
- Click vào P12 (với điều kiện P12 là số 100) rồi vào Home và chọn Paste > Picture (U),xong vào thanh Fomula Bar gõ =$P$12 và nhấn Enter.
- Tiếp theo Copy cái Name Link_HinhAnh và thay =$P$12 thành =Link_HinhAnh (vậy là xong như File tôi đã gửi Mail), khi thay đổi Spin Button thì hình sẽ thay đổi theo.

Lưu ý: Muốn cho hình to, nhỏ là tùy mình kéo giản hình ra hay thu vào (hình vẫn cố định)

 
Lần chỉnh sửa cuối:
Upvote 0
Do File có dung lượng lớn đến 1.56 MB nên tôi gửi File qua Mail cho bạn (mà không tải lên đây).
Trong File tôi không có xem lại code như thế nào mà chỉ bổ sung vầy thôi:
1/ Sheet 3.Data Cong:
- Từ A3:A203 tôi đặt Name là Ma_ThuTu
- Từ D3 đến D203 tôi đặt Name là Link_HinhAnh (trong khung Refes to) gán hàm này vào.

=INDEX('3.Data Cong'!$D$3:$D$203,MATCH('3.KTHH Cong'!$P$12,Ma_ThuTu,0))

- Tiếp theo Click chọn hình 1 (Picture 1) có số thứ tự là 100, vào Home và chọn Copy (không được nhấn Ctrl+C), rồi sang sheet 3.KTHH Cong

2/ Sheet 3.KTHH Cong:
- Click vào P12 (với điều kiện P12 là số 100) rồi vào Home và chọn Paste > Picture (U),xong vào thanh Fomula Bar gõ =$P$12 và nhấn Enter.
- Tiếp theo Copy cái Name Link_HinhAnh và thay =$P$12 thành =Link_HinhAnh (vậy là xong như File tôi đã gửi Mail), khi thay đổi Spin Button thì hình sẽ thay đổi theo.

Lưu ý: Muốn cho hình to, nhỏ là tùy mình kéo giản hình ra hay thu vào (hình vẫn cố định)
anh ơi! như này thì giống cái hàm cũ của em rồi "=INDEX('3.Data Cong'!$D$3:$D$8,MATCH('3.KTHH Cong'!$P$12,'3.Data Cong'!$A$3:$A$8,0))"
Mục đích của em là muốn 1 đoạn code VBA tìm kiếm coppy cái ảnh sang giống như đoạn code "CommPic" đang có sẵn trong file. Code "CommPic" này là lấy ảnh nằm ở ổ đĩa không phải trên file.
Lý do là khi đặt Name vào như cách trên a vừa hướng dẫn cho em ý, code fixrow ở sheet BBan code tự nhiên chậm như rùa. khi bỏ Link_HinhAnh đi thì lại chạy ầm ầm!
 
Upvote 0
anh ơi! như này thì giống cái hàm cũ của em rồi "=INDEX('3.Data Cong'!$D$3:$D$8,MATCH('3.KTHH Cong'!$P$12,'3.Data Cong'!$A$3:$A$8,0))"
Mục đích của em là muốn 1 đoạn code VBA tìm kiếm coppy cái ảnh sang giống như đoạn code "CommPic" đang có sẵn trong file. Code "CommPic" này là lấy ảnh nằm ở ổ đĩa không phải trên file.
Lý do là khi đặt Name vào như cách trên a vừa hướng dẫn cho em ý, code fixrow ở sheet BBan code tự nhiên chậm như rùa. khi bỏ Link_HinhAnh đi thì lại chạy ầm ầm!
Bài #7 thầy ndu có cho bạn code đúng theo ý rồi đấy sao không dùng.
 
Upvote 0
ảnh bị mờ quá anh à, links hàm cell thì không bị! thôi em dùng code links ngoài trên cũng hay. thanks các a đã giúp nhiều..
thấy dùng cách link ngoài nhanh hơn đấy bạn, thay vì bạn chèn vô sheet rồi canh chỉnh lại để dò được thì mất thời gian hơn. mà file còn tăng dung lượng khiến file chạy chậm đi nhiều.
hàm commpic(<link ảnh>, <vùng chèn ảnh>, <tỷ lệ Scale chiều ngang = 1>, <tỷ lệ Scale chiều dọc = 1 >)
 
Upvote 0
thấy dùng cách link ngoài nhanh hơn đấy bạn, thay vì bạn chèn vô sheet rồi canh chỉnh lại để dò được thì mất thời gian hơn. mà file còn tăng dung lượng khiến file chạy chậm đi nhiều.
hàm commpic(<link ảnh>, <vùng chèn ảnh>, <tỷ lệ Scale chiều ngang = 1>, <tỷ lệ Scale chiều dọc = 1 >)
Vâng em nghĩ lại rồi, dùng cách này vẫn hay nhiều!
 
Upvote 0
Web KT

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

Back
Top Bottom