Excel VBA中行高设置值与读取值不一致的问题咨询
Excel VBA行高读取与显示不一致问题解答
问题1:实际行高是30还是30.75?
右键查看的30是Excel为简化显示做的取整近似值,VBA读取的Height属性是Excel内部存储的精确实际高度(单位:点)。打印时会按照这个精确值计算,所以实际生效的行高是30.75。
差异产生的核心原因:
- Excel行高需适配单元格内字体的行间距,当设置的行高小于字体所需最小高度时,Excel会自动将行高调整到能容纳内容的最小值。
- 系统DPI缩放设置(如125%、150%)会导致显示单位与内部计算单位的换算偏差,进一步放大数值差异。
问题2:如何让VBA读取到和设置时一致的数值?
方法1:直接存储原始设置值(最可靠)
用模块级变量保存你设置的行高值,后续读取时直接调用这些变量,绕开Excel自动调整的影响:
' 模块级变量,保存初始设置的行高 Private m_CompanyRowHeight As Double Private m_ReportRowHeight As Double Private m_DateRowHeight As Double Public Sub setTitleAreaCellsToDefaultHeight() m_CompanyRowHeight = 30 m_ReportRowHeight = 21 m_DateRowHeight = 31 vCompanyNameCell.EntireRow.RowHeight = m_CompanyRowHeight vReportNameCell.EntireRow.RowHeight = m_ReportRowHeight vReportDateCell.EntireRow.RowHeight = m_DateRowHeight Stop End Sub Public Sub getCurrentHeights() ' 直接读取保存的原始值 vHCurrCompanyCell = m_CompanyRowHeight vHCurrReportCell = m_ReportRowHeight vHCurrDateCell = m_DateRowHeight Stop End Sub
方法2:关闭自动调整行高
如果必须从Excel对象读取,先关闭该行的自动调整行高功能,确保设置的行高不会被Excel自动修改:
Public Sub setTitleAreaCellsToDefaultHeight() ' 先关闭自动调整,避免Excel修改行高 vCompanyNameCell.EntireRow.AutoFit = False vReportNameCell.EntireRow.AutoFit = False vReportDateCell.EntireRow.AutoFit = False vCompanyNameCell.EntireRow.RowHeight = 30 vReportNameCell.EntireRow.RowHeight = 21 vReportDateCell.EntireRow.RowHeight = 31 Stop End Sub Public Sub getCurrentHeights() ' 此时读取RowHeight会和设置值一致(前提是行高足够容纳字体) vHCurrCompanyCell = vCompanyNameCell.EntireRow.RowHeight vHCurrReportCell = vReportNameCell.EntireRow.RowHeight vHCurrDateCell = vReportDateCell.EntireRow.RowHeight Stop End Sub
注意:如果设置的行高小于字体所需的最小高度,即使关闭自动调整,Excel仍会强制调整行高以显示内容,此时方法1更稳妥。
内容的提问来源于stack exchange,提问作者Geoff L
相关产品推荐
相关产品推荐

