



Bạn muốn lưu ảnh theo tên hay là lấy ảnh gốc khi up lên.Nếu lấy ảnh gốc thì đổi đuôi file excel về định dang Zip rồi tìm đến foder chứa ảnh là được.Còn nếu muốn lưu theo tên thì cần code VBA.Các bác cho em hỏi có cách nào lưu toàn bộ ảnh trong 1 file Excel ra thành hình ảnh được không, file có 100 ảnh mà cần lưu lại ảnh ??
mình không có file ảnh gốc, giờ chỉ muốn lưu lại ảnh từ file thôiBạn muốn lưu ảnh theo tên hay là lấy ảnh gốc khi up lên.Nếu lấy ảnh gốc thì đổi đuôi file excel về định dang Zip rồi tìm đến foder chứa ảnh là được.Còn nếu muốn lưu theo tên thì cần code VBA.
chỉ cần ra thành ảnh thôi ạLưu hình ảnh trong tệp Excel ra thư mục, thì bạn muốn lưu tất cả file ảnh với tên từ đâu, cấu trúc tên như thế nào. Hay không cần quan tâm đến tên, chỉ cần có ảnh là được.
Em úp file đó lên đây mới đánh giá chuẩn chỉ được. Phán bừa là nguy hiểm lắm.
em muốn chia các ảnh này vào theo các ô và lưu nó ra thành từ ảnh riêng, em không biết về VBA ạ !Em úp file đó lên đây mới đánh giá chuẩn chỉ được. Phán bừa là nguy hiểm lắm.
File em gửi không phải tập tin Excel. File không mở được.em muốn chia các ảnh này vào theo các ô và lưu nó ra thành từ ảnh riêng, em không biết về VBA ạ !
'                    _,
' ___   _   _  _ ___(_)
'/ __| / \ | \| | _ | |
'\__ \/ \ \| \\ | _ \ |
'|___/_/ \_|_|\_|___/_|
'
Private Const projectClassName = "ExportXLImages"
Private Const projectClassVersion = "1.03"
Option Compare Text
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
Private Sub ExportXLImages_test()
  On Error Resume Next
  Dim file$, dest$, sheets, fd, b As Boolean
  Set fd = Application.FileDialog(3)
  fd.AllowMultiSelect = False
  If fd.Show = -1 Then file = fd.SelectedItems(1)
  If file <> "" Then
    b = ExportXLImages(file, dest)
    ActiveWorkbook.FollowHyperlink dest, , True
    MsgBox IIf(b, "Thanh Cong!", "Ko thanh Cong!")
  End If
End Sub
Private Function ExportXLImages(fileName$, Optional destDirectories$) As Boolean
  On Error Resume Next
  If fileName = "" Then Exit Function
  Dim file$, file2$
  Dim s$, oFile As Object, b As Boolean
  Dim oSh, ms2, FSo As Object, tPath, fn$, app As Object
  Dim it, ZipFile, ext$, xl_type&, fn2$, p2$
  Set FSo = glbFSO
  Set oSh = glbShellA
  '-----------------------------------------------
  file = fileName:
  Select Case True
  Case file Like "*.xla": xl_type = 18: ext = ".xla": b = True
  Case file Like "*.xlsb": xl_type = 50: ext = ".xlsb": b = True
  Case file Like "*.xlsx": xl_type = 51: ext = ".xlsx"
  Case file Like "*.xlsm": xl_type = 52: ext = ".xlsm"
  Case file Like "*.xlam": xl_type = 55: ext = ".xlam"
  Case file Like "*.xls": xl_type = 56: ext = ".xls": b = True
  Case Else: Exit Function
  End Select
 
  If Not destDirectories Like "*[\/]" And destDirectories <> "" Then destDirectories = destDirectories & "\"
  With FSo
    Set oFile = .GetFile(file)
    If oFile Is Nothing Then Exit Function
    fn = oFile.Name
    If b Then fn = Replace(fn, ext, ".xlsx", , , 1): ext = ".xlsx"
    fn2 = Left(fn, Len(fn) - Len(ext))
    If destDirectories = "" Then destDirectories = oFile.ParentFolder.Path & "\"
    tPath = Environ$("temp") & "\VBE\ExportXLImages\"
    CreateFolder tPath & "xl\", FSo
    p2 = destDirectories & "media " & fn2 & "\"
    CreateFolder p2, FSo
    ZipFile = tPath & fn & ".zip"
    If b Then
      Set app = CreateObject("Excel.Application")
      With app
        .EnableEvents = False
        .DisplayAlerts = False
        .Calculation = -4135
        With .Workbooks.Open(fileName:=file, UpdateLinks:=False, ReadOnly:=True)
          .SaveAs ZipFile, 51: .Close False
        End With
        .Quit
      End With
      Set app = Nothing
    Else
      .copyFile file, ZipFile, True
    End If
    err.Clear: DoEvents:
    
    err.Clear:  oSh.Namespace(CVar(p2)).movehere oSh.Namespace(CVar(ZipFile & "\xl\media\")).items, 4 Or 16
    
    ExportXLImages = err = 0
    .GetFolder(tPath).Delete
E:
  End With
End Function
Private Function glbFSO() As Object
  Set glbFSO = CreateObject("Scripting.FileSystemObject")
End Function
Private Function glbShellA() As Object
  Set glbShellA = CreateObject("Shell.Application")
End Function
Private Function CreateFolder(ByVal folderPath As String, Optional ByRef FileSystem As Object) As Boolean
  Dim FolderArray, Tmp$, i As Integer, UB As Integer, tFolder$
  tFolder = folderPath
  If Right(tFolder, 1) = "\" Then tFolder = Left(tFolder, Len(tFolder) - 1)
  If tFolder Like "\\*\*" Then tFolder = Strings.Replace(tFolder, "\", "@", 1, 3)
  FolderArray = Split(tFolder, "\")
  If FileSystem Is Nothing Then Set FileSystem = glbFSO
  On Error GoTo Ends
  FolderArray(0) = Strings.Replace(FolderArray(0), "@", "\", 1, 3)
  UB = UBound(FolderArray)
  With FileSystem
    For i = 0 To UB
      Tmp = Tmp & FolderArray(i) & "\"
      If Not .FolderExists(Tmp) Then DoEvents: .CreateFolder (Tmp)
      CreateFolder = (i = UB) And Len(FolderArray(i)) > 0 And FolderArray(i) <> " "
    Next
  End With
Ends:
End Function
	Thanks anh để e thử ạBạn gán macro ExportXLImages_test dưới đây vào một nút nhấn, chép mã vào một Module mới và lưu lại với dạng xlsm.
Nhấn nút chọn tệp Excel cần thực hiện.
JavaScript:' _, ' ___ _ _ _ ___(_) '/ __| / \ | \| | _ | | '\__ \/ \ \| \\ | _ \ | '|___/_/ \_|_|\_|___/_| ' Private Const projectClassName = "ExportXLImages" Private Const projectClassVersion = "1.03" Option Compare Text Option Explicit #If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If Private Sub ExportXLImages_test() On Error Resume Next Dim file$, dest$, sheets, fd, b As Boolean Set fd = Application.FileDialog(3) fd.AllowMultiSelect = False If fd.Show = -1 Then file = fd.SelectedItems(1) If file <> "" Then b = ExportXLImages(file, dest) ActiveWorkbook.FollowHyperlink dest, , True MsgBox IIf(b, "Thanh Cong!", "Ko thanh Cong!") End If End Sub Private Function ExportXLImages(fileName$, Optional destDirectories$) As Boolean On Error Resume Next If fileName = "" Then Exit Function Dim file$, file2$ Dim s$, oFile As Object, b As Boolean Dim oSh, ms2, FSo As Object, tPath, fn$, app As Object Dim it, ZipFile, ext$, xl_type&, fn2$, p2$ Set FSo = glbFSO Set oSh = glbShellA '----------------------------------------------- file = fileName: Select Case True Case file Like "*.xla": xl_type = 18: ext = ".xla": b = True Case file Like "*.xlsb": xl_type = 50: ext = ".xlsb": b = True Case file Like "*.xlsx": xl_type = 51: ext = ".xlsx" Case file Like "*.xlsm": xl_type = 52: ext = ".xlsm" Case file Like "*.xlam": xl_type = 55: ext = ".xlam" Case file Like "*.xls": xl_type = 56: ext = ".xls": b = True Case Else: Exit Function End Select If Not destDirectories Like "*[\/]" And destDirectories <> "" Then destDirectories = destDirectories & "\" With FSo Set oFile = .GetFile(file) If oFile Is Nothing Then Exit Function fn = oFile.Name If b Then fn = Replace(fn, ext, ".xlsx", , , 1): ext = ".xlsx" fn2 = Left(fn, Len(fn) - Len(ext)) If destDirectories = "" Then destDirectories = oFile.ParentFolder.Path & "\" tPath = Environ$("temp") & "\VBE\ExportXLImages\" CreateFolder tPath & "xl\", FSo p2 = destDirectories & "media " & fn2 & "\" CreateFolder p2, FSo ZipFile = tPath & fn & ".zip" If b Then Set app = CreateObject("Excel.Application") With app .EnableEvents = False .DisplayAlerts = False .Calculation = -4135 With .Workbooks.Open(fileName:=file, UpdateLinks:=False, ReadOnly:=True) .SaveAs ZipFile, 51: .Close False End With .Quit End With Set app = Nothing Else .copyFile file, ZipFile, True End If err.Clear: DoEvents: err.Clear: oSh.Namespace(CVar(p2)).movehere oSh.Namespace(CVar(ZipFile & "\xl\media\")).items, 4 Or 16 ExportXLImages = err = 0 .GetFolder(tPath).Delete E: End With End Function Private Function glbFSO() As Object Set glbFSO = CreateObject("Scripting.FileSystemObject") End Function Private Function glbShellA() As Object Set glbShellA = CreateObject("Shell.Application") End Function Private Function CreateFolder(ByVal folderPath As String, Optional ByRef FileSystem As Object) As Boolean Dim FolderArray, Tmp$, i As Integer, UB As Integer, tFolder$ tFolder = folderPath If Right(tFolder, 1) = "\" Then tFolder = Left(tFolder, Len(tFolder) - 1) If tFolder Like "\\*\*" Then tFolder = Strings.Replace(tFolder, "\", "@", 1, 3) FolderArray = Split(tFolder, "\") If FileSystem Is Nothing Then Set FileSystem = glbFSO On Error GoTo Ends FolderArray(0) = Strings.Replace(FolderArray(0), "@", "\", 1, 3) UB = UBound(FolderArray) With FileSystem For i = 0 To UB Tmp = Tmp & FolderArray(i) & "\" If Not .FolderExists(Tmp) Then DoEvents: .CreateFolder (Tmp) CreateFolder = (i = UB) And Len(FolderArray(i)) > 0 And FolderArray(i) <> " " Next End With Ends: End Function