Получить данные из текстового поля в Word-UserForm

У меня есть документ Word на основе шаблона для счетов и база данных в Excel, содержащая две таблицы: Company и Person.

Я хочу поместить некоторую строку в текстовое поле в пользовательской форме в Word, которая затем будет искаться в Excel. Excel должен возвращать значения в MultiColumn-Listbox, расположенный в другой пользовательской форме (эта пользовательская форма будет отображаться только в том случае, если для искомой строки имеется более 1 результата).

Это код, который у меня есть в Word для запуска макроса, который фактически запускается:

CSearchText = UFCompanySearch.tbSearchCompany.Value 'Textbox -> Search-String

xlWB.Application.Run("SearchCompany")

Это работает только тогда, когда SearchCompany является подпрограммой или функцией без дополнительных спецификаций, поэтому

Function SearchCompany(SearchText As String)

не работает, так как я не могу запустить макрос следующим образом:

xlWB.Application.Run("SearchCompany("SomeCompany")") 'NOTE!

ПРИМЕЧАНИЕ. Это НЕ будет работать!

Чтобы заполнить Listbox в UserForm, я думаю, есть возможность заполнить его таблицей Excel, так что это должно как-то сработать.

Это проблема:

Я не могу ссылаться на Search-TextBox в пользовательской форме, которая находится в слове «Документ», как ни на «Doc!» ни "Док." работает. Вот так я не могу искать в ячейках строку. Это код, который я должен найти в ячейках, содержащих строку:

IF (InStr(xlComp.Cells(Row, 1), CSearchText) > 0) Or _
    (InStr(xlComp.Cells(Row, 2), CSearchText) > 0) Or _
    (InStr(xlComp.Cells(Row, 3), CSearchText) > 0) Then

Это ищет столбцы A-C для введенной строки. (Код, который я где-то нашел... Я слишком много искал, чтобы узнать, откуда ^.^)

Есть ли способ обратиться к пользовательской форме в Word или обходной путь, чтобы получить «SearchText» из пользовательской формы в Excel?

Я новичок в VBA, поэтому чем подробнее ваш ответ, тем больше вероятность, что я его пойму.


person Kathara    schedule 12.01.2016    source источник


Ответы (1)


Поскольку я не нашел способа сделать это напрямую, я нашел обходной путь при попытке:

Код в Ворде:

Private Sub cbFirmaSearch_Click()

    ActiveDocument.FormFields("FSearchText").Result = UFFirmaSearch.txtFirmaSuchen.Value

    xlWB.Application.Run "SearchFirma"

    ActiveDocument.FormFields("FSearchText").Delete

    Dim DFLastRow  As Integer
    DFLastRow = xlWB.Sheets("DataFirma").Cells(xlWB.Sheets("DataFirma").Rows.Count, "a").End(xlUp).Row

    Dim lbFirmTar As ListBox
    Set lbFirmTar = UFFirmaSearchList.lbFirmaSearchList

    Dim Row As Integer
    For Row = 2 To DFLastRow
        With lbFirmTar
            Dim ListIndex As Integer
            ListIndex = UFFirmaSearchList.lbFirmaSearchList.ListCount
            .AddItem xlWB.Sheets("DataFirma").Cells(Row, 1).Value, ListIndex
            .List(ListIndex, 1) = xlWB.Sheets("DataFirma").Cells(Row, 2).Value
            .List(ListIndex, 2) = xlWB.Sheets("DataFirma").Cells(Row, 3).Value
            .List(ListIndex, 3) = xlWB.Sheets("DataFirma").Cells(Row, 4).Value
            .List(ListIndex, 4) = xlWB.Sheets("DataFirma").Cells(Row, 5).Value
            .List(ListIndex, 5) = xlWB.Sheets("DataFirma").Cells(Row, 6).Value
            .List(ListIndex, 6) = xlWB.Sheets("DataFirma").Cells(Row, 7).Value
        End With
    Next Row

    With UFFirmaSearchList
        If (.lbFirmaSearchList.ListCount > 1) Then
            UFFirmaSearch.Hide
            .Show
        ElseIf (.lbFirmaSearchList.ListCount = 1) Then
            FirmaID = .lbFirmaSearchList.List(0, 0)
            FirmaZusatz = .lbFirmaSearchList.List(0, 1)
            FirmaName = .lbFirmaSearchList.List(0, 2)
            FirmaAbteilung = .lbFirmaSearchList.List(0, 3)
            FirmaAdresse = .lbFirmaSearchList.List(0, 4)
            FirmaPLZ = .lbFirmaSearchList.List(0, 5)
            FirmaOrt = .lbFirmaSearchList.List(0, 6)
            UFFirmaSearch.lblfrFirmenangaben = "Firma ID : " & FirmaID & _
                                                "Firmenzusatz : " & FirmaZusatz & _
                                                "Name : " & FirmaName & _
                                                "Firmenabteilung : " & FirmaAbteilung & _
                                                "Adresse : " & FirmaAdresse & _
                                                "PLZ / Ort : " & FirmaPLZ & " " & FirmaOrt
        Else
            MsgBox "No Entry found.", vbOKOnly
        End If
    End With
    UFFirmaSearch.txtFirmaSuchen.SetFocus
End Sub

Код в Экселе:

Sub SearchFirma()

    Dim Doc As Word.Document
    Set Doc = ActiveDocument

    Dim xlFirm As Worksheet
    Set xlFirm = ActiveWorkbook.Sheets("Firma")

    Dim LastRow As Integer 'Last row on sheet "Firma" containing values
    LastRow = xlFirm.Cells(xlFirm.Rows.Count, "a").End(xlUp).Row

    Dim xlDatFirm As Worksheet
    Set xlDatFirm = ActiveWorkbook.Sheets("DataFirma")

    Dim FSearchText As String
    FSearchText = Doc.FormFields("FSearchText").Result

    For Row = 2 To LastRow
        Dim DFNewRow As Integer  'Next free line on sheet "DataFirma"
        DFNewRow = xlDatFirm.Cells(xlDatFirm.Rows.Count, "A").End(xlUp).Row + 1
        If (InStr(1, xlFirm.Cells(Row, 1), FSearchText, vbTextCompare) > 0) Or (InStr(1, xlFirm.Cells(Row, 2), FSearchText, vbTextCompare) > 0) Or (InStr(1, xlFirm.Cells(Row, 3).Value, FSearchText, vbTextCompare) > 0) Or (InStr(1, xlFirm.Cells(Row, 4).Value, FSearchText, vbTextCompare) > 0) Then
            xlDatFirm.Range("A" & DFNewRow).Value = xlFirm.Cells(Row, 1).Value
            xlDatFirm.Range("B" & DFNewRow).Value = xlFirm.Cells(Row, 2).Value
            xlDatFirm.Range("C" & DFNewRow).Value = xlFirm.Cells(Row, 3).Value
            xlDatFirm.Range("D" & DFNewRow).Value = xlFirm.Cells(Row, 4).Value
            xlDatFirm.Range("E" & DFNewRow).Value = xlFirm.Cells(Row, 5).Value
            xlDatFirm.Range("F" & DFNewRow).Value = xlFirm.Cells(Row, 6).Value
            xlDatFirm.Range("G" & DFNewRow).Value = xlFirm.Cells(Row, 7).Value
        End If
    Next Row
End Sub

Как-то это работает. Когда я впервые попробовал «Dim xlWB As Excel.Workbook» в Word, я всегда получал ошибку времени выполнения. Когда я попробовал «Dim Doc As Word.Document» в Excel, я никогда не получал ошибок ... очень странно, но все же каким-то образом мне удалось покончить с этим.

Если у вас есть какие-либо вопросы по этому поводу, я буду рад помочь, и если есть вещи, которые я могу переписать в лучшую сторону, пожалуйста, не стесняйтесь комментировать.

Спасибо за поддержку :)

person Kathara    schedule 19.01.2016