#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. Я думаю, это будет хорошо, это завершает весь вопрос, спасибо за вашу помощь