1

Тема: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Здравствуйте!
Необходимо найти ячейку с нужным текстом. Как правильно искать?
Есть вот такая идея, прошу отредактировать, так как это только алгоритм, сам код кривой:
Поиск по строкам таблицы, а внутри строки - по ячейкам

Dim iStr, iCol As Integer
For iStr = 1 To .Table.Count
For iCol = 1 To .Cells.Count
  Find.Text = "искомый текст"
  MsgBox (ячейка с искомым текстом)
Next
Next

Прошу правильно записать этот код. Или код с функцией For Each. Или ещё какой-нибудь способ.
Спасибо.

2

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Вопрос снят: нашел несколько решений здесь:
внешняя ссылка

3

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Увы, рано закрыл вопрос.
Туплю чего-то. Не получается.
Вот часть кода:

n = oDoc.Tables(2).Rows.Count 'количество строк таблицы
m = oDoc.Tables(2).Columns.Count  'количество столбцов таблицы
For i = 1 To n
For j = 1 To m
   With oDoc.Tables(2).Range
      .Find.ClearFormatting
      .Find.Text = "контроля:"       'Ищем вхождения текста
      .Wrap = wdFindStop
      If .found = True Then
            MsgBox i & "-" & j   'Номера строки и столбца с искомым вхождением
         Else
            MsgBox "нет"
         End If
   End With
Next
Next

Здесь MsgBox последовательно выдает все строки и столбцы. А мне надо получить индекс самой первой ячейки с нужным вхождением.
И ещё вопрос: как искать ячейку, введя только часть текста, например "контр"?
p.s. ну и прошу поправить код в смысле культуры оформления.
Спасибо.

4

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

MrBrown пишет:

Увы, рано закрыл вопрос.
Туплю чего-то. Не получается.
И ещё вопрос: как искать ячейку, введя только часть текста, например "контр"?
p.s. ну и прошу поправить код в смысле культуры оформления.
Спасибо.

Эммм
Лучше искать так

Sub ValueOfCell()
'Запоминаем текст ячейки в переменную
Dim sValue
Dim oCell As Cell
Dim oDoc As Document
Set oDoc = ActiveDocument
For Each oCell In oDoc.Tables(2).Cell
    If InStr(oCell.Range.Text, "контроля:") >= 1 Then
        sValue = oCell.Range.Text
        MsgBox sValue
    End If
Next oCell
End Sub

Ну и, понятное дело, если часть текста будете искать, то часть и указываете
Ещё можно методом Selection.Find.Execute искать по всему документу и проверять найденную строку на вхождение в таблицу 2, заранее установив область начала и конца таблицы.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

5

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Почему-то выскакивает такая ошибка:
User-defined type not defined
Как в коде определить этот тип?

6

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Забыл сообщить: ругается на строчку
Dim oCell As Cell (выделяет жёлтым)

7

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Пардон. Надо так. Не проверял на документе

Sub ValueOfCell()
'Запоминаем текст ячейки в переменную
Dim sValue As String
Dim oCell As Cell
Dim oDoc As Document
Set oDoc = ActiveDocument
For Each oCell In oDoc.Tables(1).Range.Cells
    If InStr(oCell.Range.Text, "контроля:") >= 1 Then
        sValue = oCell.Range.Text
        MsgBox sValue
    End If
Next oCell
End Sub
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

8

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Всё равно ругается на эту же строчку.

9

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

и какой же текст ругани
---
у меня все работает

10

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

какая у вас версия и разрядность ВИНДОВС
и офиса
---
32 или 64

11

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Ругается вот так:
User-defined type not defined
на строку
Dim oCell As Cell
Система Win 8.1 х 64
Офис 2013.
И система и офис - легальные.

12

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Полное содержание ошибки:

Compile error:
User-defined type not defined

13

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

MrBrown пишет:

Ругается вот так:
User-defined type not defined
на строку
Dim oCell As Cell
Система Win 8.1 х 64
Офис 2013.
И система и офис - легальные.

Попробуйте использовать oCell как объект общего вида:
Dim oCell as Object

14

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

может у вас битая ссылка(например типа Календарь)
какая разрядность офиса  (32 или 64)

15

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Офис 2013 х32

16

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

MrBrown пишет:

Офис 2013 х32

В этом случае, мне помнится, не играет роль версия ворда
Пробуйте так

Sub ValueOfCell()
'Запоминаем текст ячейки в переменную
Dim sValue As String
Dim oDoc As Document
Set oDoc = ActiveDocument
For Each Cell In oDoc.Tables(1).Range.Cells
    If InStr(Cell.Range.Text, "контроля:") >= 1 Then
        sValue = Cell.Range.Text
        MsgBox sValue
    End If
Next Cell
End Sub
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

17

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Работает!
Прошу извинить, это я сам недоглядел: в самом начале макроса уже было такое:

Dim oDoc As Object
Set oDoc = WD.Documents.Open(Filename:=File)

Видимо, по этой причине не работало.
Сейчас работает.
Только мне нужен не сам текст, а адрес ячейки, в которой он находится, чтобы от неё дальше плясать.
Надо что-то типа такого:
MsgBox [№ строки, № столбца]

18

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

MrBrown пишет:

Работает!
Прошу извинить, это я сам недоглядел: в самом начале макроса уже было такое:

Dim oDoc As Object
Set oDoc = WD.Documents.Open(Filename:=File)

Видимо, по этой причине не работало.
Сейчас работает.
Только мне нужен не сам текст, а адрес ячейки, в которой он находится, чтобы от неё дальше плясать.
Надо что-то типа такого:
MsgBox [№ строки, № столбца]

Вы опять идете в ту же ловушку зависимости от адреса ячейки. Зачем знать адрес ячейки, если он не статичен?!
Можно использовать RowIndex & ColumnIndex

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

19

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

MsgBox cell.Row & cell.Column

не работает

20

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Именно по этой причине, что - не статичен!
В каком-то акте Word эта ячейка, допустим, на 24-й строке, в другом акте - на 25-й строке.
А в следующей ячейке - нужная мне инфа, которую надо загнать в реестр Excel.
Если привязаться только к 24-й строке жёстко, то нужная инфа из другого (кривого) файла Word запишется криво, не та и не в те ячейки.
Я же пробовал.

21

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Я вижу, что всех работников "под одну гребенку" не причешешь:
нет-нет, да найдется "тётенька", которой, ну, жизненно необходимо добавить ещё одну строчку в акте Word!

22

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

MrBrown пишет:

Я вижу, что всех работников "под одну гребенку" не причешешь:
нет-нет, да найдется "тётенька", которой, ну, жизненно необходимо добавить ещё одну строчку в акте Word!

Так а смысл вам обращаться к ячейке, если вы уже осуществляете поиск по тексту?

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

23

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Опечатка:
добавить не строчку в текст , а строку в таблицу.
Ну или разделить/объединить ячейки таблицы.
И данный акт Word автоматом становится "кривым".

24

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Для понимания прикладываю шаблон акта Word.
Допустим, макрос нашел текст во второй таблице:
"2. Работы выполнены по проектной документации".
Но мне нужен не этот текст, а следующий за ним (выделен красным).
А если эта документация занимает не две, а пять-шесть строчек, то их приходится добавлять инженеру.
А раз строчки добавлены, значит строчки начала и конца работы тоже "сползут" вниз.
Так вот я стремлюсь все нужные данные "привязать" к своим текстам, выполненным шрифтом Bold.
Макрос ищет очередной текст и вставляет в реестр НЕ ЕГО, А СЛЕДУЮЩИЙ ЗА НИМ!
Подскажите метод, который считаете лучшим.
Спасибо.

Post's attachments

Word.docx 21.13 Кб, 2 скачиваний с 2017-06-27 

You don't have the permssions to download the attachments of this post.

25

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Я бы находил текст, переходил на следующую ячейку, брал текст и переходил дальше - Если пусто или если маркер - переход на следующий поиск. Если текст - добавляем текст и идём дальше. В Ворде существует серьёзная проблема с обращением к ячейкам по их адресу в тех таблицах, где существуют объединённые ячейки.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

26

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Я бы то же так сделал бы, если б знал smile)
Вопрос: как перейти на следующую ячейку?
Это главное на сей момент.

27

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

С offset-ом у меня беда...

28

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Вопрос: что такое маркер?
Ну, применительно к моей проблеме.

29

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

я бы видимо не стала привязываться к таблице , а перебирала бы параграфы
вечером попробую на вашем примере

30

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

не совсем четко, но получила

Sub ValueOfCell_170627()
'Запоминаем текст ячейки в переменную
Dim sValue As String
Dim c1 As Cell, s1, k1, k2
Dim oDoc As Document
Set oDoc = ActiveDocument
Dim tbl As Table
k1 = 0
k2 = 0
For Each tbl In Word.ActiveDocument.Tables
tbl.Select
For Each c1 In Selection.Cells
s1 = Replace(c1.Range.Text, Chr(13), " ")
s1 = Replace(s1, Chr(10), " ")
s1 = Replace(s1, Chr(9), " ")
s1 = Replace(s1, Chr(7), " ")
s1 = Replace(s1, Chr(11), " ")


s1 = Replace(s1, "  ", " ")

If c1.Range.Font.Size < 7 Then s1 = ""

If s1 Like "5. *" Then
Debug.Print
Debug.Print s1;

k1 = 0
k2 = 0
s1 = ""
ElseIf s1 Like "[12346789]. *" Then
Debug.Print
'Debug.Print s1;

k1 = 0
k2 = 8
s1 = ""
ElseIf s1 Like "требованиям:*" Then
k1 = 0
k2 = 8
s1 = ""
''требованиям:

ElseIf s1 Like "Дополнительные сведения*" Then
k1 = 0
k2 = 0

ElseIf s1 Like "№ *" Then   ''№ 000/2.15-КЖ
Debug.Print
 Debug.Print s1
 k1 = 0
 k2 = 0
ElseIf s1 Like "*20??г*" Then  '' "15" марта 2017г
Debug.Print
 Debug.Print s1
 k1 = 0
 k2 = 0
Else
''
End If
k1 = k1 + 1

If k1 < k2 And k1 > 0 And Len(s1) > 0 Then
If k1 = 1 Then
Debug.Print
Debug.Print s1; " ";
Else
Debug.Print s1; " ";
End If
End If
Next c1
Next tbl

'''№ 0 / 2.15 - КЖ
'''
'''«15» марта 2017г.
'''
'''Установка опалубки    фундаментов в/о А-С/1-2 отм. +(55.600?58.100).
'''ООО «[наименование ООО]»   2.15-КЖ Лист 2
'''   
'''         
'''5. Даты: начала работ «10» марта 2017г.     окончания работ «14» марта 2017г.
End Sub

31

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

shanemac51, спасибо за отклик, но увы, сколько ни бился, у меня всегда выскакивает какая-нибудь ошибка. Много ещё не понимаю.
Сейчас пока (с великой благодарностью) пользуюсь макросом, предложенным мне Fck_This (см. в приложенном файле-реестре). С этим макросом из десятка обработанных актов Word два-три вставляются криво, это потому, что сами акты Word кривые - с добавленными/убавленными строками, объединёнными/разбитыми ячейками. Такие акты заношу в реестр вручную.
Буду весьма признателен, если Вы доработаете именно этот макрос применительно к моим "хотелкам":
1. Находить нужные данные и вставлять их в реестр Excel несмотря на добавление/удаление строк в актах Word, объединение/разбиение ячеек.
2. Запоминать последнюю выбранную директорию и начинать новую сессию именно с неё.
Спасибо.
p.s. Все записи в файле Word, выполненные шрифтом Bold - неизменные. Их никогда не удаляют и не редактируют. К ним и нужно привязываться.

Post's attachments

Реестр АОСР.xls 40 Кб, 2 скачиваний с 2017-06-29 

You don't have the permssions to download the attachments of this post.

32

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Доброго времени суток !Если есть вариант,помогите полжалуйста в поиске решения.После выполнения Макроса(копирование и вставка Таблицы) при определенном условии(при определенном изменении ячейки),не могу эту самую таблицу заполнить,Макрос удаляет лишнее,и оставляет только то,что было в него записано макрорекордером.Вопрос.Как его остановить в строке vba,что бы когда нужно(при изменении значения ячейки)  он срабатывал,но потом не мешал эту самую таблицу заполнять?Заранее благодарю за полезный ответ!

Private Sub Worksheet_Change(ByVal Target As Range)
     If Cells(3, 2) =

33

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

Alexsh пишет:

Доброго времени суток !Если есть вариант,помогите полжалуйста в поиске решения.После выполнения Макроса(копирование и вставка Таблицы) при определенном условии(при определенном изменении ячейки),не могу эту самую таблицу заполнить,Макрос удаляет лишнее,и оставляет только то,что было в него записано макрорекордером.Вопрос.Как его остановить в строке vba,что бы когда нужно(при изменении значения ячейки)  он срабатывал,но потом не мешал эту самую таблицу заполнять?Заранее благодарю за полезный ответ!Private Sub Worksheet_Change(ByVal Target As Range)     If Cells(3, 2) =

Как я понял - вам надо сделать так, чтобы макрос заполнял только пустые? Или как?Не знаю, что там с вашим методом - использую книжный (Создаём в модуле

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

34

Re: Как просканировать всю таблицу в поисках ячейки с нужным текстом?

КАПЧА ОБРЕЗАЕТ!!

Alexsh пишет:

Доброго времени суток !Если есть вариант,помогите полжалуйста в поиске решения.После выполнения Макроса(копирование и вставка Таблицы) при определенном условии(при определенном изменении ячейки),не могу эту самую таблицу заполнить,Макрос удаляет лишнее,и оставляет только то,что было в него записано макрорекордером.Вопрос.Как его остановить в строке vba,что бы когда нужно(при изменении значения ячейки)  он срабатывал,но потом не мешал эту самую таблицу заполнять?Заранее благодарю за полезный ответ!

Private Sub Worksheet_Change(ByVal Target As Range)
     If Cells(3, 2) =

Как я понял - вам надо сделать так, чтобы макрос заполнял только пустые? Или как?
Не знаю, что там с вашим методом - использую книжный (Создаём в модуле "Эта книга")

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    sCell = Target.Address 'Эта строка покажет адрес изменяемой ячейки
    sValue = Target 'Эта строка покажет введённый текст
     If Target = "Hello World" Then
     'Это условие позволит выполнить действие при условии, что содержимое изменяемой ячейки
     'соответствует необходимое. В этом промежутке указываем то, что нужно выполнить
     End If
     'Если надо найти вхождение текста в текст ячейки, то используем:
     If InStr(Target, "Hello") >= 1 Then
     'Указываем, что надо сделать
     End If
End Sub

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871