Статьи из блога

Как определить нахождение курсора ввода в ячейке таблицы

Как узнать, находится ли курсор ввода в таблице в документе Word или нет?

Недавно мне пришлось столкнуться с такой проблемой, когда я готовил шаблон документа для организации. Пришлось поспрашивать на тематических форумах по программированию. Решение нашлось быстро. Возможно оно кому-то и пригодится.

P.S. Обнаружилось, что если курсор ввода находится в конце таблицы (не в последней ячейке, а за границей таблицы впритык к последней ячейке), то этот макрос выдает неверный результат.

Правильнее использовать другой код (макрос + функция), опубликованный ниже макроса "PointIntoTable".

Sub PointIntoTable 
Set rngTable = Selection.Range 
If Not rngTable.Information(wdWithInTable) Then 
    MsgBox prompt:="Курсор находится вне таблицы" 
Else 
... 'ваш код после условия 
End if 
End sub

Дополнено с учетом комментариев Вождя и Александра Витера:

Sub PointIntoTable2()
Dim rngTable As Range
Set rngTable = Selection.Range
If Range_InCell(rngTable) = True Then
  MsgBox prompt:="Курсор находится в таблице"
Else
  MsgBox prompt:="Курсор находится вне таблицы"
End If
End Sub
 
Public Function Range_InCell(ByRef icRange As Word.Range) As Boolean
' возвращает True, если область icRange целиком находится в ячейке
    Range_InCell = False
    On Error Resume Next
    If icRange.Information(wdWithInTable) <> True Then
    ElseIf icRange.Cells.Count <> 1 Then
    Else
        Range_InCell = True
    End If
End Function

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

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

  1. 04.01.2010 в 14:43 | #1

    Разочарую автора функции PointIntoTable. Его функция будет правильно сообщать, как пишет автор, «находится ли курсор ввода в таблице или нет» только когда Selection.Range целиком находится в таблице.

    Для справки: функция Information(wdWithInTable) выдает True, когда область целиком находится в таблице.

    Т.е. Selection.Information(wdWithInTable)=True и когда Selecion содержит несколько ячеек, и когда Selecion находится в конце строки таблицы, а это уже вообще не ячейка.

    Вопрос был о нахождении в ячейке. Для ячейки я написал и пользуюсь макросом:

    Public Function Range_InCell(ByRef icRange As Word.Range) As Boolean
    ' возвращает True, если область icRange целиком находится в ячейке
        Range_InCell = False
        On Error Resume Next
        If icRange.Information(wdWithInTable)  True Then
        ElseIf icRange.Cells.Count  1 Then
        Else
            Range_InCell = True
        End If
    End Function

  2. 04.01.2010 в 15:18 | #2

    Эй! А куда делить неравенства из кода макроса?

    Кокин научи правильно код в комментарии вставлять.

  3. 04.01.2010 в 16:31 | #3

    При добавлении кода в комментарии используйте такое выражение:

    <pre class="brush:vb;"&qt;</pre&qt;

  4. 04.01.2010 в 17:08 | #4

    Хочу заметить, что задача состояла в том, чтобы определить, находится ли курсор в таблице, а не выделенный диапазон. Курсор всегда находится там целиком, поэтому макрос Антона верен.

    Ваш же макрос, Вождь, более универсальный, но с какой-то непонятной мне логикой. По-моему, так будет понятнее.

    Public Function Range_InCell(ByRef icRange As Word.Range) As Boolean
    ' возвращает True, если область icRange целиком находится в ячейке
        On Error Resume Next
        If Not icRange.Information(wdWithInTable) Then
          Range_InCell = icRange.Cells.Count  1
        End If
    End Function

  5. Вождь
    04.01.2010 в 18:55 | #5

    «В таблице» и «в ячейке таблицы» - это разные понятия.

    Чтобы вы поняли, попробуйте следующее:

    1. Поместите курсор под таблицей, в начале параграфа

    2. Нажмите клавишу «Влево». Курсор сместится в конец таблицы, но не в ячейку.

    3. Сейчас функция PointIntoTable выдаст, что курсор в ячейке, моя – нет.

    Мой макрос не универсальный, а правильный smile

  6. 04.01.2010 в 19:02 | #6

    Возможно, это моя ошибка в том, что в заголовке речь идет о ячейке, а в тексте о таблице в целом, поскольку вопрос был о таблице, а не о конкретной ячейке таблицы.

    P.S. Действительно, если курсор находится сразу же за таблицей, то и тогда макрос сообщит, что курсор в таблице, а это неверно.

  7. 04.01.2010 в 19:25 | #7

    Дополнил заметку с учетом ваших поправок. Спасибо!

  8. Igor
    17.08.2010 в 20:02 | #8

    а как получить ссылку на эту таблицу, для того чтобы добавить колонки или строки и вставить туда значения?

  9. 17.08.2010 в 23:12 | #9

    Ссылку на таблицу, в которой находится курсор?

    Selection.Tables(1)

Оставьте комментарий!

(обязательно)

^ Наверх