Поиск индекса выбранной ячейки с помощью Microsoft.Офис.Interop.Word

#c# #ms-word #office-interop

#c# #ms-word #office-interop

Вопрос:

Примечание: Я решил эту проблему, используя двойную перебор для цикла. Мне нужен более быстрый и эффективный способ решения этой проблемы, в частности, в C #.

Рассмотрим таблицу Word ниже.

введите описание изображения здесь

Мне нужен эффективный метод поиска заданного столбца и заданной строки и размещения текста в пересекающейся ячейке. Например, допустим, мне дано 1 в качестве моего столбца и A в качестве моей строки. Затем текст будет помещен в ячейку с индексом row:2,col:2.

Что я пробовал: перебор всех строк и столбцов. Это медленно и занимает значительное количество времени. Чтобы ускорить это, я попытался использовать Range.Find , но изо всех сил пытался узнать, где находится найденная ячейка в контексте таблицы. Вот примерный код того, о чем я думал. Я хорошо знаю, что это пропускает проверки, если элементы не найдены или их несколько, но я могу разобраться с этим позже.

 int col;
int row;

var searchRange = table.Range;
var isFound = searchRange.Find.Execute(FindText:rowText);
if(isFound){
 searchRange.Select();
col = searchRange.SOME_FUNCTION_THAT_WILL_REVEAL_THE_CELLS_COL_INDEX_WITHIN_THE_TABLE();
}

var searchRange = table.Range;
var isFound = searchRange.Find.Execute(FindText:rowText);
if(isFound){
 searchRange.Select();
row = searchRange.SOME_FUNCTION_THAT_WILL_REVEAL_THE_CELLS_ROW_INDEX_WITHIN_THE_TABLE();
}

table.Cell(row, col).Text = "Some text For Desired Location";
 

Ответ №1:

Это именно то, чего вы хотите. Вставьте его в модуль VBA, сначала выберите вне таблицы и нажмите F8 в коде. Затем сделайте так, чтобы курсор мыши выделил ячейку в таблице, а затем F8 с помощью этого кода:

 Sub SelectionInfo()
     '
    Dim iSelectionRowEnd As Integer
    Dim iSelectionRowStart As Integer
    Dim iSelectionColumnEnd As Integer
    Dim iSelectionColumnStart As Integer
    Dim lngStart As Long
    Dim lngEnd As Long
     
     ' Check if Selection IS in a table
     ' if not, exit Sub after message
    If Selection.Information(wdWithInTable) = False Then
        MsgBox "Selection is not in a table.  Exiting macro."
    Else
        lngStart = Selection.Range.Start
        lngEnd = Selection.Range.End
         
         ' get the numbers for the END of the selection range
        iSelectionRowEnd = Selection.Information(wdEndOfRangeRowNumber)
        iSelectionColumnEnd = Selection.Information(wdEndOfRangeColumnNumber)
         
         ' collapse the selection range
        Selection.Collapse Direction:=wdCollapseStart
         
         ' get the numbers for the END of the selection range
         ' now of course the START of the previous selection
        iSelectionRowStart = Selection.Information(wdEndOfRangeRowNumber)
        iSelectionColumnStart = Selection.Information(wdEndOfRangeColumnNumber)
         
         ' RESELECT the same range
        Selection.MoveEnd Unit:=wdCharacter, Count:=lngEnd - lngStart
         
         ' display the range of cells covered by the selection
        MsgBox "The selection covers " amp; Selection.Cells.Count amp; " cells, from Cell(" amp; _
        iSelectionRowStart amp; "," amp; iSelectionColumnStart amp; ") to Cell(" amp; _
        iSelectionRowEnd amp; "," amp; iSelectionColumnEnd amp; ")."
    End If
End Sub
 

ССЫЛКА: http://www.vbaexpress.com/kb/getarticle.php?kb_id=867

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

1. Я отмечу это как правильный ответ, поскольку он был ближе всего к ответу. Я искал что-то в C #, но поскольку VBA и C # очень похожи, я приму это. Для тех, кто рассмотрит это позже, функция, которая предоставит вам ваше местоположение в таблице: (СТРОКА) (int)searchRange.Information[Word.WdInformation.wdStartOfRangeRowNumber] (COL) (int)searchRange.Information[Word.WdInformation.wdStartOfRangeColumnNumber]

2. Я могу перевести его на c #, может быть, сегодня днем.

3. Я думаю, это будет хорошо, это завершает весь вопрос, спасибо за вашу помощь