前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >将用户窗体保存为PDF

将用户窗体保存为PDF

作者头像
fanjy
发布2024-05-22 15:20:53
1380
发布2024-05-22 15:20:53
举报
文章被收录于专栏:完美Excel完美Excel

标签:VBA,用户窗体

在网上看到的一段程序,能够将用户窗体保存为PDF文件,特辑录于此,供查阅或方便有兴趣的朋友参考。

首先,插入一个标准模块,输入下面的代码:

代码语言:javascript
复制
Private Type RECT
 Left As Long
 Top As Long
 Right As Long
 Bottom As Long
End Type

Private Declare PtrSafe Function _
 GetActiveWindow& Lib "user32" ()
Private Declare PtrSafe Sub GetWindowRect Lib _
 "user32" (ByVal hwnd&, lpRect As RECT)
Private Declare PtrSafe Function _
 GetDesktopWindow& Lib "user32" ()
'剪贴板操作
Private Declare PtrSafe Function _
 OpenClipboard& Lib "user32" (ByVal hwnd&)
Private Declare PtrSafe Function _
 CloseClipboard& Lib "user32" ()
Private Declare PtrSafe Function SetClipboardData& _
 Lib "user32" (ByVal wFormat&, ByVal hMem&)
Private Declare PtrSafe Function _
 EmptyClipboard& Lib "user32" ()
'创建Bitmap
Private Declare PtrSafe Function GetDC& _
 Lib "user32" (ByVal hwnd&)
Private Declare PtrSafe Function _
 CreateCompatibleDC& Lib "gdi32" (ByVal hDC&)
Private Declare PtrSafe Function CreateCompatibleBitmap& _
 Lib "gdi32" (ByVal hDC&, ByVal nWidth& _
 , ByVal nHeight&)
Private Declare PtrSafe Function SelectObject& _
 Lib "gdi32" (ByVal hDC&, ByVal hObject&)
Private Declare PtrSafe Function BitBlt& Lib "gdi32" _
 (ByVal hDestDC&, ByVal X&, ByVal Y& _
 , ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC& _
 , ByVal XSrc&, ByVal YSrc&, ByVal dwRop&)
Private Declare PtrSafe Function ReleaseDC& _
 Lib "user32" (ByVal hwnd&, ByVal hDC&)
Private Declare PtrSafe Function DeleteDC& _
 Lib "gdi32" (ByVal hDC&)
'创建图片
Private Type PicBmp
 Size As Long
 Type As Long
 hBmp As Long
 hPal As Long
 Reserved As Long
End Type
Private Type Guid
 Data1 As Long
 Data2 As Integer
 Data3 As Integer
 Data4(0 To 7) As Byte
End Type
Private Declare PtrSafe Function OleCreatePictureIndirect _
 Lib "olepro32.dll" (PicDesc As PicBmp _
 , RefIID As Guid, ByVal fPictureOwnsHandle As Long _
 , IPic As IPicture) As Long
 
' 对象(UserForm, FullScreen, etc.):
Sub ScreenObjectCopy()
 Dim hPtr&, r As RECT
 Call GetWindowRect(GetActiveWindow, r)
 hPtr = CreateBitmap(r.Right - r.Left _
 , r.Bottom - r.Top, r.Left, r.Top)
 If hPtr = 0 Then Exit Sub
 '在硬盘中保存图像
 'SavePicture CreatePicture(hPtr), "C:\Documents and Settings\Administrator\My Documents.bmp"
 SavePicture CreatePicture(hPtr), "C:\temp\My Documents.bmp"
 ActiveSheet.Paste
End Sub

Sub ScreenPartCopy()
 Dim hPtr&  ' 像素坐标(Width, Height, Left, Top)
 hPtr = CreateBitmap(186, 60, 102, 432)
 If hPtr = 0 Then Exit Sub
 ' 在硬盘中保存图像
 SavePicture CreatePicture(hPtr),  "C:\Documents and Settings\Administrator\My Documents.bmp"
 ActiveSheet.Paste
End Sub

Private Function CreateBitmap&(ByVal W& _
 , ByVal H&, Optional L& = 0, Optional T& = 0)
 Dim hwnd&, hBitmap&, hDC&, hDCMem&
 hwnd = GetDesktopWindow()
 '获取桌面设备内容和分配内存
 hDC = GetDC(hwnd)
 hDCMem = CreateCompatibleDC(hDC)
 hBitmap = CreateCompatibleBitmap(hDC, W, H)
 If hBitmap Then
   Call SelectObject(hDCMem, hBitmap)
   ' 基于对象坐标复制桌面图片到内存位置
   Call BitBlt(hDCMem, 0, 0, W, H, hDC, L, T, &HCC0020)
   ' 设置剪贴板并复制图片
   Call OpenClipboard(hwnd)
   Call EmptyClipboard
   CreateBitmap = SetClipboardData(2, hBitmap)
   Call CloseClipboard
 End If
 ' 清理句柄
 Call DeleteDC(hDCMem)
 Call ReleaseDC(hwnd, hDC)
End Function

Private Function CreatePicture(ByVal hBmp&) As IPicture
 Dim Ret&, Pic As PicBmp, IPic As IPicture, IID As Guid
 With IID
   .Data1 = &H20400
   .Data4(0) = &HC0
   .Data4(7) = &H46
 End With
 With Pic
   .Size = Len(Pic)
   .Type = 1
   .hBmp = hBmp
 End With
 Ret = OleCreatePictureIndirect(Pic, IID, 1, IPic)
 Set CreatePicture = IPic
End Function

' 对象(UserForm, FullScreen, etc.):
Sub SOC(pasteRange As Range, Optional bmpPath As String = "")
 Dim hPtr&, r As RECT, ac As Range
 Set ac = ActiveCell
 Call GetWindowRect(GetActiveWindow, r)
 hPtr = CreateBitmap(r.Right - r.Left _
   , r.Bottom - r.Top, r.Left, r.Top)
 If hPtr = 0 Then Exit Sub
 ' 在硬盘上保存图像
 If bmpPath <> "" Then SavePicture CreatePicture(hPtr), bmpPath
 With pasteRange
      .Parent.Activate
      .Select
      .Parent.Paste
 End With
 ac.Parent.Activate
 ac.Select
End Sub

Sub ScreenObjectCopyToClipboard()
 Dim hPtr&, r As RECT
 Call GetWindowRect(GetActiveWindow, r)
 hPtr = CreateBitmap(r.Right - r.Left _
   , r.Bottom - r.Top, r.Left, r.Top)
 If hPtr = 0 Then Exit Sub
End Sub

在要保存为PDF的用户窗体中,放置一个按钮,并编写该按钮的执行代码:

代码语言:javascript
复制
Private Sub CommandButton2_Click()
 Dim pdf As String, s As Shape
 
 With Sheet1
   '清除工作表Sheet1中的内容
   .UsedRange.Clear
   For Each s In .Shapes
     s.Delete
   Next s
 
   Me.Repaint
   '复制并粘贴用户窗体到工作表Sheet1单元格A1.
   SOC .[A1]
   .Activate
   .[A1].Select
 
   '创建PDF文件
   pdf = ThisWorkbook.Path & "\CopyToPicture.pdf"
   .ExportAsFixedFormat xlTypePDF, pdf
 End With
 
 Unload Me
End Sub

这样,当单击该按钮时,此用户窗体会作为图像显示在工作表Sheet1的单元格A1位置,并在该工作簿文件夹中保存为名为CopyToPicture的PDF文件。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档