Попытка заполнить текстовое поле ActiveX в Word последним значением ячейки листа Excel - PullRequest
0 голосов
/ 13 февраля 2019

Я автоматически увеличиваю столбец A в таблице Excel следующим образом:

=IF(B3="","",A2+1)

Я делаю это так, чтобы при добавлении данных в столбец B идентификационный номер в столбце A увеличивался на 1.

В то же время у меня есть документ Word, к которому я добавил командную кнопку.Идея состоит в том, что пользователь нажимает командную кнопку, он заполняет столбцы с B по E данными из Word Doc, что приведет к увеличению значения A, затем я хочу взять значение A и вернуть его в текстовое поле ActiveX обратно.на слово док.У меня все работает, кроме передачи увеличенного ID # в столбце A обратно в документ Word.Вот что у меня так далеко.Первая функция находит последнюю строку для меня, чтобы заполнить данные из слова doc в таблицу Excel.Он отлично работает для этой цели, но использование противоположного способа не работает.Вторая функция - это то, что я использую, чтобы убедиться, что в обязательных полях есть фактические данные, поэтому я не пытаюсь записать пустые поля в электронную таблицу.

Function GetLastRow(ByVal col As String) As Long
   With Worksheets("Sheet1")
      GetLastRow = .Range(col & .Rows.Count).End(xlUp).Row + 1
   End With
End Function

Function RequiredField(strQuestion, strMessage)
    If strQuestion.Text = "" Then
        Do
            sInFld = InputBox(strMessage)
        Loop While sInFld = ""
            strQuestion.Text = sInFld
    End If
    'Required Field Prompt Function w/ input box

End Function

Private Sub RequestClaimNumber_Click()

    Dim wkbk As Workbook
    Dim doc As Object
    Dim app As Object
    Dim sdocname As String
    Dim LastRow As Long

    Set app = GetObject(, "Word.Application")
    sdocname = "J:\Correspondence\CAST Database\Word Docs\General Loss Form.docm"
    Set doc = ThisDocument
    Set wkbk = Workbooks.Open("J:\Accident Reports\98 Claims Register.xlsx")

    With wkbk.Sheets("Sheet1")
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
    End With
    Debug.Print LastRow

    RequiredField PolicyName, "Please insert a name for the Policy Holder in the 'Policy Holder Name' field."
    RequiredField InsuredName, "Please insert a name for the Contractor in the 'Insured Name' field."
    RequiredField DOL, "Please enter a Date of Loss for this incident."

    With wkbk.Sheets("Sheet1")
        rw = GetLastRow("B")
        .Range("B" & rw) = ThisDocument.ReportDate
        rw = GetLastRow("C")
        .Range("C" & rw) = ThisDocument.DOL
        rw = GetLastRow("D")
        .Range("D" & rw) = ThisDocument.PolicyName
        rw = GetLastRow("E")
        .Range("E" & rw) = ThisDocument.InsuredName
        With doc
            doc.FormFields("ClaimNumber").Result = .Range(LastRow).Value
        End With
    End With
    wkbk.Save
    wkbk.Close
    Set wkbk = Nothing

End Sub

Проблема, похоже, заключается в следующем:

LastRow = .Range("A" & .Rows.Count).End(xlUp).Row

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

«Подпись вне диапазона»

, и она выделяет эту строку;

doc.FormFields("ClaimNumber").Result = .Range(LastRow).Value

Я предполагаю, что онане находит фактическую последнюю использованную ячейку в столбце A. Она идет к самому низу A и ничего не находит.С этой целью я попробовал несколько способов найти последнюю ячейку, но все они дают мне один и тот же индекс ошибки вне диапазона, и все они возвращают значение 30687, когда я их отлаживаю.

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

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я понял это.Вот последний код, который работает.

Private Sub RequestClaimNumber_Click()

    Dim wkbk As Workbook
    Dim lastColumn As Long

    RequiredField PolicyName, "Please insert a name for the Policy Holder in the 'Policy Holder Name' field."
    RequiredField InsuredName, "Please insert a name for the Contractor in the 'Insured Name' field."
    RequiredField DOL, "Please enter a Date of Loss for this incident."

    Set wkbk = Workbooks.Open("J:\Accident Reports\98 Claims Register.xlsx")

    With wkbk.Sheets("Sheet1")
        lastColumn = .Range("B" & .Rows.Count).End(xlUp).Row
    End With

    With wkbk.Sheets("Sheet1")
        rw = GetLastRow("B")
        .Range("B" & rw) = ThisDocument.ReportDate
        rw = GetLastRow("C")
        .Range("C" & rw) = ThisDocument.DOL
        rw = GetLastRow("D")
        .Range("D" & rw) = ThisDocument.PolicyName
        rw = GetLastRow("E")
        .Range("E" & rw) = ThisDocument.InsuredName
        rw = GetLastRow("F")
        .Range("F" & rw) = ThisDocument.UserID
        ClaimNumber.Text = .Range("A" & lastColumn + 1).Text
    End With
    wkbk.Save
    wkbk.Close
    Set wkbk = Nothing

End Sub
0 голосов
/ 13 февраля 2019

Вы не указываете столбец, только строку, поэтому вам нужно сказать .Range("X" & LastRow).Value или .cells(lastrow,24)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...