ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用VBA转换磅、像素和缇?

如何用VBA转换磅、像素和缇?

作者:绿色风 分类: 时间:2022-08-17 浏览:150
楼主
amulee
Q:如何转换磅、像素和缇?
A:在VBA编程中经常牵涉以下几个长度单位:磅、像素和缇。在有些编程中需要将这几个长度单位进行转换。
一般来说,这几个长度单位之间的转换是固定的(其中1磅=20缇是永远固定的),在如图的设置中。

 
1像素=15缇
1像素=0.75磅

但是,当上图设置变化时,该转换就会发生变化。可以借助API的GetDeviceCaps函数完成转换。参考代码如下:
  1. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  2. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nindex As Long) As Long
  3. Private PixX2TwipX As Double '像素转换成缇
  4. Private PixX2TwipY As Double
  5. Private PixX2PointX As Double '像素转换成磅
  6. Private PixX2PointY As Double
  7. Private Const LOGPIXELSX = 88   '单位逻辑英寸像素
  8. Private Const LOGPIXELSY = 90
  9. Sub Test()
  10.     PixX2TwipX = Application.InchesToPoints(1) * 20 / GetDeviceCaps(GetDC(0), LOGPIXELSX)
  11.     PixX2TwipY = Application.InchesToPoints(1) * 20 / GetDeviceCaps(GetDC(0), LOGPIXELSY)
  12.     PixX2PointX = Application.InchesToPoints(1) / GetDeviceCaps(GetDC(0), LOGPIXELSX)
  13.     PixX2PointY = Application.InchesToPoints(1) / GetDeviceCaps(GetDC(0), LOGPIXELSY)
  14.     MsgBox "水平方向:1像素等于" & PixX2TwipX & "缇" & vbCrLf & "垂直方向:1像素等于" & PixX2TwipY & "缇"
  15.     MsgBox "水平方向:1像素等于" & PixX2PointX & "磅" & vbCrLf & "垂直方向:1像素等于" & PixX2PointY & "磅"
  16. End Sub
利用该转换结果,可以方便地进行像素和VBA默认的长度单位磅之间的转换。如在Image控件中导入一张图,可以轻松将该控件调整为图片大小。如本例中导入一张208*92的图
参考代码如下:
  1. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  2. Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nindex As Long) As Long
  3. Private PixX2TwipX As Double '像素转换成缇
  4. Private PixX2TwipY As Double
  5. Private PixX2PointX As Double '像素转换成磅
  6. Private PixX2PointY As Double
  7. Private Const LOGPIXELSX = 88   '单位逻辑英寸像素
  8. Private Const LOGPIXELSY = 90
  9. Private Sub UserForm_Initialize()
  10.     PixX2PointX = Application.InchesToPoints(1) / GetDeviceCaps(GetDC(0), LOGPIXELSX)
  11.     PixX2PointY = Application.InchesToPoints(1) / GetDeviceCaps(GetDC(0), LOGPIXELSY)
  12.     With Image1
  13.         .Picture = LoadPicture(ThisWorkbook.Path & "\ET.jpg")
  14.         .Height = 92 * PixX2PointY
  15.         .Width = 208 * PixX2PointX
  16.     End With
  17. End Sub
利用像素和缇的转换还可以兼容一些控件的使用。


长度单位.rar
2楼
xyf2210
学习API
3楼
chenlifeng
感觉很神奇,但是有两个问题没有看得太懂:
1、如何得知当前屏幕的宽度?
2、这个宽度的单位,与我要设置的EXCEL工作表格中的列的宽度,单位之间是个什么关系?
   我知道有些函数可得出某屏幕的宽度是1024*768等,但我发现每台电脑的屏幕明显不一样宽度,答案还是1024*768,故感觉这不是真正想要的数字。
   即我如果知道了电脑屏幕的宽度,即与列宽的单位换算法,我想要如何处理某一列或几列的宽度,就不太难了。
4楼
amulee
你思考问题太狭窄了。

你所要做的只是统一几个不同对象的单位而已。比如磅,你所要做的是将所有东西转换成磅,仅此而已。

屏幕得到的数字是像素,你转换成磅。
列宽中如果用ColumnWidth属性,表示能够容纳多少个字,而Width的单位则是磅。
5楼
chenlifeng
谢谢不厌其烦及指教批评,受益ing!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap