Excel插件:单元格绝对位置

时间:2012-02-12 06:24:31

标签: c# vb.net excel excel-addins

如何找到某个单元格的绝对坐标?

我正在开发Office 2010插件(功能区UI),我在功能区中的新菜单中添加了一个新按钮,当按下按钮时,我想获得该单元格的屏幕位置。问题是

Globals.ThisWorkbook.Application.ActiveCell . Top / Left

仅提供相对于电子表格A1角的位置,而我希望该位置相对于屏幕的0,0。

我发现了这个问题:How to get screen X and Y of an Excel 2003 cell in C#但它适用于Office 2003,而我并不完全理解答案。

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

谢谢!

2 个答案:

答案 0 :(得分:4)

我发现这可以在没有任何hackery的情况下工作:

    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.");
    }

答案 1 :(得分:3)

我找到了this post,其中包含下面使用的API调用。我还被提醒您可以使用Application.Commandbars(“Ribbon”)获得功能区的高度。高度。所以,在VBA你会做:

编辑:为了回应Formula Bar和Headings身高问题,我添加了一个隐藏它们的函数,获取ActiveWindow.Height,然后显示它们并获取新的ActiveWindow.Height并计算差异。现在,在下面的行中调用该函数,在转换之前将其加在一起。我认为它有效但我没有做很多测试。

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