Разбираюсь в манипуляциях со строками

#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 проще.