Страницы: 1
RSS
Скопировать таблицы из документа ворд в книгу ексель, ВБА
 
Добрый день!
Необходимо:
Перенести все таблицы из файлов ворд  в ексель,
На просторах интернета есть макрос который это делает но не совсем корректно, но необходимо немного доработать его

Код
Option Explicit

Sub ImportWordTable()

Dim wdDoc As Object
Dim wdFileName As Variant
Dim tableNo As Integer      'table number in Word
Dim iRow As Long            'row index in Excel
Dim iCol As Integer         'column index in Excel
Dim resultRow As Long
Dim tableStart As Integer
Dim tableTot As Integer

On Error Resume Next

wdFileName = Application.GetOpenFilename("Word files (*.docx),*.docx", , _
"Browse for file containing table to be imported")

If wdFileName = False Then Exit Sub '(user cancelled import file browser)

ActiveSheet.Range("A:AZ").ClearContents

Set wdDoc = GetObject(wdFileName) 'open Word file

With wdDoc
    tableNo = wdDoc.tables.Count
    tableTot = wdDoc.tables.Count
    If tableNo = 0 Then
        MsgBox "This document contains no tables", _
        vbExclamation, "Import Word Table"
    ElseIf tableNo > 1 Then
        tableNo = InputBox("This Word document contains " & tableNo & " tables." & vbCrLf & _
        "Enter the table to start from", "Import Word Table", "1")
    End If

    resultRow = 4

    For tableStart = tableNo To tableTot
        With .tables(tableStart)
            'copy cell contents from Word table cells to Excel cells
            For iRow = 1 To .Rows.Count
                For iCol = 1 To .Columns.Count
                    Cells(resultRow, iCol) = WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
                Next iCol
                resultRow = resultRow + 1
            Next iRow
        End With
        resultRow = resultRow + 1
    Next tableStart
End With

End Sub

Нужно чтобы по очереди с КАЖДОГО файла ворд на НОВЫЙ лист копировались таблицы которые расположены в ексель.

В идеальном варианте происходит так

1) Создается новый лист в ексель

2) Выбор пользователем папки с расположениям ворд документов (они могут называться по разному по этому имена их нужно чтобы макрос взял из папки самостоятельно в массив для последующего открытия их по очереди)

3) Открытие первого ворд файла

4) Копирование таблиц

5) Вставка таблиц в ексель

6) Закрытие ворд

7) Создание нового листа

8) Открытие следующего файла ворд, и опять копируем вставляем в новый лист, и так до последнего файла формата .docx в выбранной папке

Спасибо!

 
Что именно с описанного алгоритма у Вас вызывает трудность?
 
Ivan.kh,Во первых не совсем получается загрузить список всех файлов ворд в массив для дальнейшей работы с ними
 
Kentavrik7, Вот пож. хорошая статься с примерами
Изменено: Ivan.kh - 28.03.2019 16:18:12
 
Ivan.kh,К сожалению там не написано как присвоить просмотренные значения массиву. Тут их можно просмотреть, но не внести в массив все имеющиеся docx файлы, это немного разные вещи(
Изменено: Kentavrik7 - 28.03.2019 16:30:11
 
Зачем их записывать в массив?
Вам же только данные из этих файлов нужны.
Вот циклом как там и указано проходитесь по файлам, открываете файл, считываете данные, по необходимости выгружаете данные на лис, закрываете файл и так со всеми в папке

Да и до этого Вы не упоминали о том, что Вам нужен зачем-то массив файлов...
 
Ivan.kh,Ну я думал что это так работает, что загружаешь в массив и только потом можно пройтись по всем файлам в папке, но видимо я ошибался :)
 
Если хотите в массив, то нет преград:
Код
Dim objFSO As Object, objFolder As Object, objFile As Object
 
Sub Get_All_File_from_SubFolders()
    Dim sFolder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    Application.ScreenUpdating = False
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    GetSubFolders sFolder
    Set objFolder = Nothing
    Set objFSO = Nothing
    Application.ScreenUpdating = True
End Sub
Private Sub GetSubFolders(sPath)
    Dim sPathSeparator As String, sObjName As String
    Set objFolder = objFSO.GetFolder(sPath)
    
    If objFolder.Files.Count > 0 Then
        ReDim arrDoc(1 To objFolder.Files.Count, 1 To 1)
        i = 1
        For Each objFile In objFolder.Files
            If Replace(objFile.Name, objFSO.GetBaseName(objFile), "") Like ".doc*" Then
                arrDoc(i, 1) = sPath & objFile.Name
                i = i + 1
            End If
        Next
    End If
End Sub
собственно с той же статьи, но чуть добавил
Изменено: Ivan.kh - 28.03.2019 16:50:06 (ошибка в коде)
 
Ivan.kh, а в чем великий смысл сей конструкции?
Код
Replace(objFile.Name, objFSO.GetBaseName(objFile), "")
 
RAN, спросите у Дмитрий(The_Prist) Щербаков, код с его сайта, о чем я в посте и указал. Я там только добавил запись в массив файлов ....
 
Виноват, ссылочку не поглядел
 
RAN, Я если честно, даже не обратил внимания на это, правил в блокноте, не задумываясь )))))
так конечно покороче будет If objFile.Name Like "*.doc*" Then, но может и в той записи есть сакральный смысл....
Изменено: Ivan.kh - 28.03.2019 16:59:13
 
Ivan.kh,Спасибо большое за помощь, а почему не получается выбрать файлы формата док, открывает как будто пустую папку(
 
Вы статью посмотрели?
Это диалог выбора папки, дальше все фойлы папки перебираются в цикле.
 
Ivan.kh,На операторе IF она выкидывает постоянно, какую папку бы не взял.
Блин ситуация банальная, не получается ее решить. Нужно всего лишь скопировать все таблицы в ексель с вордовских документов
Если убрать IF тогда проходит дальше, получается мы забили названиями массив. Теперь нужно открыть первый файл массива скопировать на страницу все таблицы, после этого создать еще лист, скопировать таблицы со второго файла и тд
Изменено: Kentavrik7 - 29.03.2019 12:04:39
 
Цитата
RAN написал:
в чем великий смысл сей конструкции?
великий смысл вести отбор исключительно по расширению. Бывают ситуации, когда ".doc" может встречаться и в названии файла, но расширение будет совсем не Word-ское. Например: "Mainreport.documents.txt". И раз средства позволяют отчехлить исключительно расширение - лучше воспользоваться.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Почему на if она закрывается постоянно
 
Kentavrik7, If objFolder.Files.Count > 0 Then - проверка на то пустая папка или нет. Если дальше не идет, то значит папка пустая

Цитата
Kentavrik7 написал: Блин ситуация банальная, не получается ее решить. Нужно всего лишь скопировать все таблицы в ексель с вордовских документов
я спросил, что конкретно у Вас не выходит, не с проста. В Вашем первом посте описано ТЗ, ни один из пунктов которого Вы не знаете как сделать. В таком случ.:
1. или в ветку работа,
2. или разбить на этапы и искать куски рабочего кода в интернете/спрашивать помощи тут.
3. или попытаться вникнуть в задачу и самостоятельно решить.

Есть вариант еще подождать, может у кого будет время посидеть и написать это, но это скорее всего маловероятно.
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
И раз средства позволяют отчехлить исключительно расширение - лучше воспользоваться.
Так меня и заинтересовало, почему не
Код
GetExtensionName(objFile)
Страницы: 1
Наверх