Hỏi đáp về hàm lấy ảnh bằng VBA

Liên hệ QC

beetune1991

Thành viên hoạt động
Tham gia
28/3/19
Bài viết
170
Được thích
5
Kính gửi anh chị,

em có một file như đính kèm.
Hiện tại thao tác em thực hiện sẽ theo thứ từ
1. chọn số sheet
2. lấy ảnh
3. lưu ảnh
4. xóa ảnh

do có quá nhiều bước nên em muốn bỏ đi bước 1 và bước 4 tích hợp trong trước 3. lưu ảnh
Khi ấn số 3 lưu ảnh thì ảnh cũng tự động xóa đi và số sheet cũng tự động nhảy lên theo thứ tự mặc định của số ban đầu nếu là số 1 sẽ là 2,3,4,5,6
Nếu mặc định ban đầu e ghi là số 5 thì tự động nhảy lên 6,7,8,9,10

Anh chị giúp em với ạ
 

File đính kèm

  • HÀM LẤY ẢNH.xlsm
    31.9 KB · Đọc: 33
Code để xóa ảnh theo ý bạn đây
Mã:
    For i = 1 To 5
        Sheets(CStr(i)).DrawingObjects.Delete
    Next i
Sub LuuAnh()
Dim ShN As String, ShD As String, PicCell As String
Dim DCell As Range

ShD = Range("B1") 'Ten Sheet luu hinh
PicCell = "AW4" 'Cell luu hinh
ShN = ActiveSheet.Name 'Ten sheet hien hanh
Set DCell = Sheets(ShD).Range(PicCell) ' ActiveSheet.Range("E2") 'Cell chua hinh anh can luu

Application.ScreenUpdating = False
ActiveSheet.Shapes.Range(Array([E2])).Select
Selection.Copy
DCell.PasteSpecial xlPasteAll
With Selection
.ShapeRange.LockAspectRatio = msoFalse
.ShapeRange.Left = DCell.MergeArea.Left + 3
.ShapeRange.Top = DCell.MergeArea.Top + 3
.ShapeRange.Width = DCell.MergeArea.Width - 6
.ShapeRange.Height = DCell.MergeArea.Height - 6
End With
Application.ScreenUpdating = True
On Error Resume Next
ActiveSheet.Shapes(Range("E2").Value).Delete
On Error GoTo 0
Range("B1").Value = Range("B1").Value + 1
MsgBox "Xong!"
End Sub
Cop vào phần nào vậy ạ.
Bài đã được tự động gộp:

Code để xóa ảnh theo ý bạn đây
Mã:
    For i = 1 To 5
        Sheets(CStr(i)).DrawingObjects.Delete
    Next i
Code để xóa ảnh theo ý bạn đây
Mã:
    For i = 1 To 5
        Sheets(CStr(i)).DrawingObjects.Delete
    Next i
em cám ơn ạ
 
Upvote 0
Chạy được rồi anh ạ. nhưng anh cho em hỏi nó hiện lên như thế này có vấn đề gì không ạ
Do code của bạn dùng Pictures.Insert nên khi lưu tập tin -> đóng tập tin -> xóa ảnh trên đĩa -> mở lại tập tin thì sẽ có như trong ảnh đính kèm. Tức không được xóa ảnh trên đĩa, không được chuyển sang chỗ khác. Lý do là ảnh không được nhập vào hẳn mà chỉ được kết nối thôi.

Nếu bạn muốn nhập ảnh vĩnh viễn vào sheet rồi xóa ảnh trên đĩa thì có thể tham khảo:
1. Thêm vào Module1 code
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ó nhiều tùy biến, hãy đọc chú thích để biết cách dùng sub InsertPicture. Với InsertPicture bạn có thể nhập ảnh vĩnh viễn (sau đó xóa ảnh nguồn) - LinkToFile = False, cũng có thể chỉ kết nối (không được xóa ảnh nguồn) - LinkToFile = True.

2. Sửa sub LayAnh thành
Mã:
Sub LayAnh()
Dim filename As String
    filename = Browse_PICFILE
    If Len(filename) Then InsertPicture filename, range("E2")
End Sub

3. Trong sub LuuAnh thay
ActiveSheet.Shapes.Range(Array([E2])).Select
bằng
ActiveSheet.Shapes.range("$E$2").Select

Bây giờ em sử dụng nút xoá ảnh để xoá các ảnh trong sheet 1 trở đi thì thay như thế nào ạ.
ví dụ em muốn xoá hàng loạt ảnh của vùng AW4 từ sheet 1->sheet 5
Anh hướng dẫn em với ạ. em mong muốn code chỉ định rõ số sheet có ảnh mình cần xoá hàng loạt ạ./
1. Thêm code
Mã:
Sub DeleteSelectedPic()
Dim k As Long, sh As Worksheet, shp As Shape, Arr()
    ReDim Arr(1 To ActiveWindow.SelectedSheets.Count)
    For k = 1 To UBound(Arr)
        Arr(k) = ActiveWindow.SelectedSheets(k).Name
    Next k
    ThisWorkbook.Worksheets("Nhap anh").Select
    For k = 1 To UBound(Arr)
        Set sh = ThisWorkbook.Worksheets(Arr(k))
        For Each shp In sh.Shapes
            If shp.TopLeftCell.Address = "$AW$4" Then
                shp.Delete
                Exit For
            End If
        Next shp
    Next k
End Sub

2. Thao tác: Trên thanh "Sheets tab" chọn các sheet cần xóa ảnh -> chạy sub DeleteSelectedPic. Vd. bạn có sheet 1 đến 200 nhưng bạn chỉ muốn xóa ảnh trong 1, 2, 3, 12 thì bạn chỉ chọn 4 sheet đó rồi chạy sub DeleteSelectedPic (có thể gán macro DeleteSelectedPic cho nút nào đấy)
 
Upvote 0
Do code của bạn dùng Pictures.Insert nên khi lưu tập tin -> đóng tập tin -> xóa ảnh trên đĩa -> mở lại tập tin thì sẽ có như trong ảnh đính kèm. Tức không được xóa ảnh trên đĩa, không được chuyển sang chỗ khác. Lý do là ảnh không được nhập vào hẳn mà chỉ được kết nối thôi.

Nếu bạn muốn nhập ảnh vĩnh viễn vào sheet rồi xóa ảnh trên đĩa thì có thể tham khảo:
1. Thêm vào Module1 code
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ó nhiều tùy biến, hãy đọc chú thích để biết cách dùng sub InsertPicture. Với InsertPicture bạn có thể nhập ảnh vĩnh viễn (sau đó xóa ảnh nguồn) - LinkToFile = False, cũng có thể chỉ kết nối (không được xóa ảnh nguồn) - LinkToFile = True.

2. Sửa sub LayAnh thành
Mã:
Sub LayAnh()
Dim filename As String
    filename = Browse_PICFILE
    If Len(filename) Then InsertPicture filename, range("E2")
End Sub

3. Trong sub LuuAnh thay
ActiveSheet.Shapes.Range(Array([E2])).Select
bằng
ActiveSheet.Shapes.range("$E$2").Select


1. Thêm code
Mã:
Sub DeleteSelectedPic()
Dim k As Long, sh As Worksheet, shp As Shape, Arr()
    ReDim Arr(1 To ActiveWindow.SelectedSheets.Count)
    For k = 1 To UBound(Arr)
        Arr(k) = ActiveWindow.SelectedSheets(k).Name
    Next k
    ThisWorkbook.Worksheets("Nhap anh").Select
    For k = 1 To UBound(Arr)
        Set sh = ThisWorkbook.Worksheets(Arr(k))
        For Each shp In sh.Shapes
            If shp.TopLeftCell.Address = "$AW$4" Then
                shp.Delete
                Exit For
            End If
        Next shp
    Next k
End Sub

2. Thao tác: Trên thanh "Sheets tab" chọn các sheet cần xóa ảnh -> chạy sub DeleteSelectedPic. Vd. bạn có sheet 1 đến 200 nhưng bạn chỉ muốn xóa ảnh trong 1, 2, 3, 12 thì bạn chỉ chọn 4 sheet đó rồi chạy sub DeleteSelectedPic (có thể gán macro DeleteSelectedPic cho nút nào đấy)
e cám ơn anh ạ.
thế mà anh không làm trong file luôn giúp em :))
Bài đã được tự động gộp:

Code để xóa ảnh theo ý bạn đây
Mã:
    For i = 1 To 5
        Sheets(CStr(i)).DrawingObjects.Delete
    Next i
cái này nó xoá hết anh ạ
làm sao để phân vùng xoá thành AW4 ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Bác bên trên hướng dẫn bạn dùng DeleteSelectedPic() rồi mà???
Thêm nữa, ở #12, mình đã hỏi bạn là muốn xóa 1 hay tất cả các ảnh thì bạn không trả lời???
code ấy vẫn xoá hết anh ạ.
không chừa lại cái gì.
có thể thêm đoạn phân vùng AW4 được không ạ.
 
Upvote 0
Mã:
If shp.TopLeftCell.Address = "$AW$4" Then
    shp.Delete
    Exit For
End If
chắc chắn đoạn code này xóa ở ô AW4 ở những sheet ĐÃ CHỌN rồi mà?
bạn có thực hiện đúng hướng dẫn không?
2. Thao tác: Trên thanh "Sheets tab" chọn các sheet cần xóa ảnh -> chạy sub DeleteSelectedPic. Vd. bạn có sheet 1 đến 200 nhưng bạn chỉ muốn xóa ảnh trong 1, 2, 3, 12 thì bạn chỉ chọn 4 sheet đó rồi chạy sub DeleteSelectedPic (có thể gán macro DeleteSelectedPic cho nút nào đấy)
 
Upvote 0
Nói bậy.

Thứ tự thao tác làm đúng như hướng dẫn trong bài #22.

Code trong Module1
file này em làm nút xoá còn không xoá được cái gì ấy ạ. ảnh vẫn còn bên trong.
Bài đã được tự động gộp:

Mã:
If shp.TopLeftCell.Address = "$AW$4" Then
    shp.Delete
    Exit For
End If
chắc chắn đoạn code này xóa ở ô AW4 ở những sheet ĐÃ CHỌN rồi mà?
bạn có thực hiện đúng hướng dẫn không?
em làm theo bác thì nó vẫn xoá hết các ô chỗ khác,
em làm theo file bác batman1 thì ấn không xoá được ảnh ạ.
 
Upvote 0
file này em làm nút xoá còn không xoá được cái gì ấy ạ. ảnh vẫn còn bên trong.
Có 2 lựa chọn:
1. Không dùng nút nào cả.
Thao tác: thẻ Developer -> nhấn Macros -> trong cửa sổ Macro chọn DeleteSelectedPic -> nhấn nút Options -> trong cửa sổ Macro Options nhấn phím d -> nhấn OK để đóng cửa sổ Macro Options -> đóng cửa sổ Macro.

anh1.jpg

Khi cần xóa ảnh thì chọn các sheet -> nhấn tổ hợp phím Ctrl + d.

2. Dùng nút trên vd. sheet "Nhap anh".
Hãy cho biết từ đâu code biết là phải xóa ảnh trên những sheet nào. Vd. có sheet 1-31 nhưng chỉ muốn xóa trong 2-3, 7, 9, 14-17. Từ đâu code biết là phải xóa trong 2-3, 7, 9, 14-17? Chúng được liệt kê trong ô nào đó của sheet "Nhap anh"? Nếu thế thì ở dạng nào? Dạng 2-3, 7, 9, 14-17 hay dạng 2, 3, 7, 9, 14, 15, 16, 17?
 
Upvote 0
Có 2 lựa chọn:
1. Không dùng nút nào cả.
Thao tác: thẻ Developer -> nhấn Macros -> trong cửa sổ Macro chọn DeleteSelectedPic -> nhấn nút Options -> trong cửa sổ Macro Options nhấn phím d -> nhấn OK để đóng cửa sổ Macro Options -> đóng cửa sổ Macro.

View attachment 255541

Khi cần xóa ảnh thì chọn các sheet -> nhấn tổ hợp phím Ctrl + d.

2. Dùng nút trên vd. sheet "Nhap anh".
Hãy cho biết từ đâu code biết là phải xóa ảnh trên những sheet nào. Vd. có sheet 1-31 nhưng chỉ muốn xóa trong 2-3, 7, 9, 14-17. Từ đâu code biết là phải xóa trong 2-3, 7, 9, 14-17? Chúng được liệt kê trong ô nào đó của sheet "Nhap anh"? Nếu thế thì ở dạng nào? Dạng 2-3, 7, 9, 14-17 hay dạng 2, 3, 7, 9, 14, 15, 16, 17?
Em làm cách 1 được rồi ạ. em cảm ơn ạ.
 
Upvote 0
Có 2 lựa chọn:
1. Không dùng nút nào cả.
Thao tác: thẻ Developer -> nhấn Macros -> trong cửa sổ Macro chọn DeleteSelectedPic -> nhấn nút Options -> trong cửa sổ Macro Options nhấn phím d -> nhấn OK để đóng cửa sổ Macro Options -> đóng cửa sổ Macro.

View attachment 255541

Khi cần xóa ảnh thì chọn các sheet -> nhấn tổ hợp phím Ctrl + d.

2. Dùng nút trên vd. sheet "Nhap anh".
Hãy cho biết từ đâu code biết là phải xóa ảnh trên những sheet nào. Vd. có sheet 1-31 nhưng chỉ muốn xóa trong 2-3, 7, 9, 14-17. Từ đâu code biết là phải xóa trong 2-3, 7, 9, 14-17? Chúng được liệt kê trong ô nào đó của sheet "Nhap anh"? Nếu thế thì ở dạng nào? Dạng 2-3, 7, 9, 14-17 hay dạng 2, 3, 7, 9, 14, 15, 16, 17?
anh ơi vì sao ảnh của em nó không có vào giữa ô anh nhỉ và không full hình nữa
 
Upvote 0
anh ơi vì sao ảnh của em nó không có vào giữa ô anh nhỉ và không full hình nữa
Bạn trích bài mà tôi trả lời về XÓA ẢNH, mà bạn lại thắc mắc về CHÈN ẢNH? Bạn không mô tả kỹ cách bạn làm, không đính kèm tập tin thì gọi người khác nhé. Đừng gọi tôi.
 
Upvote 0
Do code của bạn dùng Pictures.Insert nên khi lưu tập tin -> đóng tập tin -> xóa ảnh trên đĩa -> mở lại tập tin thì sẽ có như trong ảnh đính kèm. Tức không được xóa ảnh trên đĩa, không được chuyển sang chỗ khác. Lý do là ảnh không được nhập vào hẳn mà chỉ được kết nối thôi.

Nếu bạn muốn nhập ảnh vĩnh viễn vào sheet rồi xóa ảnh trên đĩa thì có thể tham khảo:
1. Thêm vào Module1 code
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ó nhiều tùy biến, hãy đọc chú thích để biết cách dùng sub InsertPicture. Với InsertPicture bạn có thể nhập ảnh vĩnh viễn (sau đó xóa ảnh nguồn) - LinkToFile = False, cũng có thể chỉ kết nối (không được xóa ảnh nguồn) - LinkToFile = True.

2. Sửa sub LayAnh thành
Mã:
Sub LayAnh()
Dim filename As String
    filename = Browse_PICFILE
    If Len(filename) Then InsertPicture filename, range("E2")
End Sub

3. Trong sub LuuAnh thay
ActiveSheet.Shapes.Range(Array([E2])).Select
bằng
ActiveSheet.Shapes.range("$E$2").Select


1. Thêm code
Mã:
Sub DeleteSelectedPic()
Dim k As Long, sh As Worksheet, shp As Shape, Arr()
    ReDim Arr(1 To ActiveWindow.SelectedSheets.Count)
    For k = 1 To UBound(Arr)
        Arr(k) = ActiveWindow.SelectedSheets(k).Name
    Next k
    ThisWorkbook.Worksheets("Nhap anh").Select
    For k = 1 To UBound(Arr)
        Set sh = ThisWorkbook.Worksheets(Arr(k))
        For Each shp In sh.Shapes
            If shp.TopLeftCell.Address = "$AW$4" Then
                shp.Delete
                Exit For
            End If
        Next shp
    Next k
End Sub

2. Thao tác: Trên thanh "Sheets tab" chọn các sheet cần xóa ảnh -> chạy sub DeleteSelectedPic. Vd. bạn có sheet 1 đến 200 nhưng bạn chỉ muốn xóa ảnh trong 1, 2, 3, 12 thì bạn chỉ chọn 4 sheet đó rồi chạy sub DeleteSelectedPic (có thể gán macro DeleteSelectedPic cho nút nào đấy)

Anh batman1 cho em xin phép hỏi được không ạ
Em có một file đính như dưới

Trong File Excel em sẽ ghi sẵn tên Lot ( được bôi vàng ở ảnh dưới )

Và trong Folder chứa ảnh cũng được đặt tên giống tên Lot vậy.

Vậy lúc chèn ảnh có thể chèn theo được số Lot như dưới không ạ.

Em cảm ơn anh.
1623425689899.png
1623425712311.png
 

File đính kèm

  • test1.xlsm
    463.4 KB · Đọc: 8
Upvote 0
Trong File Excel em sẽ ghi sẵn tên Lot ( được bôi vàng ở ảnh dưới )

Và trong Folder chứa ảnh cũng được đặt tên giống tên Lot vậy.

Vậy lúc chèn ảnh có thể chèn theo được số Lot như dưới không ạ.
Tôi ghi hướng dẫn trong Sheet1.
 

File đính kèm

  • test1.xlsm
    34.5 KB · Đọc: 22
Upvote 0
Tôi ghi hướng dẫn trong Sheet1.
Cho em hỏi thêm 1 xíu được không ạ.
Nếu em tăng số lượng tên Lot nhất định ( hiện tại trong file là 8 tên Lot ( cũng có thể tăng lên nữa ))

Và em có sửa lại code như dưới nhưng lúc chạy vẫn chỉ lấy được 2 tên Lot đầu tiên ( CKKCP0194 và CKL4K0201 )

Anh thể hướng dẫn em code dưới đang bị sai ở chỗ nào được không ạ.

Em cảm ơn anh.


Sub Nhap_sheet1()

Dim a, b, b3, b6, e3, e6, lrow, lrow2 As Long

With Sheet1
lrow = .Range("A" & Rows.Count).End(3).Row 'dong cuoi cot A
lrow2 = .Range("D" & Rows.Count).End(3).Row 'dong cuoi cot D
End With

b3 = Sheet1.Cells(3, 2).Value
b6 = Sheet1.Cells(6, 2).Value
e3 = Sheet1.Cells(3, 6).Value
e3 = Sheet1.Cells(6, 6).Value

b3 = b3 + 4
b6 = b3 + 3
e3 = e3 + 4
e6 = e3 + 3

For a = 4 To lrow Step 4 'lay tiep anh co ten Lot cua dong thu 8 cot A
For b = 4 To lrow2 Step 4 'lay tiep anh co ten Lot cua dong thu 8 cot D

InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(a, 1).Value & ".jpg", Sheet1.Range("b3:b6")
InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(b, 1).Value & ".jpg", Sheet1.Range("e3:e6")

Next
Next

End Sub


1623513496375.png
 

File đính kèm

  • Test.xlsm
    83.7 KB · Đọc: 10
Upvote 0
InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(a, 1).Value & ".jpg", Sheet1.Range("b3:b6")
InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(b, 1).Value & ".jpg", Sheet1.Range("e3:e6")
Mỗi lần gọi InsertPicture là nhập chỉ 1 ảnh vào 1 nơi. Nếu cần nhập 10, 1000 ảnh thì không ai liệt kê 10, 1000 dòng gọi InsertPicture. Lúc này phải dùng vòng lặp FOR. Làm kiểu liệt kê từng ảnh một mà có 1000 ảnh thì chết.

Code của bạn luôn nhập vào 2 vùng là Sheet1.Range("b3:b6") và Sheet1.Range("e3:e6"). Đó là 2 vùng bất di bất dịch rồi.

Muốn dùng được FOR thì cấu trúc dữ liệu phải thích hợp.

Có 2 cái bạn phải nhập khi gọi InsertPicture. Đó là <đường dẫn tới ảnh> và <vùng cần nhập ảnh>.

1. Cách xác định <đường dẫn tới ảnh>
Nhìn qua thì trong trường hợp cụ thể này <đường dẫn tới ảnh> nằm ở cột A và D. Tất nhiên trong cột A hay D thì <đường dẫn tới ảnh> chỉ nằm ở 1 số ô thôi. Chỉ số dòng của các ô có <đường dẫn tới ảnh> có theo qui luật nào không? Tinh ý một chút thì thấy ở cột A và D thì các ô có chỉ số dòng là 4*k, với k = 1, 2, 3,4, đều là những ô chứa <đường dẫn tới ảnh>. Vậy thì dùng được FOR k = 1 To 4 để lấy được các <đường dẫn tới ảnh>

2. Cách xác định <vùng cần nhập ảnh>
Nếu biết <ô ĐẦU TIÊN> (vd. là B3) của <vùng cần nhập ảnh> (vd. B3:B6) thì <ô ĐẦU TIÊN>.MergeArea (chính là B3:B6) chính là <vùng cần nhập ảnh>
Vậy vấn đề còn lại là xác định <ô ĐẦU TIÊN> (vd. là B3) của <vùng cần nhập ảnh> (vd. B3:B6). Tinh ý thì thấy B3 có được bằng cách dịch A4 lên trên 1 dòng và sang phải 1 cột. Tức Range("A4").Offset(-1, 1) = B3 = <ô ĐẦU TIÊN>

Cuối cùng có <vùng cần nhập ảnh> = <ô chứa đường dẫn tới ảnh ở cột A hoặc D>.Offset(-1, 1).MergeArea
------------
Những cái tôi viết ở trên nó chẳng liên quan gì tới nhập ảnh. Những cái đó là lập trình VBA, là cách viết code, là kinh nghiệm ...

Tóm lại là:

1. Code cho trường hợp cụ thể này, chỉ có 4 ảnh trong mỗi cột.
Mã:
Sub Nhap_sheet1()
Dim k As Long, c As Long
    For c = 1 To 4 Step 3   ' c = 1 -> cot A, c = 4 -> cot D
        For k = 1 To 4
            If Len(Sheet1.Cells(4 * k, c).Value) Then
'                duong dan khong rong -> nhap anh
                InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(4 * k, c).Value & ".jpg", Sheet1.Cells(4 * k, c).Offset(-1, 1).MergeArea
            End If
        Next k
    Next c
End Sub

2. Code cho trường hợp TỔNG QUÁT, khi số ảnh hiện hành tùy ý, nhưng đường dẫn cũng ở các dòng có chỉ số là bội của 4, tức 4*k, và ở cột A và D
Mã:
Sub Nhap_sheet1()
Dim lastRow As Long, k As Long, c As Long
    For c = 1 To 4 Step 3   ' c = 1 -> cot A, c = 4 -> cot D
        lastRow = Sheet1.Cells(Rows.Count, c).End(xlUp).Row
        For k = 1 To lastRow \ 4
            If Len(Sheet1.Cells(4 * k, c).Value) Then
'                duong dan khong rong -> nhap anh
                InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(4 * k, c).Value & ".jpg", Sheet1.Cells(4 * k, c).Offset(-1, 1).MergeArea
            End If
        Next k
    Next c
End Sub
 
Upvote 0
Mỗi lần gọi InsertPicture là nhập chỉ 1 ảnh vào 1 nơi. Nếu cần nhập 10, 1000 ảnh thì không ai liệt kê 10, 1000 dòng gọi InsertPicture. Lúc này phải dùng vòng lặp FOR. Làm kiểu liệt kê từng ảnh một mà có 1000 ảnh thì chết.

Code của bạn luôn nhập vào 2 vùng là Sheet1.Range("b3:b6") và Sheet1.Range("e3:e6"). Đó là 2 vùng bất di bất dịch rồi.

Muốn dùng được FOR thì cấu trúc dữ liệu phải thích hợp.

Có 2 cái bạn phải nhập khi gọi InsertPicture. Đó là <đường dẫn tới ảnh> và <vùng cần nhập ảnh>.

1. Cách xác định <đường dẫn tới ảnh>
Nhìn qua thì trong trường hợp cụ thể này <đường dẫn tới ảnh> nằm ở cột A và D. Tất nhiên trong cột A hay D thì <đường dẫn tới ảnh> chỉ nằm ở 1 số ô thôi. Chỉ số dòng của các ô có <đường dẫn tới ảnh> có theo qui luật nào không? Tinh ý một chút thì thấy ở cột A và D thì các ô có chỉ số dòng là 4*k, với k = 1, 2, 3,4, đều là những ô chứa <đường dẫn tới ảnh>. Vậy thì dùng được FOR k = 1 To 4 để lấy được các <đường dẫn tới ảnh>

2. Cách xác định <vùng cần nhập ảnh>
Nếu biết <ô ĐẦU TIÊN> (vd. là B3) của <vùng cần nhập ảnh> (vd. B3:B6) thì <ô ĐẦU TIÊN>.MergeArea (chính là B3:B6) chính là <vùng cần nhập ảnh>
Vậy vấn đề còn lại là xác định <ô ĐẦU TIÊN> (vd. là B3) của <vùng cần nhập ảnh> (vd. B3:B6). Tinh ý thì thấy B3 có được bằng cách dịch A4 lên trên 1 dòng và sang phải 1 cột. Tức Range("A4").Offset(-1, 1) = B3 = <ô ĐẦU TIÊN>

Cuối cùng có <vùng cần nhập ảnh> = <ô chứa đường dẫn tới ảnh ở cột A hoặc D>.Offset(-1, 1).MergeArea
------------
Những cái tôi viết ở trên nó chẳng liên quan gì tới nhập ảnh. Những cái đó là lập trình VBA, là cách viết code, là kinh nghiệm ...

Tóm lại là:

1. Code cho trường hợp cụ thể này, chỉ có 4 ảnh trong mỗi cột.
Mã:
Sub Nhap_sheet1()
Dim k As Long, c As Long
    For c = 1 To 4 Step 3   ' c = 1 -> cot A, c = 4 -> cot D
        For k = 1 To 4
            If Len(Sheet1.Cells(4 * k, c).Value) Then
'                duong dan khong rong -> nhap anh
                InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(4 * k, c).Value & ".jpg", Sheet1.Cells(4 * k, c).Offset(-1, 1).MergeArea
            End If
        Next k
    Next c
End Sub

2. Code cho trường hợp TỔNG QUÁT, khi số ảnh hiện hành tùy ý, nhưng đường dẫn cũng ở các dòng có chỉ số là bội của 4, tức 4*k, và ở cột A và D
Mã:
Sub Nhap_sheet1()
Dim lastRow As Long, k As Long, c As Long
    For c = 1 To 4 Step 3   ' c = 1 -> cot A, c = 4 -> cot D
        lastRow = Sheet1.Cells(Rows.Count, c).End(xlUp).Row
        For k = 1 To lastRow \ 4
            If Len(Sheet1.Cells(4 * k, c).Value) Then
'                duong dan khong rong -> nhap anh
                InsertPicture ThisWorkbook.Path & "\" & Sheet1.Cells(4 * k, c).Value & ".jpg", Sheet1.Cells(4 * k, c).Offset(-1, 1).MergeArea
            End If
        Next k
    Next c
End Sub

Em cảm ơn rất nhiều vì mỗi lần hướng dẫn của anh quá chi tiết ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom