如何将Excel列宽设置为一定数量的像素?

我在工作表上有以下数据集:

SheetName|ColumnIndex|Pixels ---------+-----------+------ abc |1 |50 abc |2 |150 def |1 |125 

对于每一张纸,我想设置列的宽度适当的像素数,使用像这样的东西:

 Sub setColumn (sheetName As string, columnIndex As long, pixels As long) width=getWidthInCharacters(pixels) ThisWorkbook.Sheets(sheetName).Cells(1, columnIndex).EntireColumn.ColumnWidth = width End Sub 

我一直无法弄清楚如何编写getWidthInCharacters()函数。 如何将像素转换为字符,或者直接将.ColumnWidth设置为像素?

我很抱歉告诉你,但以我的经验,你不能。 列的宽度是以点为单位进行衡量的,尽pipe您可以 – 理论上 – 将点转换为像素,但Excel在分配时不会非常精确地进行监听。 从显示器到显示器,它们也有所不同。 基本上,分数是英寸的分数,像素是屏幕上的点。 Windows有一个概念(正确或错误的)有多less像素有一个特定的输出设备点。

可以写一个调整列宽的函数,但通常这个方法必须是

  • 找出excel愿意增加列宽的最小上下文值(比如说存储原始值,然后赋值.ColumnWidth = dblOriginal + 0.01 。检查列宽是否已经改变 – 如果已经改变了,那么你只做了一个像素调整如果没有,则需要比0.01更大的数字。
  • find所需的最终列宽(以像素为单位),然后重复此第一步,直到多次增加列宽。
  • 检查结果,看看是否看起来不错。

警告词:这是可怕的,缓慢的,不是很好的代码,如果他们已经在2010年以后在Excel版本中固定列宽,那么你可能是幸运的,只能使用像素到点的函数,转换并分配。 根据我的经验,在同一台机器上,不同的屏幕上没有给出一致的结果。 真的很奇怪,

.ColumnWidth不依赖主题字体select,但像素宽度: https : //support.microsoft.com/en-us/kb/214123

 'pixel width of column A Debug.Print (Columns("A").Width / 72) * ThisWorkbook.WebOptions.PixelsPerInch 

经过一番阅读和思考,我的解决scheme:

 Sub setColumnWidth(rColumnWidth As Range, iPixelWidth As Integer) ' set column width by pixels ' check status ScreenUpdating Dim bScreenUpdatingState As Boolean bScreenUpdatingState = Application.ScreenUpdating ' set status ScreenUpdating If bScreenUpdatingState = True Then Application.ScreenUpdating = False Dim iPointsPerInch As Byte iPointsPerInch = 72 Dim iPixelsPerInch As Byte iPixelsPerInch = ThisWorkbook.WebOptions.PixelsPerInch ' check 2 column widths: get iPointDelta Dim rColumn As Range Set rColumn = rColumnWidth.EntireColumn rColumn.ColumnWidth = 1 Dim iPoint_1 As Single iPoint_1 = rColumn.Width rColumn.ColumnWidth = 2 Dim iPoint_2 As Single iPoint_2 = rColumn.Width Dim iPointDelta As Single iPointDelta = iPoint_2 - iPoint_1 ' set column width to iPixelWidth Dim iPoint_New As Single iPoint_New = iPixelWidth / iPixelsPerInch * iPointsPerInch Dim iChar_New As Single iChar_New = (iPoint_New - (iPointDelta - 1.5)) / iPointDelta rColumn.ColumnWidth = iChar_New ' reset status ScreenUpdating If bScreenUpdatingState = True Then Application.ScreenUpdating = True End Sub 

运行子setColumnWidth

 Sub call_setColumnWidth() Dim r As Range Set r = ActiveSheet.Range("C1") setColumnWidth r, 70 End Sub