首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >将用户窗体保存为PDF

将用户窗体保存为PDF

作者头像
fanjy
发布于 2024-05-22 07:20:53
发布于 2024-05-22 07:20:53
28400
代码可运行
举报
文章被收录于专栏:完美Excel完美Excel
运行总次数:0
代码可运行

标签:VBA,用户窗体

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CSP | Electron 安全
大家好,今天和大家讨论的是 CSP ,即内容安全策略。相信很多朋友在渗透测试的过程中已经了解过 CSP 了
意大利的猫
2024/04/28
9690
CSP | Electron 安全
map&area标签实现图片热点区域点击
在购物网站 Landing page 页,往往会存在商品宣传信息,为提升首页加载速度,往往会使用一张图片来包含所有要展示商品(① 减少http请求个数;② 减少页面DOM数)。如何在一张商品海报上,实现点击某商品,跳转到该商品详情页面?
奋飛
2023/03/06
1.2K0
map&area标签实现图片热点区域点击
学习 HTTP Referer
HTTP 中 Referer 字段在工作中或许并不会吸引你的注意,隐藏在 Network 的请求之下,但是却有着非常重要的作用。平常你一定会遇到一些问题需要去排查,假如这个问题在你排查完全部代码后,依然没有解决,这个时候你会怎么办?此时我们就需要将排查问题的角度转换一下,切换到 HTTP 协议上。
每周聚焦
2022/08/10
2K0
Js中fetch方法
fetch()方法定义在Window对象以及WorkerGlobalScope对象上,用于发起获取资源的请求,其返回一个Promise对象,这个Promise对象会在请求响应后被resolve,并传回Response对象。
WindRunnerMax
2020/08/27
5.9K0
主流浏览器图片反防盗链方法总结
还记得之前写的那个无聊的插件,前一段时间由于豆瓣读书增加了防盗链策略使得我们无法直接引用他们的图片,使得我这个小插件无法工作。本以为是一个很简单的问题,但是没想到这个小问题硬是让我改了五六遍才改好,可以说是非常的蠢了。总结一下自己犯傻的原因,还是由于自己懒得去深入研究,谷歌百度了问题就直接把方案拿来用了,浅尝辄止人云亦云,解决了表面的问题而没有深入的总结。当然,从另外一个方面讲,我也是初步领会到了前端程序员面对要兼容各种浏览器的需求时头有多大了。
mythsman
2022/11/14
1.4K0
【前端】:内容生成(::before、::after)
A CSS pseudo-class is a keyword added to a selector that specifies a special state of the selected element(s). For example, :hover can be used to change a button's color when the user's pointer hovers over it.
WEBJ2EE
2020/01/17
8050
【前端】:内容生成(::before、::after)
【动效】:刮刮卡
A viewport represents a polygonal (normally rectangular) area in computer graphics that is currently being viewed. In web browser terms, it refers to the part of the document you're viewing which is currently visible in its window (or the screen, if the document is being viewed in full screen mode). Content outside the viewport is not visible onscreen until scrolled into view.
WEBJ2EE
2020/11/05
1.3K0
【动效】:刮刮卡
【Web APIs】DOM 文档对象模型 ③ ( 根据类名获取 DOM 元素 - getElementsByClassName 函数 | 代码示例 )
根据类名获取 DOM 元素 , 需要 使用 HTML5 新增的方法 , Document.getElementsByClassName 函数获取 ;
韩曙亮
2024/06/21
3700
【Web APIs】DOM 文档对象模型 ③ ( 根据类名获取 DOM 元素 - getElementsByClassName 函数 | 代码示例 )
主流浏览器图片反防盗链方法总结
还记得之前写的那个无聊的插件,前一段时间由于豆瓣读书增加了防盗链策略使得我们无法直接引用他们的图片,使得我这个小插件无法工作。本以为是一个很简单的问题,但是没想到这个小问题硬是让我改了五六遍才改好,可以说是非常的蠢了。总结一下自己犯傻的原因,还是由于自己懒得去深入研究,谷歌百度了问题就直接把方案拿来用了,浅尝辄止人云亦云,解决了表面的问题而没有深入的总结。当然,从另外一个方面讲,我也是初步领会到了前端程序员面对要兼容各种浏览器的需求时头有多大了。
前端教程
2018/07/27
9920
主流浏览器图片反防盗链方法总结
跨站点访问图片资源403的解决方案
当你在A站点访问B站点的图片资源时遇到403错误,通常是因为B站点的服务器配置了防盗链机制,拒绝来自非授权站点的请求。403错误表示服务器理解请求但拒绝执行。
biaoblog.cn 个人博客
2025/05/21
2630
【前端】:async、defer、onload、DOMContentLoaded
The HTML <script> element is used to embed or reference executable code; this is typically used to embed or refer to JavaScript code.
WEBJ2EE
2019/12/31
2K0
【前端】:async、defer、onload、DOMContentLoaded
WEB安全防护相关响应头(下)
前篇“WEB安全防护相关响应头(上)”中,我们分享了 X-Frame-Options、X-Content-Type-Options、HTTP Strict Transport Security (HSTS) 等安全响应头的内容。下文中,我们则侧重介绍一些和跨站安全相关的响应头——
天存信息
2021/06/07
3.2K0
WEB安全防护相关响应头(下)
【网络安全】前端程序员务必掌握的图片防盗链
在 http 协议请求中 header 里会带个 Referer 字段。通过图片服务器检查 Referer 是否来自规定的域名(白名单),而进行防盗链。 在浏览器中输入防盗链图片地址是能直接访问的。
andyhu
2022/12/14
9640
Referrer Policy那些事
今天还是像往常一样看自己的博客。突然发现我的网站统计显示某文章访问次数有1W+,心里不由得惊喜一番。结果发现每篇文章都是1W+。访问次数统计用的是不蒜子提供的免费服务(https://busuanzi.ibruce.info/)。难道出问题了?不由得打开f12看了下,发现请求的referrer为https://huai.pub/而不是某文章的具体页面。
yumusb
2020/10/26
2.9K0
寒假提升 | Day2 HTML结构-body元素-额外知识补充
◼HTML5的文档声明比HTML 4.01、XHTML 1.0简洁非常多(了解即可)
Zkeq
2022/12/15
7690
寒假提升 | Day2 HTML结构-body元素-额外知识补充
【Web APIs】DOM 文档对象模型 ④ ( querySelector 函数 | querySelectorAll 函数 | NodeList 对象 )
在之前的博客中 , 都是通过 ID、 标签名、类名 获取 HTML 网页中的 DOM 元素 , 分别使用
韩曙亮
2024/06/24
4810
【Web APIs】DOM 文档对象模型 ④ ( querySelector 函数 | querySelectorAll 函数 | NodeList 对象 )
如何使用ChatGPT和Claude创建软件图表
在我之前的文章中,关于ChatGPT 和 Claude 可以看到你屏幕上的什么内容以及开发者如何利用它,我提到过一个浏览器扩展,它使用从完整 CNN 网站获取的图像来增强纯文本的lite.cnn.com。它运行良好,但是使用了已弃用的Manifest V2。当我让 Claude 将其更新到 V3 时,我想要绘制一些架构更改图。因此,在这篇文章中,我将回顾一下这个绘图过程。
云云众生s
2024/12/24
3270
如何使用ChatGPT和Claude创建软件图表
2.HTML根部头部主体标签元素介绍
描述: HTML html 元素表示一个 HTML 文档的根(顶级元素),所以它也被称为根元素,所有其他元素必须是此元素的后代。
全栈工程师修炼指南
2023/03/19
1.5K0
2.HTML根部头部主体标签元素介绍
java解析url的链接和参数_java根据url下载图片
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/193286.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
2.6K0
JS简易整页滚动
html, body设置 overflow 为 hidden, 让视图中只包括一个分页;设置滑动分页的长宽都是 100%; 外部容器设置 transition 过渡效果, 并设置为相对定位, 滚动是修改外部容器的 Top 值, 实现滚动效果.
治电小白菜
2020/08/25
17.7K0
JS简易整页滚动
相关推荐
CSP | Electron 安全
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档