|
|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
- Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
- Private Declare Function CloseClipboard Lib "user32" () As Long
- Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
- Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
- Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
- Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
- Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
- Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
- Sub saveRange2PNG(SourceRange As Range, sPNGFile As String)
- Dim lFormat As Long
- Dim nSize As Long
- Dim hClip As Long
- Dim pData As Long
- Dim bytBuffer() As Byte
- Dim iFreeFile As Integer
-
- '复制单元格区域为图片
- SourceRange.CopyPicture xlScreen, xlPicture
- '粘贴到当前工作表中
- ActiveSheet.Paste
- '将单元格区域转变的图片再次剪切,剪贴板中就会出现一个格式为"PNG"的内容,读出其所含字节保存到硬盘中即为一个PNG文件
- Selection.Cut
-
- '以下是读取剪贴板中指定格式对应字节内容并保存到硬盘的常规代码,详见https://club.excelhome.net/thread-1057488-1-1.html
- If OpenClipboard(0) <> 0 Then
- lFormat = RegisterClipboardFormat("PNG")
- If IsClipboardFormatAvailable(lFormat) Then
- hClip = GetClipboardData(lFormat)
- pData = GlobalLock(hClip)
- nSize = GlobalSize(hClip)
- ReDim bytBuffer(nSize - 1)
- CopyMemory VarPtr(bytBuffer(0)), pData, nSize
- GlobalUnlock hClip
-
- '如果目标文件已存在,长度为m字节,要保存的png文件长度为n字节,并且m>n,如果直接保存将只替换前n个字节,后面m-n个字节仍然是旧文件内容
- '需要在检查到文件已存在时用kill语句,或者用下面三句代码先将目标文件变为一个0字节的空文件
- iFreeFile = FreeFile
- Open sPNGFile For Output As iFreeFile
- Close iFreeFile
-
- iFreeFile = FreeFile
- Open sPNGFile For Binary As iFreeFile
- Put iFreeFile, , bytBuffer
- Close iFreeFile
- End If
- CloseClipboard
- End If
- End Sub
- Sub test()
- Dim sFile As String
- sFile = Application.GetSaveAsFilename("C:", "PNG图片(*.png),*.png", , "单元格区域另存为PNG", "保存图片")
- 'saveRange2PNG函数内部并不检查目标文件是否已存在,在使用前应进行检查并提醒用户,以免误覆盖
- If Len(Dir(sFile, vbSystem + vbHidden)) > 0 Then
- If MsgBox("文件" & sFile & "已存在,是否覆盖?", vbYesNo) = vbNo Then Exit Sub
- End If
- saveRange2PNG Sheet1.Range("a1:E4"), sFile
- End Sub
复制代码 |
评分
-
1
查看全部评分
-
|