#excel #vba #ms-word
Вопрос:
То, что я пытаюсь сделать, это следующее:
- Запустите модуль. Откроется диалоговое окно выбора файлов и выберите набор файлов. Файлы всегда имеют 8-значный идентификатор в начале имени, но остальная часть имени является переменной.
- Найдите ВСЕ строки формы «T0***» в файле word и сохраните их в массиве.
- Откройте электронную таблицу Excel (одну электронную таблицу для всего макроса). Сообщите идентификатор файла в A1 и выпишите строку результатов поиска в B1.
- Закройте этот файл Word, откройте следующий в списке и повторите процесс. Сообщите о своих результатах в таблицах A2 и B2. Делайте это до конца выбранного списка файлов word.
Может быть любое количество строк T0***.
До сих пор у меня получалось открывать каждый файл, а затем закрывать его. Это все, что я могу сказать. Любая помощь будет очень признательна!
'Toolfind Macro
Sub ToolFind()
Dim idarray
Dim FileSelections
Dim j As Integer
' ------------------------------------------------------
Dim MyDialog As FileDialog, GetStr(1 To 500) As String
On Error Resume Next
Set MyDialog = Application.FileDialog(msoFileDialogFilePicker)
Set Ex0 = New Excel.Application
Set Wb0 = Ex0.Workbooks.Add
' ---------------------------------------------------------------
' *.doc? allows processing of *.doc and *.docx files.
' ---------------------------------------------------------------
With MyDialog
.Filters.Clear
.Filters.Add "All WORD File ", "*.doc?", 1
.AllowMultiSelect = True
i = 1
If .Show = -1 Then
For Each stiSelectedItem In .SelectedItems
GetStr(i) = stiSelectedItem
i = i 1
Next
i = i - 1
End If
Application.ScreenUpdating = False
For j = 1 To i Step 1
Set Doc = Documents.Open(FileName:=GetStr(j), Visible:=True)
Set ID = Left(GetStr(j), 8)
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
ActiveWindow.Panes(2).Close
End If
If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
ActivePane.View.Type = wdOutlineView Then
ActiveWindow.ActivePane.View.Type = wdPrintView
End If
ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
'-----------------------------------------------------------------------'
Dim k As Long, SmArr()
With ActiveDocument.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = "T0***"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchWildcards = True
.Execute
End With
Do While .Find.Found
k = k 1
ReDim Preserve SmArr(k)
SmArr(k) = .Text
.Collapse wdCollapseEnd
.Find.Execute
Loop
End With
'go into EXCEL'
Wb0.Sheets(1).Range("A1").Value (ID)
Wb0.Sheets(1).Range("B1").Value (SmArr)
Application.ScreenUpdating = True
'-----------------------------------------------------------------------
ActiveDocument.Close (wdSaveChanges)
Next j
End With
End Sub
Комментарии:
1.
SmArr
не сбрасывается между циклами. он будет переносить все данные из предыдущих циклов. Вы захотитеErase SmArr
сделать это в конце цикла.2. Чтобы просмотреть файл после того, как вы закончите, сделайте
Ex0.Visible = True
это . Чтобы сохранить файл с отображением или без него, выполнитеWb0.SaveAs "FileName"
3. Чтобы макрос выводился в разные строки книги, вы можете добавить
.Offset(j - 1)
в конец диапазонов, напримерWb0.Sheets(1).Range("A1").Offset(j - 1).Value = ID
. Кстати, вам нужен знак»=», чтобы присвоить значение. И вам не нужны скобки.4. Внес эти изменения. Но модуль по-прежнему ничего не делает… он открывает и закрывает каждый файл word, а затем открывает пустой файл Excel и завершает работу.
5.
k
также следует сбрасывать между циклами. Что касается того, почему SmArr не заполнен значениями… Я недостаточно знаю о MS Word VBA, чтобы помочь в дальнейшем… извините!