2015-06-12 29 views
7

Ho bisogno di salvare il testo formattato da Word in un database di Access.copia testo formattato in accesso utilizzando vba

Finora sono riuscito a capire come memorizzare il testo formattato in un campo di accesso (creare un campo Memo in una tabella e impostare il formato di testo come testo RTF). Ricerca SO Non ho ancora trovato una soluzione su come trasportare il testo da Word in Access.

So che è possibile, perché è possibile farlo semplicemente copiando e incollando le informazioni se lo si sta facendo manualmente.

La mia domanda, come posso copiare il testo formattato da una parola in un campo in una tabella utilizzando VBA?

Sperimentalmente ho creato quanto segue per testarlo. Finora senza successo ...

Sub GetComments() 
'Imports Analyst Comments from Excel files als OLE Objects. 
'--------------------------------- 

'Access Variables 
Dim dbsFundDB As DAO.Database 
Dim rsComments As DAO.Recordset 

Set dbsFundDB = CurrentDb 
Set rsComments = dbsFundDB.OpenRecordset("tblFunds") 

'Word Variables 
Dim doc    As Word.Application 
Dim dcmt   As Word.Document 
Dim sectn   As Word.Section 
Dim obCommentText As Object 
Dim sAnalystText As String 

'Open New Word File 
Set doc = New Word.Application 
doc.Visible = True 
Set dcmt = doc.Documents.Open(sPathTemplate) 
Set sectn = dcmt.Sections(1) 

sectn.Range.Select 
Selection.InsertFile FileName:="myfile.rtf", Range:="", _ 
    ConfirmConversions:=False, Link:=False, Attachment:=False 

sAnalystText = sectn.Range.Tables(1).cell(1, 1).Range.FormattedText 

rsComments.AddNew 
rsComments![Long Comment Exec] = sAnalystText 
rsComments.Update 

sectn.Range.Select 
dcmt.Close savechanges:=False 
doc.Quit 

End Sub 

UPDATE ho provato attuare la risposta di Matt Hall. Mentre il testo è infatti copiato nel database, non è ancora a mantenere la formattazione:

Qui è la mia realizzazione come un semplice test:

Option Explicit 
Public Const sPathTemplate As String = "W:\L\BDTP\Products\FundResearchTool\Advisory.docx" 
Option Compare Database 

Sub GetComments() 
'Imports Comments from word and save in DB 
'Test soubroutine 
'--------------------------------- 

'Word Variables 
Dim obCommentText As Variant 
Dim strSQL As String 

obCommentText = GetWordContent(sPathTemplate) 

strSQL = "insert into [tblText]([TestField]) values('" & obCommentText & "')" 

DoCmd.RunSQL strSQL 
MsgBox "Import Successful", vbInformation Or vbOKOnly 

End Sub 
Private Function GetWordContent(strFile As String) As Variant 

    ' This function takes the path obtained to the MS-Word Document selected in 
    ' the FileToOpen function and then uses that to open that MS-Word Document 
    ' and retrieve its text contents 

    Dim objDoc As Word.Document 

    Set objDoc = GetObject(strFile) 

    GetWordContent = CVar(objDoc.Sections(1).Range.Text) 

    objDoc.Close 

End Function 
+0

Io in realtà non hanno esperienza con quello che stai facendo . Tuttavia sono stato in grado di trovare questo post che sembra avere alcuni suggerimenti decenti: http://stackoverflow.com/questions/14316916/copy-text-from-table-in-word-and-retaing-formatting – Newd

risposta

5

Ecco un metodo che fa riferimento pesantemente this.

Prima di iniziare assicurarsi di aver questi (o equivalente è la tua versione di accesso) riferimenti spuntato in editor di VBA> Strumenti> Riferimenti:

Microsoft Word 15.0 Object Library

Microsoft Ufficio 15.0 Libreria oggetti

Supponendo di aver impostato un modulo con un pulsante di comando per attivare questa M import S-Word, mettere la seguente funzione e subroutine da qualche parte nel modulo che di modulo VBA:

1) File Selettore Funzione:

Questo vi permetterà di selezionare il documento MS-Word che si desidera utilizzare il vecchia finestra di dialogo file familiare che vedi in Windows. In definitiva, tutto ciò che fa è salvare il percorso del file e il nome del file che avete scelto per l'uso in nella subroutine descritto in (2) ...

Private Function FileToOpen() As String 

    ' This function will essentially allow you to browse to MS-Word document 
    ' and then store the path of that file for use in the GetWordContent function 

    Dim fDialog As Office.FileDialog 
    Dim varFile As Variant 

    Set fDialog = Application.FileDialog(msoFileDialogFilePicker) 

    With fDialog 

     .AllowMultiSelect = False 
     .Title = "Select Word document to import" 
     .Filters.Clear 
     .Filters.Add "Word files", "*.doc?" 

     If _ 
      .Show = True _ 
     Then 
      For Each varFile In .SelectedItems 

       FileToOpen = varFile 

      Next 

     Else 

      FileToOpen = "" 

     End If 

    End With 

End Function 

2) essere formattato dei contenuti del testo di MS- Sottoprogramma documento di Word:

Questa subroutine utilizzerà il percorso del file e il nome del documento MS-Word selezionato nella funzione Selezione file (sopra) per aprire il documento MS-Word, selezionare tutto il testo, copiarlo nel appunti, incollarlo in una casella di testo su un modulo aperto in Access e quindi chiudere MS-Word ...

Private Sub GetWordContent(strFile As String) 

    ' This function takes the path obtained to the MS-Word Document selected in 
    ' the FileToOpen function and then uses that to open that MS-Word Document 
    ' and retrieve its text contents and paste them in to WordDocData textbox on 
    ' the currently open form in Access 

    ' Create an MS-Word Object: 

    Dim objDoc As Object 
    Set objDoc = CreateObject("Word.Application") 

    ' Open the file selected in FileToOpen() and copy the contents to clipboard: 

    With objDoc 

     .Documents.Open strFile 
     .Visible = True 
     .Activate 
     .Selection.WholeStory 
     .Selection.Copy 

    End With 

    ' Set the focus to the WordDocData textbox on the Access Form and paste clipboard: 

    Me.WordDocData.SetFocus 
    DoCmd.RunCommand acCmdPaste 

    Me.WordDocDataSrc = strFile 

    ' Save record on the form: 

    If _ 
     Me.Dirty _ 
    Then 

     Me.Dirty = False 

    End If 

    ' A bit hacky this bit. When you close MS-Word after copying a lot of data, 
    ' you might get a message asking you if you if you want to keep the last item 
    ' you copied. This essentially overwrites the clipboard that currently has 
    ' the whole document stored, to just the first 5 characters, which should allow 
    ' MS-Word to be closed here without a pop-up message to deal with: 

    With objDoc 

     .Selection.HomeKey Unit:=wdLine 
     .Selection.MoveRight Unit:=wdCharacter, Count:=5, Extend:=wdExtend 
     .Selection.Copy 
     .Documents.Close 
     .Quit 

    End With 

    Set objDoc = Nothing 

End Sub 

del tuo pulsante di comando clic evento:

Questa subroutine dovrebbe essere eseguito da clic evento del pulsante di comando. In sostanza chiama la funzione FileToOpen e la subroutine GetWordContent per consentire all'utente di selezionare un documento MS-Word e quindi lasciare che VBA copi e copi il testo formattato dal documento MS-Word in una casella di testo memo rich text nel modulo aperto in Accesso.

Si noti che questa subroutine fa alcune ipotesi e fa riferimento ai nomi di controlli/tabelle/campi e quant'altro non sia stato già impostato. Queste ipotesi sono:

  1. pulsante di comando del form è chiamato cmdGetWordData
  2. il database di Access ha una tabella chiamata tblWordDump
  3. Il modulo è legato al tavolo tblWordDump
  4. tblWordDump ha 2 campi di testo memo chiamati WordDocDataSrc e WordDocData per memorizzare l'importazione Ed file di percorso/nome e il contenuto del testo, rispettivamente ed entrambi vengono aggiunti al form
Private Sub cmdGetWordData_Click() 

    ' This subroutine runs on your command button; it will call both the FileToOpen function and GetWordContent subroutine 
    ' to retrieve the text contents of your chosen MS-Word Document. 
    ' It will then store both the path the text contents of of your chosen MS-Word Document in 2 fields in a table in Access. 

    ' NOTE: this code assumes that your Access database has: 
    ' - a table called tblWordDump 
    ' - a memo text field in this table called WordDocDataSrc to store the path of MS-Word file imported 
    ' - a memo text field in this table called WordDocData with the TextFormat property set to "Rich Text", 
    ' which will store the text and text formating of the MS-Word file imported 

    Dim strFile As String 
    Dim strWordContent As Variant 

    ' Select file via File Dialogue 

    strFile = FileToOpen 

    ' Conditionals when a file was or wasn't selected 

    If _ 
     Len(strFile) > 0 _ 
    Then 

     DoCmd.GoToRecord , , acNewRec 

     GetWordContent strFile 

     MsgBox "Import Successful", vbInformation Or vbOKOnly 

    Else 

     MsgBox "No File Selected", vbExclamation Or vbOKOnly 

    End If 

End Sub 

Here's an example Access file di questo per voi a frugare in.

+0

Grazie mille per la tua risposta! Ho tentato di implementare in un ambiente di test che rispecchia il progetto attuale. Vedi il mio aggiornamento sopra. Il codice prende il testo, ma non mantiene la formattazione. Sto trascurando qualcosa nella mia implementazione? Non ho potuto accedere al tuo esempio in quanto il firewall aziendale non mi consente di scaricare da gdrive. – rohrl77

+0

Che tipo di formattazione speravi di mantenere? Riesco a vedere che i ritorni a capo e le nuove linee non vengono mantenute, quindi vedrò se c'è un modo per mantenerle .. c'era qualche altro tipo di formattazione che stavi cercando di mantenere? –

+0

Ho bisogno di caratteri in grassetto, ritorni a capo e punti elenco. Al momento il codice sembra fondamentalmente solo portare un testo normale. Quale tipo di formattazione tiene per te? – rohrl77