Экспорт данных из таблицы Access в таблицу Word

У меня есть данные Access, которые я пытаюсь экспортировать в таблицу Word. В таблице 3 столбца, первая строка и первый столбец — все заголовки.

Я пытаюсь просмотреть набор записей и заполнить столбцы 2 и 3 данными. Я могу начать со строки 2 и заполнить столбцы 2 и 3, но не могу понять, как перейти к следующей строке.

 iTbl = 1
 irow = 2
 iCol = 1

 Do Until recSet2.EOF
    If irow > wDoc.Tables(iTbl).Rows.Count Then
        wDoc.Tables(iTbl).Rows.Add
    End If

    For Each fld In recSet2.Fields
        On Error Resume Next
        iCol = iCol + 1
        wDoc.Tables(iTbl).Cell(irow, iCol).Range.Text = Nz(fld.Value)
    Next fld
    recSet2.MoveNext
    irow = irow + 1
    iCol = 1
 Loop

person Russtopher    schedule 14.07.2018    source источник
comment
Пожалуйста, предоставьте полный соответствующий код - в конце есть Loop без Do While. -- Правильный отступ также поможет вам увидеть, что происходит.   -  person Andre    schedule 14.07.2018
comment
Я отредактировал исходный пост @Andre   -  person Russtopher    schedule 15.07.2018
comment
Я бы посоветовал сначала объявить все ваши переменные (возможно, добавить Option Explicit в начало модуля), а также избавиться от On Error Resume Next — указание VBA игнорировать ошибки — не лучший способ найти источник проблемы. Также я считаю, что вам понадобится .MoveFirst, прежде чем вы сможете использовать .MoveNext, вы можете найти эти команды в Google, и есть сотни примеров для разных ситуаций.   -  person ashleedawg    schedule 15.07.2018
comment
Я не вижу явных проблем с вашим кодом. Как написал ashleedawg, удалите On Error Resume Next. Если это не поможет, добавьте к своему вопросу: что именно не так?   -  person Andre    schedule 15.07.2018
comment
Пожалуйста, добавьте первые 3 или 4 строки ввода, а также покажите результат, который вы получаете. И сообщите нам, чего не хватает или как должен выглядеть вывод.   -  person donPablo    schedule 15.07.2018


Ответы (2)


Лучший способ создать таблицу в Word, особенно с большим количеством данных, — сначала записать данные в формате строки с разделителями-символами. Назначьте строку диапазону в Word, затем используйте метод ConvertToTable, чтобы превратить ее в таблицу. Это избавит от многих проблем с манипулированием объектной моделью и является наиболее эффективным подходом (самым быстрым в выполнении).

Следующий код демонстрирует этот принцип. Процедура Test создает новый экземпляр Word, создает новый документ в приложении Word, затем присваивает строку с разделителями символов содержимому документа. Затем это превращается в таблицу. Если вам нужно отформатировать эту таблицу, используйте для этого объект tbl. Способ написания этого кода требует ссылки на библиотеку объектов Word (раннее связывание). Обратите внимание, что также можно использовать позднее связывание — для этого вы найдете множество примеров.

Вторая процедура, concatData, вызывается в Test для создания строки с разделителями символов. Он использует символ Tab в качестве разделителя полей и возврат каретки в качестве разделителя записей. Word примет почти все в качестве разделителя полей; разделителем записей должен быть возврат каретки (ANSI 13).

Sub Test()
    Dim wd As Word.Application
    Dim doc As Word.Document
    Dim rng As Word.Range
    Dim tbl As Word.Table

    Set wd = New Word.Application
    wd.Visible = True
    Set doc = wd.Documents.Add
    Set rng = doc.Content
    rng.Text = concatData()
    Set tbl = rng.ConvertToTable       
End Sub

Public Function concatData() As String
    Dim retVal As String
    Dim rsHeader As Long, rsCounter As Long        
    Dim rs As Recordset

    Set rs = CurrentDb.OpenRecordset("nameOfRecordset", dbOpenDynaset)
    'Get headers
    For rsHeader = 0 To rs.Fields.Count - 1
        retVal = retVal & rs.Fields(rsHeader).Name & vbTab
    Next
    'Replace last TAb with a carriage return
    retVal = Left(retVal, Len(retVal) - 1) & vbCr

    Do While Not rs.EOF
       'Get all records
        For rsCounter = 0 To rs.Fields.Count - 1
            retVal = retVal & rs.Fields(rsCounter).Value & vbTab
        Next
        retVal = Left(retVal, Len(retVal) - 1) & vbCr
        rs.MoveNext
    Loop
    concatData = retVal
End Function
person Cindy Meister    schedule 16.07.2018

Спасибо за всю помощь, ребята. Мне удалось понять это и работает очень хорошо. Он не переходил к следующей строке и пытался записать данные в несуществующий столбец (4), а затем выдавал ошибку. Вот код, который я использовал:

iTbl = 1
iRow = 2
iCol = 1

For Each fld In recSet2.Fields
iCol = iCol + 1
    If iCol < 4 Then
        wDoc.Tables(iTbl).Cell(iRow, iCol).Range.Text = Nz(fld.value)
    Else
        If iCol > 3 Then
            iCol = iCol - 2
            iRow = iRow + 1
            wDoc.Tables(iTbl).Cell(iRow, iCol).Range.Text = Nz(fld.value)
        End If
    End If
Next fld
person Russtopher    schedule 16.07.2018