Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >将用户窗体保存为PDF

将用户窗体保存为PDF

作者头像
fanjy
发布于 2024-05-22 07:20:53
发布于 2024-05-22 07:20:53
25400
代码可运行
举报
文章被收录于专栏:完美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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VB实现的《QQ美女找茬游戏》实例分享
本文实例讲述了VB实现的《QQ美女找茬游戏》。分享给大家供大家参考。具体如下:比较无聊哈,原理很简单,用VB速度比较慢,但是实现很容易。Option ExplicitPrivate Type sPOINT  x As Long  y As LongEnd TypePrivate Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function GetPixel Lib "gdi32" (ByVal
大师级码师
2022/11/06
6210
VBA实战技巧23:动态显示绘图区坐标值
如下图1所示,当鼠标在图表的绘图区移动时,Excel左下角的状态栏会显示鼠标所在位置的坐标值;当鼠标移动的同时按下Shift键时,图表中的椭圆形会跟随移动,且Excel左下角的状态栏会显示其所在位置的坐标值。
fanjy
2021/06/01
1.4K0
VBA实战技巧23:动态显示绘图区坐标值
创建可调大小的用户窗体——使用Windows API
在使用VBA创建用户窗体时,通常会将其设置为特定的大小。然而,通过一些编码技巧,可以为其实现类似的调整大小效果。
fanjy
2023/08/29
7700
创建可调大小的用户窗体——使用Windows API
类模块应用示例:捕捉鼠标单击的单元格位置
如下图1所示,单击工作簿中任意工作表单元格时,会弹出一个消息框,显示鼠标单击的单元格地址。
fanjy
2023/09/21
4660
类模块应用示例:捕捉鼠标单击的单元格位置
VBA创建弹出菜单
fanjy
2023/09/25
6860
VBA创建弹出菜单
VBA代码:处理剪贴板
在VBE中,插入一个类模块,并将其重命名为“ClipBoard”,输入下面的代码:
fanjy
2023/10/04
1K0
VBA代码:处理剪贴板
Excel用户窗体中添加最小化按钮及窗体最小化的代码实现
文章背景:用户窗体是Excel中的UserForm对象。在使用UserForm时,曾经目前遇到过两个问题。
Exploring
2022/08/10
2.8K0
Excel用户窗体中添加最小化按钮及窗体最小化的代码实现
把表单放大看看,好玩的不只一点点
加菲猫的VFP
2023/08/21
1650
把表单放大看看,好玩的不只一点点
Excel实战技巧58: 使用VBA创建进度条
2.设置其ShowModal属性为False,这样在该用户窗体处于打开状态时仍能继续运行程序。
fanjy
2019/11/07
6.8K0
Excel实战技巧58: 使用VBA创建进度条
VBA实用小程序51: 将图表导出为图片(API版)
在前面的VBA实用小程序15和16中,我们给出了两个将Excel图表导出为图片的VBA程序,详见下面的链接:
fanjy
2019/07/19
1.9K0
表单水平文字滚动,效果还有阴影
加菲猫的VFP
2023/08/21
4410
表单水平文字滚动,效果还有阴影
VBA实战技巧06: 复制文本到剪贴板
注意,上述代码运行前需要添加对“Microsoft Forms 2.0 Object Library”库的引用,方法是在VBE中单击菜单“工具——引用”,在“引用”对话框中找到该库并选取。如果在“引用”对话框中找不到这个库,可以在VBE中单击菜单“插入——用户窗体”命令,先插入一个空白用户窗体,然后再运行上述代码。
fanjy
2020/04/22
7.6K0
VBA: 禁止单元格移动,防止单元格公式引用失效(2)
文章背景: 在Excel中,公式引用无效单元格时将显示 #REF! 错误。当公式所引用的单元格被删除或被粘贴覆盖时最常发生这种情况。
Exploring
2022/09/20
1.4K0
VBA使用API_03:创建窗体
使用Excel VBA要创建窗体非常的简单,直接插入一个用户窗体就可以了,VBA已经封装好了窗体,而且具有很多功能以及控件。
xyj
2020/07/28
2.1K0
VBA使用API_03:创建窗体
vfp创建垂直标签控件,效果还是不错的
加菲猫的VFP
2023/08/21
3280
vfp创建垂直标签控件,效果还是不错的
VBA: 自动定时关闭消息框
文章背景: 在VBA中创建弹窗对话框,可以使用MsgBox函数;但是该函数得到的消息框,必须手动关闭它。下面介绍一个未公开的Windows API函数,可以使用该函数得到一个自动定时关闭的消息框。
Exploring
2022/12/18
3.2K0
VB实现半透明或者部分透明窗体
        Windows2000已经出了n年多了,就先介绍一下Windows2000特有的API吧!! AnimateWindow是一个窗口打开和关闭时产生动画效果的新函数,因为是一个新的函数, 所以在 API Viewer中是找不到的,必需自己定义:    Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha
用户1075292
2018/01/23
1.7K0
VB实现半透明或者部分透明窗体
C#窗口句柄
在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。实际上许多 Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。
全栈程序员站长
2022/09/14
6730
vb.net_一个半成品
Imports System.Text Imports System.Runtime.InteropServices Public Class Form1 '引用win32api进行枚举窗体句柄操作 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr Pri
landv
2018/05/24
8700
显示文件和文件夹的关联图标和说明
例如,若要获取 DBF 文件的这些关联,第一步是找到“HKEY_CLASSES_ROOT.dbf”注册表项。此项的默认值为“Visual.FoxPro.Table”。这意味着“HKEY_CLASSES_ROOT\Visual.FoxPro.Table”键必须位于下一个。
加菲猫的VFP
2023/08/21
2790
显示文件和文件夹的关联图标和说明
相关推荐
VB实现的《QQ美女找茬游戏》实例分享
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验