Ошибка при передаче объекта книги в форму VBA - PullRequest
0 голосов
/ 11 октября 2018

Я работаю над сценарием VBA с Microsoft Word, который позволяет пользователю выбирать текст, который будет скопирован в буфер обмена, чтобы его можно было экспортировать в файл Excel.Пользователь сделает несколько выборов и, наконец, укажет, что он / она сделал, когда содержимое буфера обмена будет скопировано в файл шаблона Excel.

Форма (frmModeLessForInput) является немодальной формой.Форма имеет две кнопки «Продолжить» и «Готово».Пользователь может перемещаться по документу и размещать курсор в любом месте документа.Затем при нажатии кнопки «Продолжить» форма вызовет подпрограмму (Highlight_Sentence) для копирования выделенного текста в переменную «буфер обмена».Когда нажата кнопка «Готово», управление будет передано вызываемой подпрограмме, которая затем скопирует буфер обмена в файл Excel.

Проблема, с которой я столкнулся, заключается в том, что у меня нет правильного кода, необходимого для передачи книгиОбъект создается в ГЛАВНОМ МОДУЛЕ к форме с использованием свойства формы.Ниже приведен код.Я вставил комментарии в код в подпрограммах Select_Sentence_Form_Test и cmdDone, где у меня возникла проблема с передачей объекта рабочей книги.

Любая помощь в решении этих проблем приветствуется.Поскольку программирование на VBA для меня является побочным явлением, я все еще учусь.

Option Explicit
Public str_clipboard As String
Public txt_active_document As String
Public i_how_many_sentences As Integer
Public str_active_document
Public str_Excel_Filename As String
Public i_starting_row_ID As Integer
Public i_rows_of_data As Integer

ГЛАВНЫЙ МОДУЛЬ

Sub Master_Module_Test()
Dim oExcel As Object
Dim wb As Excel.Workbook 'Object
   Set oExcel = New Excel.Application
   str_Excel_Filename = "C:\Test\Excel_Template.xlsx"
   Documents.Open ("C:\Test\Doc_to_process.docx")
   oExcel.Workbooks.Open str_Excel_Filename
   i_how_many_sentences = 0
   i_starting_row_ID = 1
   Set wb = ActiveWorkbook
   Call Select_Sentence_Form_Test(wb)
End Sub

Sub Select_Sentence_Form_Test(wb_open As Workbook)
    Dim frm As frmModelessForInput
    Set frm = New frmModelessForInput
' At this point wb_open is instantiated, i.e. I get "Excel_Template.xlsx" for wb_open.name
' But this code gives me an error "Object or block not set".  If I leave this statement out then "Me.Book1.ActiveSheet.PasteSpecial..." in cmd_Done in the frmModelessForInput module gives the same error
    Set frmModelessForInput.Book1 = wb_open
    With frmModelessForInput
        .str_word_doc_filename = str_active_document
        .str_no_copied = "0"
        .Show False
    End With
    Set frm = Nothing
End Sub

Ниже приведен код для формы frmModelessForInput

Option Explicit
Private m_Book1 As Workbook


Public Property Get Book1() As Workbook
   Set Book1 = m_Book1
End Property

Public Property Set Book1(ByRef Value As Workbook)
   Set m_Book1 = Value
End Property

Private Sub UserForm_Activate()
    'Position the form near the top-left of the window
    'So that the user can work with the document
    Me.Top = Application.ActiveWindow.Top + 15
    Me.Left = Application.ActiveWindow.Left + 15
End Sub

Private Sub cmdContinue_Click()
 Dim str_clipboard, str_clipboard_line As String
       Call Highlight_Sentence(str_clipboard_line)
        i_how_many_sentences = i_how_many_sentences + 1 'Problem: VBA reports i_how_many_sentences as undefined even though it is a Public variable 
        frmModelessForInput.str_no_copied = i_how_many_sentences  'Same Problem
    str_clipboard = str_clipboard + str_clipboard_line 'Problem: each time I select a new text/sentence str_clipboard does not contain the contents of the previous selection
End Sub



Private Sub cmdCancel_Click()
    b_abort = True
Unload frmModelessForInput
End Sub

Private Sub cmdContinue_Click()
 Dim str_clipboard_line As String
 Dim i_row_number As Integer
 i_row_number = i_how_many_sentences + i_starting_row_ID
 i_how_many_sentences = i_how_many_sentences + 1
 Call Highlight_Sentence_Test(str_clipboard_line, i_row_number)
 frmModelessForInput.str_no_copied = i_how_many_sentences
 str_clipboard = str_clipboard + str_clipboard_line
End Sub

Private Sub cmdDone_Click()
 '  When the "Done" button is pressed the contents of the str_clipboard variable is copied to the Windows clipboard
    Dim str_filename As String
    str_filename = getName(str_Excel_Filename)
    MsgBox "I will now copy the data to the Excel file."
    Call SendToClipboard(str_clipboard) 'This sub puts the contents of str_clipboard into the Windows clipboard
    ' Uses the Book1 property --- this is the code line that produces the error "Object or block variable not set.  Activeworkbook.name shows that Excel_Template.xlsx is active
    Me.Book1.ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
    Unload frmModelessForInput
    MsgBox "Done pasting data to: " & getName(str_Excel_Filename)
End Sub




Private Sub Highlight_Sentence(clipboard As String, i_row_no As Integer)
    Dim txt_sentence, txt_page_no As String
    Dim txt_section_index As String
    With Selection
     ' Collapse current selection.
     .Collapse
     ' Expand selection to current sentence.
     .Expand Unit:=wdSentence
    End With
    clipboard = i_row_no & vbTab & txt_sentence & vbCrLf
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...