Excel加载项:单元格的绝对位置

我怎样才能find某个单元格的绝对坐标像素?

我正在开发一个Office 2010插件(function区UI),并向function区中的新菜单添加一个新button,当按下button时,我想获取该单元格的屏幕位置。 问题是这样的

Globals.ThisWorkbook.Application.ActiveCell . Top / Left 

只给出相对于电子表格的A1angular的位置,而我想要的位置相对于屏幕的0,0。

我发现这一点: 如何获得在C#中的Excel 2003单元格的屏幕X和Y,但它是为Office 2003,我不完全明白答案。

我正在使用C#进行开发,但VB也会这样做。

谢谢!

我发现这个post ,其中包含下面使用的API调用。 我也被提醒说,你可以通过Application.Commandbars(“Ribbon”)获得Ribbon的高度。 所以,在VBA中你会这样做:

编辑:作为响应公式栏和标题的高度问题,我添加了一个函数,隐藏它们,获取ActiveWindow.Height,然后显示它们并获取新的ActiveWindow.Height,并计算出差异。 该函数现在在下面的行中被调用,在转换之前将高度加在一起。 我认为它的工作,但我没有做很多testing。

 Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long Private Const LOGPIXELSX As Long = 88 Private Const LOGPIXELSY As Long = 90 Sub CellTopLeftPixels(rng As Excel.Range) Dim RibbonHeight As Long Dim TotalTop As Long Dim TotalLeft As Long RibbonHeight = Application.CommandBars("Ribbon").Height TotalTop = (RibbonHeight + GetFormulaBarAndHeadingsHeight + rng.Top) * PixelsPerPointY TotalLeft = rng.Left * PixelsPerPointX Debug.Print "Top: "; TotalTop; " Left: "; TotalLeft End Sub Function GetFormulaBarAndHeadingsHeight() Dim ActiveWindowHeightWhenHidden As Long Dim ActiveWindowHeightWhenShown As Long Application.DisplayFormulaBar = False ActiveWindow.DisplayHeadings = False ActiveWindowHeightWhenHidden = ActiveWindow.Height Application.DisplayFormulaBar = True ActiveWindow.DisplayHeadings = True ActiveWindowHeightWhenShown = ActiveWindow.Height GetFormulaBarAndHeadingsHeight = ActiveWindowHeightWhenHidden - ActiveWindowHeightWhenShown End Function Function PixelsPerPointX() As Double Dim hdc As Long Dim PixPerInchX As Long hdc = GetDC(0) PixPerInchX = GetDeviceCaps(hdc, LOGPIXELSX) PixelsPerPointX = PixPerInchX / 72 ReleaseDC 0, hdc End Function Function PixelsPerPointY() As Double Dim hdc As Long Dim PixPerInchY As Long hdc = GetDC(0) PixPerInchY = GetDeviceCaps(hdc, LOGPIXELSY) PixelsPerPointY = PixPerInchY / 72 ReleaseDC 0, hdc End Function 

上面的72是每英寸点数。

像这样称呼它:

 Sub test() CellTopLeftPixels ActiveCell End Sub 

我发现这个工作没有任何一种嘲笑:

  Point GetScreenPositionFromCell(Excel.Range cell, Excel.Application excel) { var wnd = excel.ActiveWindow; if (wnd != null) { var result = new Point { X = wnd.PointsToScreenPixelsX((int)cell.Left), Y = wnd.PointsToScreenPixelsY((int)cell.Top) }; //cleanup Marshal.ReleaseComObject(wnd); wnd = null; return result; } throw new Exception("Error retrieving active Excel-window."); }