Всё-таки мне непонятно, то ли ты читаешь текст, то ли нет
GSerg писал(а):Тогда можно искать "<", и если найдено, смотреть на следующее и ещё следующее w.
GSerg писал(а):Тогда можно искать "<", и если найдено, смотреть на следующее и ещё следующее w.
For Each w In w2.Words
MsgBox w.text
Next
Dim Shp As Word.Shape
For Each Shp In w2.Shapes
...
Next
Shp.Select
With shp.TextFrame
...
End With
Неважно, что For Each Shp In w2.Shapes. И фреймы, и шейпы там. Рамки как были сделаны? На панели инструментов "Рисование" нажимали "Надпись" (и тогда это фрейм) или "Прямоугольник", в котором потом "Добавить текст"?
Rojohn писал(а):InCollection() - не существует
Option Explicit
#Const ХАЧЮ_БЫСТРО = False
Sub afdg()
Dim c As Collection, s As Shape
Set c = New Collection
c.Add "Администрация президента РФ", "<ВЫШ_ОРГ>"
c.Add "Москва, Кремль", "<АДРЕСАТ>"
c.Add "Путин", "<ВЛ_ФАМИЛИЯ>"
c.Add "Владимир", "<ВЛ_ИМЯ>"
c.Add "Владимирович", "<ВЛ_ОТЧЕСТВО>"
c.Add "Просто так, позырить", "<ПРОВЕРКА_ВЫЗВАНА>"
Application.ScreenUpdating = False
rep ThisDocument.Range, c
rep ThisDocument.StoryRanges(wdTextFrameStory), c
For Each s In ThisDocument.Shapes
If s.TextFrame.HasText Then rep s.TextFrame.TextRange, c
Next
Application.ScreenUpdating = True
End Sub
Private Sub rep(ByVal r As Range, ByVal c As Collection)
#If Not ХАЧЮ_БЫСТРО Then
Dim e As Long
e = r.End
r.Find.ClearFormatting
Do While r.Find.Execute("\<*\>", , , True)
On Error Resume Next
r.Text = c(r.Text)
On Error GoTo 0
r.SetRange r.End, e
Loop
#Else
Dim w As Range, w2 As Range, s As String
For Each w In r.Words
If w.Text = "<" Then
Set w2 = w.Next(wdWord, 1)
If Not w2 Is Nothing Then
s = "<" & w2.Text
Do
Set w2 = w2.Next(wdWord, 1)
If w2 Is Nothing Then Exit Do
Select Case RTrim$(w2.Text)
Case "_"
s = s & "_"
Case ">"
s = s & ">": Exit Do
Case Else
If Right$(w2.Text, 1) = " " Then Set w2 = Nothing: Exit Do Else s = s & w2.Text
End Select
Loop
If Not w2 Is Nothing Then
w2.SetRange w.Start, w2.Start + Len(">")
On Error Resume Next
w2.Text = c(s)
On Error GoTo 0
End If
End If
End If
Next
#End If
End Sub
rep ThisDocument.StoryRanges(wdTextFrameStory), c
ЗЫ: проявленное в топике незнание основ работы с VB более одного раза не прощается. Иными словами, в дальнейшем ув. тов. Rojohn будет получать помощь исключительно в виде пинка(ов) в нужном направлении.
Rojohn писал(а):не заменяются метки в ячейках таблицы
Rojohn писал(а):и мне ещё надо было вставлять таблицы в метки
Rojohn писал(а):какова роль обработки ошибок в коротком варианте процедуры Rep?
Rojohn писал(а):И что заменяется строкой:
- Код: Выделить всё
rep ThisDocument.StoryRanges(wdTextFrameStory), c
Rojohn писал(а):Конечно я могу понять, что для тебя, человека давно посещающего этот форум, вопрос, например об использовании Range говорит о незнании основ VB, но для меня это далеко не основы и я думаю не только для меня... А как коллекциями пользоваться я знал и до этого, к сожалению вопрос был в алгоритме использования коллекции в данном контексте и я этого не понял...
Rojohn писал(а):оценил твои усилия по созданию медленного варианта Rep
Заменяются, в том числе в таблицах, расположенных в рамках и фреймах.
Rojohn писал(а):
и мне ещё надо было вставлять таблицы в метки
Ну и как сделал?
For i=1 To TablInDoc.Count
w1.WordBasic.StartOfDocument
w1.WordBasic.EditFind Find:= TablInDoc(CStr(i))
Do While w1.WordBasic.EditFindFound()
With w1.WordBasic
.Insert MeColTH(TablInDoc(CStr(i)))
... 'Таблица в виде текста
End With
.ParaUp rsTbl.RecordCount+1,1
w2.ActivWindow.Selection.ConvertToTable Separator:=wdSeparateByCommas, NumColumns:=rsTbl.Fields.Count+1, NumRows:=rsTbl.RecordCount+1, Format:=wdTableFormatGrid1, ApplyBorders:=True, ApplyShading:=True, ApplyFont:=True, ApplyColor:=True, ApplyHeadingRows:=True, ApplyLastRow:=False, ApplyFirstColumn:=True, ApplyLastColumn:=False, AutoFit:=False, AutoFitBehavior:=wdAutoFitFixed
...
w1.WordBasic.EditFind Find:=TablInDoc(CStr(i))
Loop
Next i
Do While w1.WordBasic.EditFindFound()
With w1.WordBasic
End With
Loop
Чтобы не писать функцию InCollection. Есть текущее слово в коллекции - заменить, нет - не заменять...
Ещё на первой странице я писал - w.text = col(w.text).
Ты случаем не перепутал медленный rep с быстрым?
Rojohn писал(а):Везде заменяются, кроме пары бланков.
Rojohn писал(а):А когда выскакивает ошибка, когда нет соответствия в коллекции?
Rojohn писал(а):Как раз проблема у меня была не в понимании w.text = col(w.text), а как сделать функцию InCollection, то есть с проходом по Range и обработкой ошибок.
Rojohn писал(а):Ты случаем не перепутал медленный rep с быстрым?
Надеюсь, что нет Это тот что сверху (в котором ХАЧЮ_БЫСТРО = False). Или второй заговоренный?
Фдибаг!
Фдибаг, а вовсе не окружным путём.
Private Sub Rep(ByVal r As Range, ByVal col As Collection, ByVal tblON As Boolean, ByVal tblH As Collection, ByVal FstProv As Boolean)
Dim rsTblReq As Recordset, rsTblReq1 As Adodc
Dim e As Long, tblText As String
Dim n_col As Integer, n_pp As Long
e = r.End
r.Find.ClearFormatting
Do While r.Find.Execute("\<*\>", , , True)
On Error Resume Next
If tblON = False Then
If FstProv = False Then
r.text = col(r.text)
Else
tblText = tblH(r.text)
If tblText <> "" Then
tblText = ""
GoTo NextLBL
End If
With w2.ActiveWindow
.Selection.Find.ClearFormatting
.Selection.Find.Replacement.ClearFormatting
With .Selection.Find
.text = r.text
.Replacement.text = col(r.text)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
.Selection.Find.Execute Replace:=wdReplaceAll
End With
End If
Else
tblText = tblH(r.text)
If tblText = "" Then GoTo NextLBL
TabInDoc.Add r.text, CStr(TabInDoc.Count + 1)
End If
NextLBL:
On Error GoTo 0
r.SetRange r.End, e
Loop
End Sub
А она не выскакивает...
Тот, что сверху - это у тебя медленный или быстрый?..
Rep w2.Range, MeCol, False, MeColTH, False
Rep w2.Range, MeCol, False, MeColTH, True
Private Sub Rep(ByVal r As Range, ByVal col As Collection, ByVal tblON As Boolean, ByVal tblH As Collection, ByVal FstProv As Boolean)
Dim e As Long, tblText As String
Dim n_col As Integer, n_pp As Long
Dim wz As Range, w2z As Range, s As String
For Each wz In r.Words
If wz.text = "<" Then
Set w2z = wz.Next(wdWord, 1)
If Not w2z Is Nothing Then
s = "<" & w2z.text
Do
Set w2z = w2z.Next(wdWord, 1)
If w2z Is Nothing Then Exit Do
Select Case RTrim$(w2z.text)
Case "_"
s = s & "_"
Case ">"
s = s & ">": Exit Do
Case Else
If Right$(w2z.text, 1) = " " Then Set w2z = Nothing: Exit Do Else s = s & w2z.text
End Select
Loop
If Not w2z Is Nothing Then
w2z.SetRange wz.Start, w2z.Start + Len(">")
On Error Resume Next
If tblON = False Then
If FstProv = False Then
w2z.text = col(s)
Else
tblText = ""
tblText = tblH(s)
If tblText <> "" Then GoTo NextLBL
With w2.Application.ActiveWindow
.Selection.Find.ClearFormatting
.Selection.Find.Replacement.ClearFormatting
With .Selection.Find
.text = s
.Replacement.text = col(s)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
.Selection.Find.Execute Replace:=wdReplaceAll
End With
End If
Else
tblText = tblH(s)
If tblText = "" Then GoTo NextLBL
TabInDoc.Add s, CStr(TabInDoc.Count + 1)
End If
End If
NextLBL:
On Error GoTo 0
End If
End If
Next wz
End Sub
Сейчас этот форум просматривают: Google-бот и гости: 18