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))
 
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))
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
 
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
code này dùng như nào anh nhỉ? a hướng đẫn cho em với! anh add code vào file đính kèm trên ví dụ cho em với
 
Lần chỉnh sửa cuối:
Upvote 0
vlookup ảnh đã cho vào ô ở sheet "3.Data Cong" bên cạnh. Anh sửa lại code hộ em chút
 

File đính kèm

Upvote 0

File đính kèm

Upvote 0
Người ta muốn lấy hình từ sheet 3.Data Cong chứ có phải lấy hình trên ổ đĩa đâu bạn
Tôi nghĩ nó giống như cách hoạt dộng của file đính kèm dưới đây mới đúng (code khá dài)
Vâng đúng là em muốn lấy ảnh trên file nằm ở sheet khác. Code trên vlookup sang bị mờ không nét như ảnh gốc ở sheet bên là sao thầy? bên kia ảnh mà căn vào vừa khung là mất không links được sang thầy ạ!
 
Upvote 0
Vâng đúng là em muốn lấy ảnh trên file nằm ở sheet khác. Code trên vlookup sang bị mờ không nét như ảnh gốc ở sheet bên là sao thầy? bên kia ảnh mà căn vào vừa khung là mất không links được sang thầy ạ!
Bạn không nên canh ảnh vừa khít khung, vì như thế thì code sẽ tìm nhầm (nhầm từ cell này sang cell khác). Bởi vậy phải canh hình nhỏ hơn cell 1 chút, mục đích để xác định chính xác hình nào nằm trong cell nào
Còn vấn đề hình kết quả mờ hơn hình gốc thì tôi.. đành chịu (qua nhiều công đoạn xử lý quá)
 
Upvote 0
Bạn không nên canh ảnh vừa khít khung, vì như thế thì code sẽ tìm nhầm (nhầm từ cell này sang cell khác). Bởi vậy phải canh hình nhỏ hơn cell 1 chút, mục đích để xác định chính xác hình nào nằm trong cell nào
Còn vấn đề hình kết quả mờ hơn hình gốc thì tôi.. đành chịu (qua nhiều công đoạn xử lý quá)
Vâng em cảm ơn thầy ạ! khi em dùng hàm cell "=INDEX('3.Data Cong'!$D$3:$D$10000,MATCH($P$12,'3.Data Cong'!$A$3:$A$10000,0))" lấy ảnh sang thì code khác của em hiệu suất chậm hẳn, mọi khi 0.5s đã xong, khi em dùng hàm cell lấy ảnh code khác chạy ì lên tới 10s lý do là sao thầy ạ!
 
Upvote 0
Vâng em cảm ơn thầy ạ! khi em dùng hàm cell "=INDEX('3.Data Cong'!$D$3:$D$10000,MATCH($P$12,'3.Data Cong'!$A$3:$A$10000,0))" lấy ảnh sang thì code khác của em hiệu suất chậm hẳn, mọi khi 0.5s đã xong, khi em dùng hàm cell lấy ảnh code khác chạy ì lên tới 10s lý do là sao thầy ạ!
Vậy bây giờ thay bằng code mới tôi đưa ở trên thì sao? Có cải thiện được gì không?
 
Upvote 0
Người ta muốn lấy hình từ sheet 3.Data Cong chứ có phải lấy hình trên ổ đĩa đâu bạn
Tôi nghĩ nó giống như cách hoạt dộng của file đính kèm dưới đây mới đúng (code khá dài)
em nghĩ nên để ảnh bên ngoài thì tốt hơn chứ thầy, vì như thế file sẽ nhẹ đi và sẽ tính toán nhanh hơn
chắc bạn ấy tham khảo cách làm tại trang này rồi, theo cách này thì file excel sẽ rất nặng, do phải chèn nhiều ảnh vào.
 
Lần chỉnh sửa cuối:
Upvote 0
Vâng đúng là em muốn lấy ảnh trên file nằm ở sheet khác. Code trên vlookup sang bị mờ không nét như ảnh gốc ở sheet bên là sao thầy? bên kia ảnh mà căn vào vừa khung là mất không links được sang thầy ạ!
bạn thử chèn ảnh khác vào xem, vì ngay tại sheet ảnh nguồn của bạn thì ảnh cũng chẳng rõ nét gì nên nó lấy qua y chang vậy thôi. nó đâu có thông minh đến nỗi tự động chỉnh ảnh mờ ảnh cũ thành ảnh full HD cho bạn được, excel mà đâu phải chương trình photoshop chỉnh sửa ảnh chuyên nghiêp đâu.
 
Upvote 0
bạn thử chèn ảnh khác vào xem, vì ngay tại sheet ảnh nguồn của bạn thì ảnh cũng chẳng rõ nét gì nên nó lấy qua y chang vậy thôi. nó đâu có thông minh đến nỗi tự động chỉnh ảnh mờ ảnh cũ thành ảnh full HD cho bạn được, excel mà đâu phải chương trình photoshop chỉnh sửa ảnh chuyên nghiêp đâu.
Vâng cảm ơn anh! cách links ngoài cũng được, e chọn cách này trông cũng chuyên nghiệp thật!
 
Upvote 0
em nghĩ nên để ảnh bên ngoài thì tốt hơn chứ thầy, vì như thế file sẽ nhẹ đi và sẽ tính toán nhanh hơn
chắc bạn ấy tham khảo cách làm tại trang này rồi, theo cách này thì file excel sẽ rất nặng, do phải chèn nhiều ảnh vào.
Tôi đâu có ý kiến gì về vụ để ảnh ngoài hay trong tốt hơn đâu?
Vấn đề là yêu cầu của người ta sao mình làm vậy thôi
Ngoài ra để nhận định cái nào tốt hơn thì.. khó nói lắm:
- Để ảnh trên sheet: file nặng nhưng sẽ yên tâm khi mang file sang máy khác
- Để ảnh riêng ra một thư mục: file nhẹ nhưng mỗi lần mang file sang máy khác sẽ phải "lôi" luôn thư mục ấy đi
Đương nhiên ta vẫn có cách khác để "dung hòa": Cho file lên web, file sẽ vừa nhẹ và mang đi đâu cũng chạy. Ấy vậy mà cách này vẫn có nhược điểm, đó là: phải có Internet và cho dù có internet nhưng mạng chậm thì file cũng load rất lâu
Nói chung là: LIỆU CƠM GẮP MẮM. Không biết sao là tốt cả!
 
Upvote 0
Tôi đâu có ý kiến gì về vụ để ảnh ngoài hay trong tốt hơn đâu?
Vấn đề là yêu cầu của người ta sao mình làm vậy thôi
Ngoài ra để nhận định cái nào tốt hơn thì.. khó nói lắm:
- Để ảnh trên sheet: file nặng nhưng sẽ yên tâm khi mang file sang máy khác
- Để ảnh riêng ra một thư mục: file nhẹ nhưng mỗi lần mang file sang máy khác sẽ phải "lôi" luôn thư mục ấy đi
Đương nhiên ta vẫn có cách khác để "dung hòa": Cho file lên web, file sẽ vừa nhẹ và mang đi đâu cũng chạy. Ấy vậy mà cách này vẫn có nhược điểm, đó là: phải có Internet và cho dù có internet nhưng mạng chậm thì file cũng load rất lâu
Nói chung là: LIỆU CƠM GẮP MẮM. Không biết sao là tốt cả!
Theo anh nghĩ thì đơn giản như vầy:
Chơi 1 code chọn thư mục bất kỳ và lấy tên File ảnh bất kỳ làm danh sách, thì dù cho có di chuyển File đó bất cứ nơi đâu thì mình cũng lấy được danh sách tên File, sau đó dựa vào danh sách tên File thì việc còn lại là chọn tên File để Load ảnh vào.
 
Upvote 0
Theo anh nghĩ thì đơn giản như vầy:
Chơi 1 code chọn thư mục bất kỳ và lấy tên File ảnh bất kỳ làm danh sách, thì dù cho có di chuyển File đó bất cứ nơi đâu thì mình cũng lấy được danh sách tên File, sau đó dựa vào danh sách tên File thì việc còn lại là chọn tên File để Load ảnh vào.
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
 
Upvote 0
Web KT

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

Back
Top Bottom