#c# #excel #excel-dna
#c# #excel #excel-днк
Вопрос:
Я некоторое время работал над надстройкой ExcelDNA / C #, и я на последнем препятствии.
Я могу получить адрес выборки, и мне прежде всего нужно проверить, являются ли строки в этой выборке просто двумя, например, в Excel они были бы 8 9, две строки рядом друг с другом или любые два последовательных числа.
Затем мне нужно проверить, что существует более двух столбцов и т.д. От C до J (более двух пробелов в алфавите).
Все это нужно сделать из строки, подобной этой: Лист1!$ C $ 8: $ J $ 9
То, что я пытаюсь сделать, это разделить выделение, подобное этому, которое возвращает приведенную выше строку, на две строки, в случае примера желаемый конечный результат был бы
Лист1!$ C $ 8: $ J $ 8 Лист1! $ C $ 9: $ J $ 9 в двух разных строках, возможно, мне нужно больше кофе, но если у кого-нибудь есть менее дрянной способ сделать это, чем я планирую, я буду у вас в вечном долгу!
Ответ №1:
У вас есть ссылка на Range
объект? Если это так, range.Rows.Count == 2
сообщит вам, есть ли две строки, и range.Columns.Count > 2
сообщит вам, есть ли более двух столбцов.
Затем, чтобы получить адреса двух строк независимо, вы можете сделать что-то вроде:-
var address1 = range.Rows[1].Address(external:true);
var address2 = range.Rows[2].Address(external:true);
Комментарии:
1. К сожалению, у меня нет ссылки на объект Range, я получаю выделение, используя следующее: //Получить ссылку на выбранный в данный момент диапазон в Excel ExcelReference selection = (ExcelReference)XlCall. Excel(XlCall.xlfSelection); strSelectionAddress = (строка)XlCall. Excel (XlCall.xlfref text, выделение, true);
2. Кроме того, я не пытаюсь суммировать ячейки, я просто пытаюсь разделить две «строки» выделения на отдельные строки для другого использования.
3. Я соответствующим образом отредактирую свой ответ. Что касается объекта Range — у меня сейчас нет ExcelDNA под рукой, но разве невозможно создать объект Range с учетом адреса?
4. Я мог бы это сделать, но этот конкретный код является частью сложного оператора ‘if’, мне нужен способ взглянуть на исходную строку и быть способным распознать, что выделенный фрагмент находится в этом формате, хотя ваш ответ решает мою вторую половину проблемы! Так что за это я благодарен
5. Я думаю, в целом, если вы при первой возможности преобразуете свой строковый адрес в объект range и с этого момента будете работать исключительно с объектом range, все будет намного проще. Вам вообще не придется выполнять какой-либо синтаксический анализ / манипулирование строковыми адресами.
Ответ №2:
Я предполагаю, что это выполняется из макроса, вызываемого из командной строки или обработчика событий ленты. В этом случае вы могли бы с таким же успехом использовать интерфейс автоматизации COM с самого начала и никогда не беспокоить C API (XlCall и ExcelReference).
Чтобы получить текущий выбор, вы бы просто сказали
Application xlApp = (Application)ExcelDnaUtil.Application;
Range selectedRange = xlApp.Selection as Range;
if (selectedRange != null)
{ .... do you further checking here ...}
Материал C API немного важнее, если вы создаете пользовательские функции или хотите высокопроизводительную передачу данных. Но для обычных макросов COM API проще.