Как получить экран X и Y ячейки Excel 2003 на C#

#c# #excel #excel-2003

#c# #excel #excel-2003

Вопрос:

Как я могу найти абсолютное положение ячейки в Excel 2003 (например, относительно экрана [ов]) при написании надстройки C # Excel 2003.

Кажется, что свойства Top и Left диапазона (такого как ActiveCell) задают X и Y относительно верхней левой ячейки. Окно.Слева и сверху указаны X и Y окна, но я не могу найти способ получить размер бита в середине (состоящий из панелей инструментов и тому подобного).

Цель здесь состоит в том, чтобы отобразить форму WPF, которая относится к выбранной ячейке и расположена рядом с ней.

Я чувствую, что мне здесь не хватает чего-то основного. Любая помощь с благодарностью!

Комментарии:

1. Я не уверен, что вы сможете это сделать. Самое близкое, что вы можете получить, — это UsableHeight и UsableWidth активного окна ( Application.Windows коллекции) вместе с Top и Left указанного окна и Width и Height главного окна Excel. Таким образом, вы можете в некоторой степени получить не клиентскую область. Но я не знаю способа узнать, сколько неклиентной области находится над вашим окном (строки меню, строка заголовка окна и т.д.) И сколько ниже (строка состояния)

2. Спасибо за вашу помощь, между делом! Я не изучал UsableHeight и UsableWidth , но это хорошее предложение. Возможно, можно определить, сколько занимает строка состояния, определив, отображается она или нет (при условии, что строка состояния всегда имеет фиксированную высоту). Немного «хакерский», но если это лучшее, что я могу сделать…

Ответ №1:

Следующая ссылка содержит некоторый код VBA, который может указать вам правильное направление: Form Positioner .

Это сложнее, чем я думал, но если вам нужно определить высоту некоторых командных панелей Excel, следующий код VBA в их примере может помочь:

 '
' we'll assume that the application's caption bar and the formula
' bar are the same height as the menu bar.  If we can't figure that out, use 26 as a default.
'
If Application.CommandBars.ActiveMenuBar.Visible = True Then
    DefaultCmdBarHeight = Application.CommandBars.ActiveMenuBar.Height
Else
    DefaultCmdBarHeight = cDefaultCmdBarHeight
End If
'
' We have to have a compenstating factor for command bars. Load an array
' with the heights of visible command bars. The index into the array is
' the RowIndex of the command bar, so we won't "double dip" if two or more
' command bars occupy the same row.
'
For Each CmdBar In Application.CommandBars
    With CmdBar
        If (.Visible = True) And (.Position = msoBarTop) Or (.Position = msoBarMenuBar) Then
            If .RowIndex > 0 Then
                VCmdArr(.RowIndex) = .Height
            End If
        End If
        If (.Visible = True) And (.Position = msoBarLeft) Then
            If .RowIndex > 0 Then
                HCmdArr(.RowIndex) = .Width
            End If
        End If
    End With
Next CmdBar