Khuyên bạn Hỏi bài thì Bạn NÊN có file giả định đính kèm thì mới biết thế nào chứ, Không ai có thời gian để giúp bạn lập file giả định và code và bởi họ không biết ý bạn cụ thể là thế nào, code rồi lại phải sửa đi sửa lại.Em cần xóa ảnh trong file excel với 2 điều kiện là 1 cùng tên, 2 cùng kích thước thì sẽ xóa.
Ví dụ: Ảnh tên A và có kích thước Width = 0.01, Height = 0.01
Mong các bác giúp đỡ.
Em cảm ơn ạ!
Dạ vâng, e gửi file lên đây ạKhuyên bạn Hỏi bài thì Bạn NÊN có file giả định đính kèm thì mới biết thế nào chứ, Không ai có thời gian để giúp bạn lập file giả định và code và bởi họ không biết ý bạn cụ thể là thế nào, code rồi lại phải sửa đi sửa lại.
Bạn tham khảo code sau:Dạ vâng, e gửi file lên đây ạ
Bổ sung thêm ý là các ảnh cần xóa đều có kích thước 0.01*0.01 nhưng trong file có các ảnh khác cần giữ lại, nên không thể chọn hết các ảnh và bấm xóa được, và hơn nữa là số lượng ảnh quá nhiều, bấm xóa hết thì lại rất lâu, nên là xóa theo tên trùng và kích thước thì sẽ bớt đơ và nhanh hơn ạ
việc kiểm tra cả tên và kích thước để tránh trường hợp có ảnh khác cũng trùng tên mà lại bị xóa nhầm ạ
Option Explicit
Dim Shp As Shape
Sub LietKeAnh()
Dim t&
Dim KQ(1 To 100000, 1 To 4)
With Sheets("Sheet1")
For Each Shp In .Shapes
t = t + 1
' .Range("A" & t) = t
' .Range("B" & t) = Shp.Name
' .Range("C" & t) = Shp.Width
' .Range("D" & t) = Shp.Height
KQ(t, 1) = t
KQ(t, 2) = Shp.Name
KQ(t, 3) = Shp.Width
KQ(t, 4) = Shp.Height
Next
.Range("A1").Resize(100000, 4).ClearContents
.Range("A1").Resize(t, 4) = KQ
End With
End Sub
Sub XoaAnh()
With Sheets("Sheet1")
For Each Shp In .Shapes
If Shp.Width = 0.75 And Shp.Height = 0.75 Then Shp.Delete
Next
End With
End Sub
dạ cảm ơn bác ạBạn tham khảo code sau:
Bạn chạy sub LietKeAnh() để xem trong Sheet1 của bạn có bao nhiêu ảnh và kích thước cụ thể từng ảnh thế nào. Sau đó lựa chọn để chạy Sub XoaAnh()Mã:Option Explicit Dim Shp As Shape Sub LietKeAnh() Dim t& Dim KQ(1 To 100000, 1 To 4) With Sheets("Sheet1") For Each Shp In .Shapes t = t + 1 ' .Range("A" & t) = t ' .Range("B" & t) = Shp.Name ' .Range("C" & t) = Shp.Width ' .Range("D" & t) = Shp.Height KQ(t, 1) = t KQ(t, 2) = Shp.Name KQ(t, 3) = Shp.Width KQ(t, 4) = Shp.Height Next .Range("A1").Resize(100000, 4).ClearContents .Range("A1").Resize(t, 4) = KQ End With End Sub Sub XoaAnh() With Sheets("Sheet1") For Each Shp In .Shapes If Shp.Width = 0.75 And Shp.Height = 0.75 Then Shp.Delete Next End With End Sub
Trong Sub XoaAnh() tôi đang để là Xóa hết tất cả các shape có kích thước là Shp.Width = 0.75 And Shp.Height = 0.75 (vì trong Sheet1 này có 4256 shape thì có 3634 Shape A và 621 Shape B có kích thước như vậy , chỉ duy nhất có 1 Shape A có kích thước khác)
Bạn đã chạy thử code chưa?dạ cảm ơn bác ạ
bác cho e hỏi chút là em kiểm tra kích thước ảnh trong file excel thì ghi là Height = 0.01 và Width = 0.01
nhưng khi viết công thức macro thì lại phải để là 0.75 *0.75. Chỗ này e chưa hiểu lắm, chia theo tỉ lệ nào hay công thức nào ạ?
dạ e chạy thử code rồi ạBạn đã chạy thử code chưa?
Bạn có thấy code thống kê ra được hơn 4000 shape không và có các kích thước như đã mô ta không? Nếu máy bạn cũng ra các kích thước là 0,75*0,75 thì có thể không phải do độ phân giải màn hình mà có thể là khác đơn vị tính (ví dụ cm và insh)
Có một đơn vị của máy tính - Nó như kiểu kích cõ font chữ hay độ dãn dòng 14pt, 30pt ,..... Vậy giờ bạn cứ quy ước là 0,01 tương đương với 0,75pt chẳng hạn và ngược lại.dạ e chạy thử code rồi ạ
kết quả ra kích thước là 0.75*0.75 đúng như mô tả, code hoạt động OK đúng yêu cầu ạ
nhưng e muốn hỏi thêm cái phần xác định kích thức của các shape ấy ạ, để sau này thay đổi vận dụng phù hợp với từng tình huống gặp phải
khi e xem chi tiết kích thước của các shape trong excel thì thấy excel để kích thước là 0.01*0.01, lúc viết code để là như vậy thì không xóa được mà phải điền là 0.75*0.75 thì mới chạy được
vậy giờ dựa vào đâu để biết được kích thước để quy đổi ạ
dạ vâng e cảm ơn ạCó một đơn vị của máy tính - Nó như kiểu kích cõ font chữ hay độ dãn dòng 14pt, 30pt ,..... Vậy giờ bạn cứ quy ước là 0,01 tương đương với 0,75pt chẳng hạn và ngược lại.