Я работаю над сценарием 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