[Xin ý kiến] Điều chỉnh kích thước ảnh cho vừa ô

Liên hệ QC

marcosheath479

Thành viên chính thức
Tham gia
23/2/22
Bài viết
53
Được thích
5
Chào mọi người,

Mình có file gồm cột A (họ tên) và cột B (hình ảnh). File này là do chi nhánh gửi về. Do làm thủ công nên hình ảnh có thể không vừa khít ô. Mình nhờ moi người giúp đỡ đoạn code hoặc công cụ nào có thể xử lý ảnh hàng loạt cho vừa khít ô ở cột B.

Cám ơn mọi người rất nhiều.
 

File đính kèm

  • New Microsoft Excel Worksheet.xlsx
    22.1 KB · Đọc: 13
Vừa khít ô không hay. Vd. có ô - khung 200 x 140. Nếu nhập ảnh 170 x 150 vừa khít ô thì rất xấu do ảnh bị méo - 2 chiều phóng to không cùng tỉ lệ.
Đép nhất không phải vừa khít mà là CENTER. Tất nhiên đả CENTER là phải cân xứng. Tức với 3 ảnh trong tập tin thì chúng phải được dịch về bên phải sao cho 2 dải "trắng" ở 2 bên như nhau.
Vẫn cứ muốn vừa khít ô cũng không khó. Code nhập ảnh hàng loại cũng có đầy trên GPE. Vd. tham khảo, đọc kỹ bài #7

 
Upvote 0
Vừa khít ô không hay. Vd. có ô - khung 200 x 140. Nếu nhập ảnh 170 x 150 vừa khít ô thì rất xấu do ảnh bị méo - 2 chiều phóng to không cùng tỉ lệ.
Đép nhất không phải vừa khít mà là CENTER. Tất nhiên đả CENTER là phải cân xứng. Tức với 3 ảnh trong tập tin thì chúng phải được dịch về bên phải sao cho 2 dải "trắng" ở 2 bên như nhau.
Vẫn cứ muốn vừa khít ô cũng không khó. Code nhập ảnh hàng loại cũng có đầy trên GPE. Vd. tham khảo, đọc kỹ bài #7

Cám ơn bạn. Mình sẽ làm theo hướng dẫn.
 
Upvote 0
Mình đã đọc nhưng do trình độ kém nên không làm được (cụ thể là không biết copy code nào và vào đâu). Mình chỉ cần đoạn code đơn giản để chỉnh kích thước hàng loạt ảnh vừa khít ô ở cột B (file này mình nhận từ người khác) thì sẽ copy code nào :). Mong bạn hỗ trợ :)
 
Upvote 0
Mình đã đọc nhưng do trình độ kém nên không làm được (cụ thể là không biết copy code nào và vào đâu). Mình chỉ cần đoạn code đơn giản để chỉnh kích thước hàng loạt ảnh vừa khít ô ở cột B (file này mình nhận từ người khác) thì sẽ copy code nào :). Mong bạn hỗ trợ :)
Tôi viết rất rõ
Code tổng quát để chèn ảnh là InsertPicture. Trong tương lai trong bất cứ tập tin nào cần chèn ảnh thì thêm code của InsertPicture vào rồi chèn ảnh như trong code Worksheet_Change ở trên. Cả InsertPicture và showPicture nằm ở Module1. Hãy đọc chú thích mà tôi viết rất cặn kẽ để biết cách dùng 2 sub.

Trong bài là trường hợp cứ nhập tên ảnh trên đĩa thì code sẽ nhập ảnh và định vị nó. Còn nếu muốn nhập hàng chục tên ảnh rồi sau khi nhấn Button mới nhập ảnh thì viết code trong ButtonClick. Thế thôi. Ở bài bên kia có làm đành hoàng thì cứ bắt chước thôi.
 
Upvote 0
Chào bạn, Mình đã thử nhiều lần nhưng vẫn không được, mong bạn thông cảm. Mình đành copy lại đoạn code của bạn và chỉnh sửa lại tí xíu. Hiện giờ đoạn code đã căn giữa tất cả hình ảnh trong cột B của Sheet1. Bạn có thể giúp mình thêm đoạn code để kéo hình ảnh đều về 2 phía trái và phải, mục đích là để hình ảnh lấp đầy cả ô. Cám ơn bạn rất nhiều.
 

File đính kèm

  • CHINH SUA ANH.xlsm
    29 KB · Đọc: 6
Upvote 0
Chào bạn, Mình đã thử nhiều lần nhưng vẫn không được, mong bạn thông cảm. Mình đành copy lại đoạn code của bạn và chỉnh sửa lại tí xíu. Hiện giờ đoạn code đã căn giữa tất cả hình ảnh trong cột B của Sheet1. Bạn có thể giúp mình thêm đoạn code để kéo hình ảnh đều về 2 phía trái và phải, mục đích là để hình ảnh lấp đầy cả ô. Cám ơn bạn rất nhiều.
Bạn có biết đọc tiếng Việt không vậy?
Tôi viết rất rõ trong chủ đề mà tôi cung cấp link
Code tổng quát để chèn ảnh là InsertPicture. Trong tương lai trong bất cứ tập tin nào cần chèn ảnh thì thêm code của InsertPicture vào rồi chèn ảnh như trong code Worksheet_Change ở trên. Cả InsertPicture và showPicture nằm ở Module1. Hãy đọc chú thích mà tôi viết rất cặn kẽ để biết cách dùng 2 sub.
Tôi cũng bỏ công ra để nhắc lại trong bài #5. Bây giờ bạn nhìn lại tập tin của mình và hãy nói cho tôi biết: bạn chèn InsertPicture vào đâu? Làm gì có InsertPicture. Bạn đã không làm như tôi hướng dẫn.

Mà tôi đã viết rõ trong bài #5. Có 2 cách chèn ảnh: một cách là nhập tên ảnh nào thì chèn ngay ảnh đó. Cách thứ 2 là nhập hàng loạt tên ảnh rồi sau đó mới nhấn nút thì mới chèn hàng loạt ảnh. Bạn muốn giúp thì cũng nên chọn và nói rõ bạn muốn cách nào chứ.

Tôi làm cho bạn theo cách 2.

1. InsertPicture ở Module1. Nút "chèn ảnh" được gán cho sub chen_anh ở Module2.

2. Hiện tại có
Mã:
InsertPicture ThisWorkbook.Path & "\Anh\" & cell_.Value & ".jpg", cell_.Offset(0, 1), False, False, True

- Tức các ảnh có tên như ở cột A sẽ nằm ở thư mục ANH, mà thư mục Anh và tập tin Excel nằm cùng thư mục.
- các ảnh có định dạng JPG
- ảnh vừa khít ô
- mang tập tin đi đâu thì phải mang ảnh theo.

Muốn vd. PNG, ảnh Center, không phải mang ảnh theo thì sửa code. Muốn sửa code thì đọc chú thích ở sub InsertPicture.
 

File đính kèm

  • Desktop.rar
    373.6 KB · Đọc: 15
Upvote 0
Chào bạn, như trong bài đăng mình có ghi "Mình có file gồm cột A (họ tên) và cột B (hình ảnh). File này là do chi nhánh gửi về". Tức là file (mình nhận) đã có sẵn hình ảnh trong đó (nên mình không cần insert hình ảnh vào file này nữa). Cám ơn bạn đã hỗ trợ mình.
 
Upvote 0
Chào mọi người,

Mình có file gồm cột A (họ tên) và cột B (hình ảnh). File này là do chi nhánh gửi về. Do làm thủ công nên hình ảnh có thể không vừa khít ô. Mình nhờ moi người giúp đỡ đoạn code hoặc công cụ nào có thể xử lý ảnh hàng loạt cho vừa khít ô ở cột B.

Cám ơn mọi người rất nhiều.

Đông tây nam bắc 5 từ.
 

File đính kèm

  • FitShape.xlsm
    28.5 KB · Đọc: 22
Upvote 0
Tức là file (mình nhận) đã có sẵn hình ảnh trong đó (nên mình không cần insert hình ảnh vào file này nữa).
Vừa khít ô?

Bạn thử code sau.
Mã:
Sub resize_pic()
Dim shp As Shape
Dim sh As Worksheet
Dim khung As Range

Set sh = Sheets("Sheet1")

    For Each shp In sh.Shapes
        Set khung = shp.TopLeftCell
        With shp
            .LockAspectRatio = 0
'            .ScaleWidth 1, msoTrue
'            .ScaleHeight 1, msoTrue
            .Left = khung.Left
            .Top = khung.Top
            .Width = khung.Width
            .Height = khung.Height
        End With
    Next shp
End Sub
 
Upvote 0
Chào mọi người,

Mình có file gồm cột A (họ tên) và cột B (hình ảnh). File này là do chi nhánh gửi về. Do làm thủ công nên hình ảnh có thể không vừa khít ô. Mình nhờ moi người giúp đỡ đoạn code hoặc công cụ nào có thể xử lý ảnh hàng loạt cho vừa khít ô ở cột B.

Cám ơn mọi người rất nhiều.
Của bạn đây. mở ra và thưởng thức
 

File đính kèm

  • ResaiPic.xlsm
    21 KB · Đọc: 14
Upvote 0
Chào mọi người,

Mình có file gồm cột A (họ tên) và cột B (hình ảnh). File này là do chi nhánh gửi về. Do làm thủ công nên hình ảnh có thể không vừa khít ô. Mình nhờ moi người giúp đỡ đoạn code hoặc công cụ nào có thể xử lý ảnh hàng loạt cho vừa khít ô ở cột B.

Cám ơn mọi người rất nhiều.
Làm liên quan tới shapes có thể bạn sẽ phải quan tâm một số vấn đề:
1/ Hình trong file không nằm theo đúng chiều thuận, mà có thể họ đã xoay 90 hay 270 độ
2/ Có thể trong file có nhiều shape, mà không nhất thiết vùng nào cũng xử lý, nên khi xử lý cần chọn vùng cụ thể (tùy mục đích)
3/ Nên tính tâm shape làm căn cứ chọn ô có lẽ phù hợp hơn góc trên bên trái, vì đôi khi họ để lệch shape một xíu ra ô khác, góc trên trái sẽ sang ô khác so với tâm
Mình chỉ nói để bạn cân nhắc thôi :D
 
Upvote 0
Vừa khít ô?

Bạn thử code sau.
Mã:
Sub resize_pic()
Dim shp As Shape
Dim sh As Worksheet
Dim khung As Range

Set sh = Sheets("Sheet1")

    For Each shp In sh.Shapes
        Set khung = shp.TopLeftCell
        With shp
            .LockAspectRatio = 0
'            .ScaleWidth 1, msoTrue
'            .ScaleHeight 1, msoTrue
            .Left = khung.Left
            .Top = khung.Top
            .Width = khung.Width
            .Height = khung.Height
        End With
    Next shp
End Sub

[/QUOTE]
Thầy @batman1 ơi. Em chạy lệnh thì tất cả các shapes vừa khung giờ em muốn nó chỉ kích vào shapes nào thì shapes đó vừa khung, shapes còn lại giữ nguyên
 
Upvote 0
Lần sau viết bài ngoài đoạn trích nhé. Nếu không biết sử dụng diễn đàn thì trước tiên phải học cách sử đụng.

Thầy @batman1 ơi. Em chạy lệnh thì tất cả các shapes vừa khung giờ em muốn nó chỉ kích vào shapes nào thì shapes đó vừa khung, shapes còn lại giữ nguyên

1. Khi muốn vừa khít chỉ những ô được chọn (chọn 1, 2 hoặc tất cả) thì chọn chúng rồi thực hiện sub resize_selected_pic. Sub resize_selected_pic được chạy cho ActiveSheet.

2. Khi muốn vừa khít ô cho tất cả thì chạy sub resize_all_pic. Sub resize_all_pic được chạy cho các picture trên sheet Sheet1 (tên sheet trong code của sub), nếu cần thì thay đổi.

Cả sub resize_selected_pic và sub resize_all_pic đều gọi sub resize_one_pic để thực thi cho từng picture.

3. Phải đảm bảo sao cho góc trên bên trái của picture nằm gọn trong khung. Nếu thấy có vấn đề thì dùng chuột kéo picture sang phải và xuống dưới một tí tẹo để góc trên bên trái của picture nằm gọn trong khung.

4. Code
Mã:
Sub resize_one_pic(ByVal pic As Shape)  ' sub tong quat de goi vua khit khung cho  hoac nhieu duoc chon, hoac cho tat ca
Dim khung As Range
    Set khung = pic.TopLeftCell
    With pic
        .LockAspectRatio = 0
        .Left = khung.Left
        .Top = khung.Top
        .Width = khung.Width
        .Height = khung.Height
    End With
End Sub

Sub resize_selected_pic()   ' chon  1 hoac nhieu de cho vua khit khung
Dim a
    If TypeName(Selection) = "Picture" Then
        resize_one_pic ActiveSheet.Shapes(Selection.ShapeRange.Name)
    Else
        For Each a In Selection
            If TypeName(a) = "Picture" Then resize_one_pic ActiveSheet.Shapes(a.Name)
        Next
    End If
End Sub

Sub resize_all_pic()   ' vua khit khung cho tat ca
Dim shp As Shape, sh As Worksheet
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    For Each shp In sh.Shapes
        resize_one_pic shp
    Next shp
End Sub

Lưu ý:

1. Code ở trên chỉ định vị chính xác khi góc trên bên trái của ảnh nằm gọn trong khung. Nếu góc đó nằn lẹm sang ô cùng dòng nhưng ở cột trước hoặc / và ô cùng cột nhưng ở dòng trước thì code cho là ô cùng dòng nhưng ở cột trước hoặc / và ô cùng cột nhưng ở dòng trước là khung.
Vì việc đảm bảo yêu cầu góc trên bên trái của ảnh nằm gọn trong khung đòi hỏi những thao tác thêm nên ta có thể giải quyết như sau để bỏ các thao tác thêm. Nếu ta chấp nhận tâm (điểm đối xứng của hình chữ nhật) của ảnh luôn được coi là thuộc về khung, tức khung là ô chứa tâm, thì chỉ cần thêm vào trước dòng Set khung = pic.TopLeftCell trong sub resize_one_pic code
Mã:
With pic
    .Left = .Left + .Width / 2
    .Top = .Top + .Height / 2
End With

2. Code ở trên dành cho ảnh được chèn theo cách: thẻ Insert -> Picture -> chọn ảnh, tức ảnh thuộc "Picture". Nhưng cũng có thể: Insert -> Shapes -> chọn Rectangle -> vẽ hình chữ nhật trên sheet -> phải chuột trên hình chữ nhật -> Format Shape -> FILL -> chọn "Picture or texture fill" -> File ... -> chọn ảnh. Nếu muốn phục vụ cả "Rectangle" thì thêm Or TypeName(Selection) = "Rectangle" trong Sub resize_selected_pic.

Code sau khi sửa như sau. Nếu không muốn điểm 1 thì xóa code thêm vào ở sub resize_one_pic. Nếu không muốn điểm 2 thì xóa code thêm vào ở Sub resize_selected_pic
Mã:
Sub resize_one_pic(ByVal pic As Shape)  ' sub tong quat de goi vua khit khung cho  hoac nhieu duoc chon, hoac cho tat ca
Dim khung As Range
    With pic
        .Left = .Left + .Width / 2
        .Top = .Top + .Height / 2
    End With
    Set khung = pic.TopLeftCell
    With pic
        .LockAspectRatio = 0
        .Left = khung.Left
        .Top = khung.Top
        .Width = khung.Width
        .Height = khung.Height
    End With
End Sub

Sub resize_selected_pic()   ' chon  1 hoac nhieu de cho vua khit khung
Dim a
    If TypeName(Selection) = "Picture" Or TypeName(Selection) = "Rectangle" Then
        resize_one_pic ActiveSheet.Shapes(Selection.ShapeRange.Name)
    Else
        For Each a In Selection
            If TypeName(a) = "Picture" Or TypeName(a) = "Rectangle" Then resize_one_pic ActiveSheet.Shapes(a.Name)
        Next
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Lần sau viết bài ngoài đoạn trích nhé. Nếu không biết sử dụng diễn đàn thì trước tiên phải học cách sử đụng.



1. Khi muốn vừa khít chỉ những ô được chọn (chọn 1, 2 hoặc tất cả) thì chọn chúng rồi thực hiện sub resize_selected_pic. Sub resize_selected_pic được chạy cho ActiveSheet.

2. Khi muốn vừa khít ô cho tất cả thì chạy sub resize_all_pic. Sub resize_all_pic được chạy cho các picture trên sheet Sheet1 (tên sheet trong code của sub), nếu cần thì thay đổi.

Cả sub resize_selected_pic và sub resize_all_pic đều gọi sub resize_one_pic để thực thi cho từng picture.

3. Phải đảm bảo sao cho góc trên bên trái của picture nằm gọn trong khung. Nếu thấy có vấn đề thì dùng chuột kéo picture sang phải và xuống dưới một tí tẹo để góc trên bên trái của picture nằm gọn trong khung.

4. Code
Mã:
Sub resize_one_pic(ByVal pic As Shape)  ' sub tong quat de goi vua khit khung cho  hoac nhieu duoc chon, hoac cho tat ca
Dim khung As Range
    Set khung = pic.TopLeftCell
    With pic
        .LockAspectRatio = 0
        .Left = khung.Left
        .Top = khung.Top
        .Width = khung.Width
        .Height = khung.Height
    End With
End Sub

Sub resize_selected_pic()   ' chon  1 hoac nhieu de cho vua khit khung
Dim a
    If TypeName(Selection) = "Picture" Then
        resize_one_pic ActiveSheet.Shapes(Selection.ShapeRange.Name)
    Else
        For Each a In Selection
            If TypeName(a) = "Picture" Then resize_one_pic ActiveSheet.Shapes(a.Name)
        Next
    End If
End Sub

Sub resize_all_pic()   ' vua khit khung cho tat ca
Dim shp As Shape, sh As Worksheet
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    For Each shp In sh.Shapes
        resize_one_pic shp
    Next shp
End Sub

Lưu ý:

1. Code ở trên chỉ định vị chính xác khi góc trên bên trái của ảnh nằm gọn trong khung. Nếu góc đó nằn lẹm sang ô cùng dòng nhưng ở cột trước hoặc / và ô cùng cột nhưng ở dòng trước thì code cho là ô cùng dòng nhưng ở cột trước hoặc / và ô cùng cột nhưng ở dòng trước là khung.
Vì việc đảm bảo yêu cầu góc trên bên trái của ảnh nằm gọn trong khung đòi hỏi những thao tác thêm nên ta có thể giải quyết như sau để bỏ các thao tác thêm. Nếu ta chấp nhận tâm (điểm đối xứng của hình chữ nhật) của ảnh luôn được coi là thuộc về khung, tức khung là ô chứa tâm, thì chỉ cần thêm vào trước dòng Set khung = pic.TopLeftCell trong sub resize_one_pic code
Mã:
With pic
    .Left = .Left + .Width / 2
    .Top = .Top + .Height / 2
End With

2. Code ở trên dành cho ảnh được chèn theo cách: thẻ Insert -> Picture -> chọn ảnh, tức ảnh thuộc "Picture". Nhưng cũng có thể: Insert -> Shapes -> chọn Rectangle -> vẽ hình chữ nhật trên sheet -> phải chuột trên hình chữ nhật -> Format Shape -> FILL -> chọn "Picture or texture fill" -> File ... -> chọn ảnh. Nếu muốn phục vụ cả "Rectangle" thì thêm Or TypeName(Selection) = "Rectangle" trong Sub resize_selected_pic.

Code sau khi sửa như sau. Nếu không muốn điểm 1 thì xóa code thêm vào ở sub resize_one_pic. Nếu không muốn điểm 2 thì xóa code thêm vào ở Sub resize_selected_pic
Mã:
Sub resize_one_pic(ByVal pic As Shape)  ' sub tong quat de goi vua khit khung cho  hoac nhieu duoc chon, hoac cho tat ca
Dim khung As Range
    With pic
        .Left = .Left + .Width / 2
        .Top = .Top + .Height / 2
    End With
    Set khung = pic.TopLeftCell
    With pic
        .LockAspectRatio = 0
        .Left = khung.Left
        .Top = khung.Top
        .Width = khung.Width
        .Height = khung.Height
    End With
End Sub

Sub resize_selected_pic()   ' chon  1 hoac nhieu de cho vua khit khung
Dim a
    If TypeName(Selection) = "Picture" Or TypeName(Selection) = "Rectangle" Then
        resize_one_pic ActiveSheet.Shapes(Selection.ShapeRange.Name)
    Else
        For Each a In Selection
            If TypeName(a) = "Picture" Or TypeName(a) = "Rectangle" Then resize_one_pic ActiveSheet.Shapes(a.Name)
        Next
    End If
End Sub
Em cảm ơn thầy rất nhiều ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom