Public xlPaperA2%Sub 填满页面排版()xlPaperA2 = 66 'A2编号66Dim ws As Worksheet: Set ws = ActiveSheetDim FirstCol As Long, LastCol As Long, LastRow As LongDim TargetRange As RangeDim UsablePageWidth As DoubleDim CurrentWidth As DoubleDim StartFontSize As Double, BestFontSize As DoubleDim TestSize As DoubleDim StepSize As Double: StepSize = 0.05 ' 精细步长Dim MaxFontSize As Double: MaxFontSize = 48Dim OriginalView As Long' ===== 1. 获取数据范围 =====On Error Resume NextWith wsLastCol = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).ColumnFirstCol = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlNext).ColumnLastRow = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).RowEnd WithOn Error GoTo 0If LastCol = 0 Then Exit SubIf FirstCol > LastCol Then Exit SubIf LastRow = 0 Then LastRow = 1Set TargetRange = ws.Range(ws.Cells(1, FirstCol), ws.Cells(LastRow, LastCol))' ===== 2. 保存并切换到普通视图(防死机)=====On Error Resume NextOriginalView = ws.Parent.Windows(1).Viewws.Parent.Windows(1).View = xlNormalViewOn Error GoTo 0Application.ScreenUpdating = FalseApplication.Calculation = xlCalculationManual' ===== 3. 安全获取当前字体大小 =====Dim Temp As VariantTemp = TargetRange.Font.SizeIf IsNull(Temp) Or Temp <= 0 Or Temp > 100 ThenStartFontSize = 10ElseStartFontSize = TempEnd If' ===== 4. 计算页面可用宽度(磅)=====UsablePageWidth = GetPageWidthInPoints(ws) - ws.PageSetup.LeftMargin - ws.PageSetup.RightMarginIf UsablePageWidth <= 0 Then UsablePageWidth = 400' ===== 5. 核心:递增逼近最大填充字体 =====BestFontSize = StartFontSize  ' 至少用原始字体TestSize = StartFontSizeDo While TestSize <= MaxFontSize' 设置字体TargetRange.Font.Size = TestSize' 重新 AutoFit 列宽TargetRange.EntireColumn.AutoFit' 获取当前总宽度CurrentWidth = TargetRange.Width' 检查是否超出页面If CurrentWidth > UsablePageWidth Then' 超了,退出(上一个 TestSize 是合法的最大值)Exit DoElse' 未超,记录为当前最佳BestFontSize = TestSizeEnd IfTestSize = TestSize + StepSizeLoop' ===== 6. 应用最佳字体 =====TargetRange.Font.Size = BestFontSizeTargetRange.EntireColumn.AutoFitCurrentWidth = TargetRange.Width  ' 最终宽度' ===== 7. 恢复视图 =====On Error Resume Nextws.Parent.Windows(1).View = OriginalViewApplication.Calculation = xlCalculationAutomaticApplication.ScreenUpdating = TrueOn Error GoTo 0' ===== 8. 显示结果 & 列宽补偿 =====Dim FillRatio As DoubleFillRatio = CurrentWidth / UsablePageWidth' ? 如果填充率太低,则用二分法拉宽If CurrentWidth < UsablePageWidth * 0.99 ThenDim TargetTotalWidth As DoubleTargetTotalWidth = UsablePageWidth * 0.995  ' 目标填满 99.5%' 调用二分法调整AdjustToTargetWidth_Binary TargetRange, TargetTotalWidth' 更新 CurrentWidth 用于后续判断CurrentWidth = TargetRange.WidthEnd IfMsgBox "排版完成!" & vbCrLf & _"最终字体:" & Format(BestFontSize, "0.1") & " pt" & vbCrLf & _"可用宽度:" & Format(UsablePageWidth, "0.1") & " 磅" & vbCrLf & _"实际宽度:" & Format(CurrentWidth, "0.1") & " 磅" & vbCrLf & _"填充比例:" & Format(FillRatio * 100, "0.1") & "%" & vbCrLf & _IIf(FillRatio >= 0.98, "? 几乎填满", "?? 接近填满"), vbInformationEnd Sub
' ===== 二分法调整整体列宽(容忍 0.5cm 误差,稳定退出)=====
' 输入:
'   TargetRange: 要调整的区域
'   TargetWidth: 目标总宽度(磅)
' 输出:列宽被等比放大,总宽度逼近目标
Sub AdjustToTargetWidth_Binary(TargetRange As Range, TargetWidth As Double)Dim Low As Double, High As Double, Mid As DoubleDim i As LongDim OriginalWidths() As DoubleDim CurrentTotalWidth As DoubleDim Tolerance As DoubleDim Iteration As LongDim ws As Worksheet: Set ws = TargetRange.Worksheet' ===== 参数设置 =====Tolerance = 14  ' ±0.5 cm ≈ 14 磅(28.35 pt/cm)Low = 0.8       ' 最小缩小到 80%High = 3        ' 最大放大到 300%Iteration = 0' ===== 保存原始列宽 =====ReDim OriginalWidths(1 To TargetRange.Columns.Count)On Error GoTo RestoreAndExitApplication.EnableEvents = FalseApplication.Calculation = xlCalculationManualApplication.ScreenUpdating = FalseFor i = 1 To TargetRange.Columns.CountOriginalWidths(i) = TargetRange.Columns(i).ColumnWidthNext i' ===== 二分法逼近 =====Do While Iteration < 50  ' 防止死循环Mid = (Low + High) / 2Iteration = Iteration + 1' 应用缩放For i = 1 To TargetRange.Columns.CountTargetRange.Columns(i).ColumnWidth = OriginalWidths(i) * MidNext i' 获取当前总宽度On Error Resume NextCurrentTotalWidth = TargetRange.WidthOn Error GoTo 0' 安全检查If CurrentTotalWidth <= 0 ThenCurrentTotalWidth = 1End If' ===== 判断是否满足精度 =====If Abs(CurrentTotalWidth - TargetWidth) <= Tolerance ThenExit DoEnd If' 调整区间If CurrentTotalWidth < TargetWidth ThenLow = MidElseHigh = MidEnd If' 区间足够小,退出If (High - Low) < 0.0001 ThenExit DoEnd IfLoop' ===== 输出结果 =====Debug.Print "? 二分法完成:"Debug.Print "  迭代次数: " & IterationDebug.Print "  最终内容宽度: " & Format(CurrentTotalWidth, "0.0") & " 磅 ≈ " & Format(CurrentTotalWidth / 28.35, "0.1") & " cm"Debug.Print "  目标宽度: " & Format(TargetWidth, "0.0") & " 磅 ≈ " & Format(TargetWidth / 28.35, "0.1") & " cm"Debug.Print "  剩余误差: " & Format(Abs(CurrentTotalWidth - TargetWidth), "0.0") & " 磅 ≈ " & Format(Abs(CurrentTotalWidth - TargetWidth) / 28.35, "0.2") & " cm"RestoreAndExit:' 恢复设置Application.EnableEvents = TrueApplication.Calculation = xlCalculationAutomaticApplication.ScreenUpdating = TrueErr.Clear
End Sub
' ===== 工具函数:获取页面实际打印宽度(磅) =====
' 输入:Worksheet
' 输出:横向时返回长边,纵向时返回短边(已考虑方向)
' 特点:只认 PaperSize 数值,不依赖 xlPaperXXX 枚举
Function GetPageWidthInPoints(ws As Worksheet) As DoubleDim PaperSize As LongDim WidthCm As Double  ' 纸张宽度(纵向时的宽度)Dim HeightCm As Double ' 纸张高度(纵向时的高度)PaperSize = ws.PageSetup.PaperSize' ===== 统一用厘米定义纸张尺寸(纵向时) =====Select Case PaperSizeCase 66, 18   ' A2WidthCm = 42#HeightCm = 59.4Case 11        ' A3WidthCm = 29.7HeightCm = 42#Case 9         ' A4WidthCm = 21#HeightCm = 29.7Case 13        ' A5WidthCm = 14.8HeightCm = 21#Case 14        ' A6WidthCm = 10.5HeightCm = 14.8Case 12        ' B4WidthCm = 25#HeightCm = 35.3Case 15        ' B5WidthCm = 17.6HeightCm = 25#Case 1         ' LetterWidthCm = 21.59  ' 8.5 inHeightCm = 27.94 ' 11 inCase 4         ' LegalWidthCm = 21.59HeightCm = 35.56 ' 14 inCase 50        ' B5 (JIS)WidthCm = 18.2HeightCm = 25.7Case 51        ' A4 NarrowWidthCm = 21#HeightCm = 28.4Case Else' 默认:A4WidthCm = 21#HeightCm = 29.7End Select' ===== 根据方向决定返回哪个维度 =====On Error Resume NextIf ws.PageSetup.Orientation = xlLandscape Then' 横向:页面宽度 = 纸张高度(长边)GetPageWidthInPoints = Application.CentimetersToPoints(HeightCm)Else' 纵向:页面宽度 = 纸张宽度(短边)GetPageWidthInPoints = Application.CentimetersToPoints(WidthCm)End If' ===== 安全兜底 =====If Err.Number <> 0 Or GetPageWidthInPoints <= 0 ThenGetPageWidthInPoints = Application.CentimetersToPoints(21) ' A4 宽Err.ClearEnd IfOn Error GoTo 0
End Function'' ===== 辅助函数:根据 PaperSize 数值返回纸张高度(英寸)=====
'' 说明:直接使用数字,不依赖 xlPaperXXX 枚举,避免未定义问题
'Function GetPageHeightInInches(PaperSize As Long) As Double
'    Select Case PaperSize
'        Case 66, 18  ' A2: 42.0 cm × 59.4 cm → 高度 59.4 cm = 23.39 英寸
'            GetPageHeightInInches = 23.39   ' 59.4 cm
'        Case 11       ' A3: 29.7 × 42.0 cm → 高度 42.0 cm
'            GetPageHeightInInches = 16.54   ' 42.0 cm
'        Case 9        ' A4: 21.0 × 29.7 cm → 高度 29.7 cm
'            GetPageHeightInInches = 11.69   ' 29.7 cm
'        Case 13       ' A5: 14.8 × 21.0 cm
'            GetPageHeightInInches = 8.27    ' 21.0 cm
'        Case 14       ' A6: 10.5 × 14.8 cm
'            GetPageHeightInInches = 5.83    ' 14.8 cm
'        Case 12       ' B4: 25.0 × 35.3 cm
'            GetPageHeightInInches = 13.89   ' 35.3 cm
'        Case 15       ' B5: 17.6 × 25.0 cm
'            GetPageHeightInInches = 9.84    ' 25.0 cm
'        Case 1        ' Letter: 8.5 × 11 in
'            GetPageHeightInInches = 11
'        Case 4        ' Legal: 8.5 × 14 in
'            GetPageHeightInInches = 14
'        Case 50       ' B5 (JIS): 常见打印机选项
'            GetPageHeightInInches = 9.84
'        Case 51       ' A4 小(窄): 21.0 × 28.4 cm
'            GetPageHeightInInches = 11.18
'        Case Else
'            ' 默认返回 A4 高度
'            GetPageHeightInInches = 11.69
'    End Select
'End Function
Sub 检查页面参数()Dim ws As Worksheet: Set ws = ActiveSheetDim FirstCol As Long, LastCol As Long, LastRow As LongDim TargetRange As RangeDim UsablePageWidth As DoubleDim ContentWidth As DoubleDim LeftMarginPt As Double, RightMarginPt As DoubleDim PagePrintableStartX As Double  ' 可打印区域起始X(距左边)Dim ContentEndX As Double         ' 内容结束位置(距左边)Dim PagePrintableEndX As Double   ' 可打印区域结束位置(距左边)Dim RightGap As Double            ' 右侧剩余空白(磅)Dim RightGapCm As Double          ' 右侧剩余空白(厘米)Dim TEM_S As StringWith ws.PageSetupTEM_S = TEM_S & vbCrLf & "=== 页面设置参数 ==="TEM_S = TEM_S & vbCrLf & "纸张大小代码:" & .PaperSizeTEM_S = TEM_S & vbCrLf & "方向:" & IIf(.Orientation = xlPortrait, "纵向", "横向")LeftMarginPt = .LeftMarginRightMarginPt = .RightMarginTEM_S = TEM_S & vbCrLf & "左页边距:" & LeftMarginPt & "磅 ≈" & Format(LeftMarginPt / 28.35, "0.0") & "cm"TEM_S = TEM_S & vbCrLf & "右页边距:" & RightMarginPt & "磅 ≈" & Format(RightMarginPt / 28.35, "0.0") & "cm"End With' ===== 计算页面总宽度(打印区域宽度)=====Dim PageTotalPrintableWidth As DoublePageTotalPrintableWidth = GetPageWidthInPoints(ws) - LeftMarginPt - RightMarginPtTEM_S = TEM_S & vbCrLf & "页面可用宽度(计算):" & PageTotalPrintableWidth & "磅"TEM_S = TEM_S & vbCrLf & "页面可用宽度(厘米):" & Format(PageTotalPrintableWidth / 28.35, "0.1") & "cm"' ===== 获取内容范围 =====On Error Resume NextWith wsLastCol = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).ColumnFirstCol = .Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlNext).ColumnLastRow = .Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).RowEnd WithOn Error GoTo 0If LastCol = 0 Or FirstCol > LastCol Or LastRow = 0 ThenTEM_S = TEM_S & "?? 未找到数据"Exit SubEnd IfSet TargetRange = ws.Range(ws.Cells(1, FirstCol), ws.Cells(LastRow, LastCol))ContentWidth = TargetRange.WidthTEM_S = TEM_S & vbCrLf & "内容实际宽度:" & ContentWidth & "磅 ≈" & Format(ContentWidth / 28.35, "0.1") & "cm"' ===== 计算右侧剩余边距 =====' 可打印区域起始 X 坐标(从页面左边开始)PagePrintableStartX = LeftMarginPt' 可打印区域结束 X 坐标PagePrintableEndX = LeftMarginPt + PageTotalPrintableWidth' 内容结束位置(从页面左边开始)ContentEndX = LeftMarginPt + ContentWidth' 右侧剩余空白RightGap = PagePrintableEndX - ContentEndXRightGapCm = RightGap / 28.35TEM_S = TEM_S & vbCrLf & "右侧剩余边距:" & RightGap & "磅 ≈" & Format(RightGapCm, "0.1") & "cm"If RightGapCm > 0 ThenTEM_S = TEM_S & vbCrLf & "? 右边还能再挤进" & Format(RightGapCm, "0.1") & "cm"ElseTEM_S = TEM_S & "? 内容已超出可用区域!" & Format(RightGapCm, "0.1") & "cm"End IfT_CHECK_PAGES.Text = TEM_S
End Sub' ===== 按钮事件 =====
Private Sub CMD_AUTO_COL_WIDTH_Click()填满页面排版
End SubPrivate Sub cmd_checkpage_Click()检查页面参数
End Sub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94658.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94658.shtml
英文地址,请注明出处:http://en.pswp.cn/web/94658.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统性能优化全攻略:从CPU到网络的全方位监控与诊断

引言 在Linux系统运维和开发过程中&#xff0c;系统性能优化是一个永恒的话题。无论是服务器负载过高&#xff0c;还是应用程序响应缓慢&#xff0c;准确快速地定位问题根源至关重要。本文将全面介绍Linux系统中常用的性能诊断工具和方法&#xff0c;帮助您从CPU、内存、磁盘I/…

uniapp+vue+uCharts开发常见问题汇总

项目结构&#xff1a;uniapp vue2 uni-ui uCharts 1、chunk-vendors.js:2765[Vue warn]: Invalid prop: custom validator check failed for prop "navigationBarTextStyle". 检索发现原因&#xff1a; 在 pages.json 文件中&#xff0c;navigationBarTextStyle 属…

【甲烷数据集】EPA-美国2012-2020年网格化甲烷清单

目录 数据概述 数据特征 数据版本与年份 排放源类型(示例) 时间变化处理 数据下载 参考 根据美国环保署(EPA)官网 《U.S. Gridded Methane Emissions》页面 的内容,以下是对 美国网格化甲烷清单(Gridded Methane GHGI) 的详细介绍。 数据概述 EPA-U.S. Gridded Methan…

【温室气体数据集】NOAA CCGG 飞机观测温室气体

目录 数据集概述 采样方式 测量气体 数据用途 观测站点 NOAA CCGG 飞机观测站点信息 项目特色 数据访问 参考 NOAA 全球监测实验室(Global Monitoring Laboratory, GML)提供的 Carbon Cycle Greenhouse Gases Aircraft Program 数据集是一个关于温室气体在大气中垂直分布的观…

FreeRTOS,互斥量 (Mutex)

1. 信号量 (Semaphore) 通俗理解&#xff1a;信号量就像停车场的空位计数器。当有车进入时&#xff0c;计数器减1&#xff1b;当有车离开时&#xff0c;计数器加1。如果计数器为0&#xff0c;新车必须等待直到有空位。 #include "FreeRTOS.h" #include "semphr.…

SQL查询-设置局部变量(PostgreSQL、MySQL)

&#x1f60b;博主在工作中编写复杂SQL语句时&#xff0c;经常需要替换查询值进行测试。所以需要用到局部变量设置&#xff0c;可以减轻测试时的压力。 目录使用场景1.常规写法2.局部变量写法&#xff08;1&#xff09;PostgreSQL示例注意事项&#xff08;2&#xff09;MySQL示…

2962 统计最大元素出现至少k次的子数组

2962 统计最大元素出现至少k次的子数组 文章目录2962 统计最大元素出现至少k次的子数组1 题目2 解答1 题目 给你一个整数数组 nums 和一个 正整数 k 。 请你统计有多少满足 「 nums 中的 最大 元素」至少出现 k 次的子数组&#xff0c;并返回满足这一条件的子数组的数目。 子…

【Java SE】基于多态与接口实现图书管理系统:从设计到编码全解析

文章目录一、系统整体设计&#xff1a;分层与职责划分系统模块结构二、核心模块详解&#xff1a;从数据到功能1. Book包&#xff1a;数据封装1.1 Book类&#xff1a;图书实体1.2 BookList类&#xff1a;书架管理2. User包&#xff1a;多态的核心体现2.1 User抽象类&#xff1a;…

ESP32-WSL开发环境搭建过程中遇到的问题及解决方案

文章目录 应用场景: 问题1描述: 原因分析: 解决方案: 先检查 ESP-IDF 工具链是否安装完整 设定工具路径变量一切正常: 执行重新运行安装脚本后又报错: 原因分析 解决方法: 第一步:安装python3.10-venv包(核心修复) 第二步:重新执行 ESP-IDF 安装脚本,重建虚拟环境 安…

SwiftUI 三阵诀:杨过绝情谷悟 “视图布阵” 之道

&#x1f4dc; 引子&#xff1a;绝情谷困境&#xff0c;三阵待辨 绝情谷外&#xff0c;瘴气弥漫。杨过手握玄铁剑&#xff08;喻 Xcode&#xff09;&#xff0c;凝视谷中涌动的万千 “毒物”&#xff08;喻待渲染的视图元素&#xff09;&#xff0c;眉头紧锁。 此前他试过硬闯…

以楼宇自控系统为核心,整合多维度技术,打造智能建筑解决方案

在数字化浪潮席卷建筑行业的当下&#xff0c;“智能建筑” 已从概念走向大规模落地&#xff0c;其核心诉求不再是单一设备的智能化&#xff0c;而是建筑整体的 “感知、分析、决策、执行” 闭环能力。传统智能建筑常陷入 “技术堆砌” 困境 —— 暖通、安防、照明等系统各自为政…

阿里云服务器 篇一(加更):设置二级域名通配符证书

文章目录 样例网站 系列文章 域名注册 为单个域名添加SSL证书 申请 通配符域名 + 根域名 证书 已申请通配符证书,补申请一个根域名证书 更改Nginx配置,统一使用通配符域名证书 替换所有https服务的证书为通配符证书 统一处理http请求跳转https服务 对所有未定义二级域名的统一…

汽车电子工厂静电腕带监控仪双回路设计降低设备采购成本

在汽车电子制造中&#xff0c;静电放电&#xff08;ESD&#xff09;风险贯穿从PCB焊接、元件装配到成品测试的全流程。在新能源汽车零部件产线中需处理大量精密电子组件&#xff0c;静电隐患导致的典型问题包括&#xff1a;元件损伤&#xff1a;ESD瞬时电压可能击穿芯片或导致焊…

Linux操作系统—进程

进程&#xff08;process&#xff09;&#xff1a;&#xff08;1&#xff09;进程的定义&#xff1a;正在进行的程序&#xff0c;会去分配内存资源(mem)&#xff0c;cpu的调度 &#xff0c;(flash ssd:固态硬盘)目的&#xff1a;为了实现并发&#xff0c;同一时刻执行多任务&am…

win11的WSL安装CentOS9-Stream,并且安装docker,使用第三方工具连接linux

前面写了一个安装centos8的文章&#xff0c;但是发现centos8有很多限制&#xff0c;很多东西不能用&#xff0c;于是果断放弃 一、打开windows的虚拟机功能 自行百度 二、下载CentOS9-Stream系统 1、下载 地址&#xff1a;https://github.com/mishamosher/CentOS-WSL 请下…

TypeScript实战:轻松实现数字序号转中文大写数字

在前端开发中&#xff0c;我们经常会遇到【将数字序号转换为中文大写数字】的需求——比如表单步骤条显示“第一步”而非“第1步”、文章章节标题用“三”代替 “3”等。今天就带大家拆解这个常见需求的实现思路&#xff0c;用TypeScript写出简洁又安全的转换函数。 一、需求明…

【C++游记】栈vs队列vs优先级队列

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

2025年网络安全技能竞赛“观安杯”管理运维赛 WEB/PWN WP

blindpwn寻找漏洞点上来先看到让输入的有长度和数据&#xff0c;其他先不管&#xff0c;测试一下长度&#xff0c;发现最大为16然后blind pwn一般的话有栈溢出和格式化字符串两种&#xff0c;这里先测试一下格式化字符串然后就会发现啥也没有&#xff0c;但是会发现一些事情有一…

Linux 打包及压缩基础知识总结

一、gz 包1、常用命令命令格式&#xff1a;压缩&#xff1a;gzip [option] filename解压&#xff1a;gunzip [option] filename 常用选项&#xff1a;-c &#xff1a; 将压缩数据输出到标准输出中&#xff0c;并保留原文件-d &#xff1a; 解压缩,相当于gunzip-f &#xff1a; …

FOC算法第三节 等幅值变换与克拉克逆变换

FOC的过程其实就是输入需求的电机力矩&#xff0c;把需求的电机力矩转化为三相线电压输出&#xff0c;并且让电机物理输出你所需求的力矩的过程&#xff0c;这也被称为电机控制三环中的力矩环&#xff0c;所有后面的位置闭环和速度闭环都得基于这个力矩环&#xff0c;而这个力矩…