Xin chỉnh sửa code Zoom ảnh trong excel

Liên hệ QC

domjnjc

Thành viên chính thức
Tham gia
7/5/12
Bài viết
70
Được thích
10
Xin chào các anh chị trên diễn đàn,

Em có tham khảo qua một thread với cùng chủ đề về Zoom ảnh khi click chuột vào ảnh, nhưng vấn đề phát sinh là khi thu nhỏ ảnh lại để cho vừa 1 ô CELL, sau đó click chuột để phóng ảnh lên, thì chất lượng ảnh không phải là chất lượng ban đầu mà là của ảnh thu nhỏ, trong file em có để 2 ảnh để anh/chị so sánh. Mong các anh chị giúp ạ.
 

File đính kèm

  • Hoso.xlsm
    99.5 KB · Đọc: 16
Cho cái link để tôi xem lại toàn bộ thông tin của thớt đó!
 
Upvote 0
Mắt tôi kém nên thấy chất lượng không thay đổi.

Nếu muốn thử nghiện thì làm như sau.

1. Chép code dưới vào 1 module
Mã:
Sub to_nho()
Dim size
    With Sheet1.Shapes(Application.Caller)
        If Len(.AlternativeText) Then
            size = Split(.AlternativeText, "-")
            .AlternativeText = ""
            .LockAspectRatio = 0
            .ScaleWidth size(0) / .Width, msoTrue
            .ScaleHeight size(1) / .Height, msoTrue
        Else
            .AlternativeText = .Width & "-" & .Height
            .ScaleWidth 1, msoTrue
            .ScaleHeight 1, msoTrue
        End If
    End With
End Sub

2. Insert vào sheet ảnh kích thước thực. Tiếp theo dùng chuột thu nhỏ ảnh cho vừa ý.

3. Phải chuột trên ảnh -> Assign Macro -> chọn sub to_nhỏ

Từ lúc này trở đi click thì hiện ảnh kích thước thực, click tiếp thì về lại ảnh nhỏ.
 
Upvote 0
Mắt tôi kém nên thấy chất lượng không thay đổi.

Nếu muốn thử nghiện thì làm như sau.

1. Chép code dưới vào 1 module
Mã:
Sub to_nho()
Dim size
    With Sheet1.Shapes(Application.Caller)
        If Len(.AlternativeText) Then
            size = Split(.AlternativeText, "-")
            .AlternativeText = ""
            .LockAspectRatio = 0
            .ScaleWidth size(0) / .Width, msoTrue
            .ScaleHeight size(1) / .Height, msoTrue
        Else
            .AlternativeText = .Width & "-" & .Height
            .ScaleWidth 1, msoTrue
            .ScaleHeight 1, msoTrue
        End If
    End With
End Sub

2. Insert vào sheet ảnh kích thước thực. Tiếp theo dùng chuột thu nhỏ ảnh cho vừa ý.

3. Phải chuột trên ảnh -> Assign Macro -> chọn sub to_nhỏ

Từ lúc này trở đi click thì hiện ảnh kích thước thực, click tiếp thì về lại ảnh nhỏ.
Em cảm ơn, hiệu quả vô cùng!
Bài đã được tự động gộp:

Có chuyên gia về VBA quản lý shape tại bài #3 rồi
Em có dùng Add-in theo bài #3 nhưng gặp vấn đề là ảnh phải nằm đúng đường dẫn và giữ đúng tên ảnh khi Insert, nếu không thì không hiển thị, vậy khi di chuyển file thì phải di chuyển đúng cả đường dẫn lẫn tên ảnh
 
Upvote 0
Em cảm ơn, hiệu quả vô cùng!
Bài đã được tự động gộp:


Em có dùng Add-in theo bài #3 nhưng gặp vấn đề là ảnh phải nằm đúng đường dẫn và giữ đúng tên ảnh khi Insert, nếu không thì không hiển thị, vậy khi di chuyển file thì phải di chuyển đúng cả đường dẫn lẫn tên ảnh
Tôi không nói bài 3 mà tôi nói người ở bài 3
 
Upvote 0
Mắt tôi kém nên thấy chất lượng không thay đổi.

Nếu muốn thử nghiện thì làm như sau.

1. Chép code dưới vào 1 module
Mã:
Sub to_nho()
Dim size
    With Sheet1.Shapes(Application.Caller)
        If Len(.AlternativeText) Then
            size = Split(.AlternativeText, "-")
            .AlternativeText = ""
            .LockAspectRatio = 0
            .ScaleWidth size(0) / .Width, msoTrue
            .ScaleHeight size(1) / .Height, msoTrue
        Else
            .AlternativeText = .Width & "-" & .Height
            .ScaleWidth 1, msoTrue
            .ScaleHeight 1, msoTrue
        End If
    End With
End Sub

2. Insert vào sheet ảnh kích thước thực. Tiếp theo dùng chuột thu nhỏ ảnh cho vừa ý.

3. Phải chuột trên ảnh -> Assign Macro -> chọn sub to_nhỏ

Từ lúc này trở đi click thì hiện ảnh kích thước thực, click tiếp thì về lại ảnh nhỏ.
Anh ơi, phát sinh vấn đề khi ấn Save file, click vào ảnh không phóng to thu nhỏ được nữa
 
Upvote 0
Anh ơi, phát sinh vấn đề khi ấn Save file, click vào ảnh không phóng to thu nhỏ được nữa
Để chèn ảnh bạn không dùng thẻ Insert nữa mà dùng code sau. Trước hết code tổng quát để chèn ảnh.
Mã:
Sub InsertPicture(ByVal PicFilename As String, Optional Target As range = Nothing, _
                Optional original As Boolean = False, Optional center As Boolean = False, _
                Optional LinkToFile As Boolean = False)
'    Target: vung nhap anh. Co the la nhieu cell
'    Neu Target = Nothing thi Target = ActiveCell
'    Neu original = True thi nhap anh kich thuoc thuc.
'    Neu original = FALSE thi neu center = True thi anh se center trong vung Target,
'    nguoc lai thi se vua khit vung Target
'    LinkToFile = False thi khong can giu anh tren dia, nguoc lai bat buoc phai giu anh de moi lan mo thi co
Dim w As Double, h As Double, shp As Shape, fso As Object
    If Target Is Nothing Then Set Target = ActiveCell
    On Error Resume Next
    Target.Parent.Shapes(Target.Address).Delete
    On Error GoTo 0
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If fso.FileExists(PicFilename) Then
        If LinkToFile Then
            Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoTrue, msoFalse, Target.left, Target.top, 0, 0)
        Else
            Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoFalse, msoTrue, Target.left, Target.top, 0, 0)
        End If
        If Not shp Is Nothing Then
            With shp
                If original Then
                    .ScaleWidth 1, msoTrue
                    .ScaleHeight 1, msoTrue
                ElseIf center Then
                    .ScaleWidth 1, msoTrue
                    .ScaleHeight 1, msoTrue
                    w = Target.Width
                    h = w * .Height / .Width
                    If h > Target.Height Then
                        h = Target.Height
                        w = h * .Width / .Height
                    End If
                    .left = Target.left + (Target.Width - w) / 2
                    .top = Target.top + (Target.Height - h) / 2
                    .Width = w
                    .Height = h
                Else
                    .Width = Target.Width
                    .Height = Target.Height
                End If
                shp.Name = Target.Address
                shp.Placement = xlMoveAndSize
            End With
        End If
    End If
     
     Set fso = Nothing
 End Sub

Đọc chú thích để biết cách dùng.

Bây giờ trong bất cứ tập tin nào có code trên (InsertPicture) mà ta muốn chèn ảnh thì ta phải xác định được ít nhất là <đường dẫn tới ảnh> và <vùng cần chèn ảnh>. Các tham số khác là tùy chọn.

Vd. cần chèn ảnh "d:\ngay mai em di.jpg" vào ô C2 trên shett1 thì chạy code

Mã:
Sub chen()
    InsertPicture "d:\ngay mai em di.jpg", ThisWorkbook.Worksheets("Sheet1").range("C2"), , True, True
End Sub

Trong trường hợp trên tôi chèn ảnh Center = True, LinkToFile = True. Tức đi đâu thì phải mang ảnh theo cùng tập tin Excel. Nếu là chèn mà có thể xóa ảnh đi, đi sang máy khác không cần mang ảnh theo thì tham số cuối cùng LinkToFile = False (đã là mặc định)

Có thể chèn một lúc hàng nghìn ảnh nếu có danh sách đường dẫn ảnh bẳng cách gọi InsertPicture trong vòng lặp FOR.

Ảnh sau khi được chèn thì gán cho macro to_nho
 
Upvote 0
Để chèn ảnh bạn không dùng thẻ Insert nữa mà dùng code sau. Trước hết code tổng quát để chèn ảnh.
Mã:
Sub InsertPicture(ByVal PicFilename As String, Optional Target As range = Nothing, _
                Optional original As Boolean = False, Optional center As Boolean = False, _
                Optional LinkToFile As Boolean = False)
'    Target: vung nhap anh. Co the la nhieu cell
'    Neu Target = Nothing thi Target = ActiveCell
'    Neu original = True thi nhap anh kich thuoc thuc.
'    Neu original = FALSE thi neu center = True thi anh se center trong vung Target,
'    nguoc lai thi se vua khit vung Target
'    LinkToFile = False thi khong can giu anh tren dia, nguoc lai bat buoc phai giu anh de moi lan mo thi co
Dim w As Double, h As Double, shp As Shape, fso As Object
    If Target Is Nothing Then Set Target = ActiveCell
    On Error Resume Next
    Target.Parent.Shapes(Target.Address).Delete
    On Error GoTo 0
   
    Set fso = CreateObject("Scripting.FileSystemObject")
   
    If fso.FileExists(PicFilename) Then
        If LinkToFile Then
            Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoTrue, msoFalse, Target.left, Target.top, 0, 0)
        Else
            Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoFalse, msoTrue, Target.left, Target.top, 0, 0)
        End If
        If Not shp Is Nothing Then
            With shp
                If original Then
                    .ScaleWidth 1, msoTrue
                    .ScaleHeight 1, msoTrue
                ElseIf center Then
                    .ScaleWidth 1, msoTrue
                    .ScaleHeight 1, msoTrue
                    w = Target.Width
                    h = w * .Height / .Width
                    If h > Target.Height Then
                        h = Target.Height
                        w = h * .Width / .Height
                    End If
                    .left = Target.left + (Target.Width - w) / 2
                    .top = Target.top + (Target.Height - h) / 2
                    .Width = w
                    .Height = h
                Else
                    .Width = Target.Width
                    .Height = Target.Height
                End If
                shp.Name = Target.Address
                shp.Placement = xlMoveAndSize
            End With
        End If
    End If
    
     Set fso = Nothing
 End Sub

Đọc chú thích để biết cách dùng.

Bây giờ trong bất cứ tập tin nào có code trên (InsertPicture) mà ta muốn chèn ảnh thì ta phải xác định được ít nhất là <đường dẫn tới ảnh> và <vùng cần chèn ảnh>. Các tham số khác là tùy chọn.

Vd. cần chèn ảnh "d:\ngay mai em di.jpg" vào ô C2 trên shett1 thì chạy code

Mã:
Sub chen()
    InsertPicture "d:\ngay mai em di.jpg", ThisWorkbook.Worksheets("Sheet1").range("C2"), , True, True
End Sub

Trong trường hợp trên tôi chèn ảnh Center = True, LinkToFile = True. Tức đi đâu thì phải mang ảnh theo cùng tập tin Excel. Nếu là chèn mà có thể xóa ảnh đi, đi sang máy khác không cần mang ảnh theo thì tham số cuối cùng LinkToFile = False (đã là mặc định)

Có thể chèn một lúc hàng nghìn ảnh nếu có danh sách đường dẫn ảnh bẳng cách gọi InsertPicture trong vòng lặp FOR.

Ảnh sau khi được chèn thì gán cho macro to_nho
Em làm được rồi, cảm ơn sự chỉ bảo tận tình của anh!:)
 
Upvote 0
Mắt tôi kém nên thấy chất lượng không thay đổi.

Nếu muốn thử nghiện thì làm như sau.

1. Chép code dưới vào 1 module
Mã:
Sub to_nho()
Dim size
    With Sheet1.Shapes(Application.Caller)
        If Len(.AlternativeText) Then
            size = Split(.AlternativeText, "-")
            .AlternativeText = ""
            .LockAspectRatio = 0
            .ScaleWidth size(0) / .Width, msoTrue
            .ScaleHeight size(1) / .Height, msoTrue
        Else
            .AlternativeText = .Width & "-" & .Height
            .ScaleWidth 1, msoTrue
            .ScaleHeight 1, msoTrue
        End If
    End With
End Sub

2. Insert vào sheet ảnh kích thước thực. Tiếp theo dùng chuột thu nhỏ ảnh cho vừa ý.

3. Phải chuột trên ảnh -> Assign Macro -> chọn sub to_nhỏ

Từ lúc này trở đi click thì hiện ảnh kích thước thực, click tiếp thì về lại ảnh nhỏ.
Thầy batman ơi. Em muốn cái này làm thành 1 cái add-in dùng cho excel thì sửa mã code thế nào cho phù hợp, và dùng được trên tất cả các sheet
 
Upvote 0
Web KT
Back
Top Bottom