varias una pasar para nombre mostrar macro imprimir hojas hoja guardar formulario extraer exportar datos como celda carpeta boton archivo vba pdf ms-word

vba - una - macro para imprimir en pdf



Pasa el cursor por los archivos PDF y transfórmalos en un documento con la palabra (2)

Como otros han declarado, el problema parece residir principalmente en la ruta y el nombre del archivo. Aquí está la segunda versión del código que publicó con algunos cambios.

Lamentablemente, aparece un mensaje de advertencia y al configurar DisplayAlerts en falso no lo suprime. Pero si hace clic en la casilla de verificación "No mostrar este mensaje nuevamente" la primera vez que aparece, no continuará apareciendo para cada archivo.

Sub convertToWord() Dim MyObj As Object Dim MySource As Object Dim file As String Dim path As String path = "C:/Users/username/work_dir_example/" file = Dir(path & "*.pdf") Do While (file <> "") Documents.Open FileName:=path & file With ActiveDocument .SaveAs2 FileName:=Replace(path & file, ".pdf", ".docx"), _ FileFormat:=wdFormatXMLDocument .Close End With file = Dir Loop End Sub

Estoy tratando de usar la codificación VBA, que soy bastante nuevo, para obtener una serie de documentos .doc de archivos PDF (que no son imágenes), es decir, estoy intentando recorrer varios archivos PDF y guardarlos en MS Word formato. Mi experiencia es que la palabra lee bastante bien los documentos PDF que tengo: la palabra mantiene el diseño correcto del archivo PDF la mayor parte del tiempo. No estoy seguro de si esta es la opción correcta para abordar esto y pido una sugerencia alternativa, utilizando R, si es posible.

De todos modos, aquí está el código que encontré aquí :

Sub convertToWord() Dim MyObj As Object, MySource As Object, file As Variant file = Dir("C:/Users/username/work_dir_example" & "*.pdf") ''pdf path Do While (file <> "") ChangeFileOpenDirectory "C:/Users/username/work_dir_example" Documents.Open Filename:=file, ConfirmConversions:=False, ReadOnly:= _ False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ Format:=wdOpenFormatAuto, XMLTransform:="" ChangeFileOpenDirectory "C:/Users/username/work_dir_example" ActiveDocument.SaveAs2 Filename:=Replace(file, ".pdf", ".docx"), FileFormat:=wdFormatXMLDocument _ , LockComments:=False, Password:="", AddToRecentFiles:=True, _ WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ False, CompatibilityMode:=15 ActiveDocument.Close file = Dir Loop End Sub

Después de pegarlo en la ventana del desarrollador, guardo el código en un módulo -> cierro la ventana del desarrollador -> hago clic en el botón "Macros" -> ejecuto la macro "convertToWord". Aparece el siguiente error en un cuadro emergente: "Sub o Función no definida". ¿Cómo puedo solucionar esto? Además, anteriormente, por algún motivo que ahora no me queda claro, recibí un error relacionado con la función ChangeFileOpenDirectory , que tampoco parecía estar definida.

Actualización 27/08/2017

Cambié el código a lo siguiente:

Sub convertToWord() Dim MyObj As Object, MySource As Object, file As Variant file = Dir("C:/Users/username/work_dir_example" & "*.pdf") ChDir "C:/Users/username/work_dir_example" Do While (file <> "") Documents.Open Filename:=file, ConfirmConversions:=False, ReadOnly:= _ False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ Format:=wdOpenFormatAuto, XMLTransform:="" ActiveDocument.SaveAs2 Filename:=Replace(file, ".pdf", ".docx"), FileFormat:=wdFormatXMLDocument _ , LockComments:=False, Password:="", AddToRecentFiles:=True, _ WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ False, CompatibilityMode:=15 ActiveDocument.Close file = Dir Loop End Sub

Ahora no recibo ningún mensaje de error en un cuadro emergente, pero no hay ningún resultado en mi directorio de trabajo. ¿Qué podría estar mal con eso ahora?


Cualquier lenguaje que pueda leer archivos PDF y escribir documentos de Word (que son XML) puede hacer esto, pero la conversión que desee (que Word hace cuando se abre el PDF) requerirá el uso de una API para la aplicación en sí. VBA es su opción fácil.

Los fragmentos que ha publicado (y mis muestras a continuación) usan constantes de enumeración y de enlace temprano, lo que significa que necesitamos una referencia a la biblioteca de objetos de Word. Eso ya está configurado para cualquier código que escriba en un documento de Word, así que cree un nuevo documento de Word y agregue el código en un módulo estándar. (Consulte este tutorial de Excel si necesita más detalles, los pasos para nuestro proceso son los mismos).

Puede ejecutar su macro desde el Editor de VB (utilizando el botón Ejecutar) o desde la ventana del documento normal (haga clic en el botón Macros en la pestaña Vista en Word 2010-2016). Guarde su documento como un archivo DOCM si desea reutilizar la macro sin configurar el código nuevamente.

¡Ahora para el código!

Como se indica en los comentarios, su segundo fragmento es válido si solo se asegura de que las rutas de su carpeta finalicen con un carácter "/" de barra invertida. Todavía no es un gran código después de corregirlo, pero eso lo pondrá en marcha.

Asumiré que desea hacer un esfuerzo adicional y tener una versión bien escrita de esto que podría reutilizar o ampliar más adelante. Para simplificar, utilizaremos dos procedimientos: la conversión principal y un procedimiento para suprimir el cuadro de diálogo de advertencia de conversión de PDF (controlado por el registro).

Procedimiento principal:

Sub ConvertPDFsToWord2() Dim path As String ''Manually edit path in the next line before running path = "C:/users/username/work_dir_example/" Dim file As String Dim doc As Word.Document Dim regValPDF As Integer Dim originalAlertLevel As WdAlertLevel ''Generate string for getting all PDFs with Dir command ''Check for terminal / If Right(path, 1) <> "/" Then path = path & "/" ''Append file type with wildcard file = path & "*.pdf" ''Get path for first PDF (blank string if no PDFs exist) file = Dir(file) originalAlertLevel = Application.DisplayAlerts Application.DisplayAlerts = wdAlertsNone If file <> "" Then regValPDF = TogglePDFWarning(1) Do While file <> "" ''Open method will automatically convert PDF for editing Set doc = Documents.Open(path & file, False) ''Save and close document doc.SaveAs2 path & Replace(file, ".pdf", ".docx"), _ fileformat:=wdFormatDocumentDefault doc.Close False ''Get path for next PDF (blank string if no PDFs remain) file = Dir Loop CleanUp: On Error Resume Next ''Ignore errors during cleanup doc.Close False ''Restore registry value, if necessary If regValPDF <> 1 Then TogglePDFWarning regValPDF Application.DisplayAlerts = originalAlertLevel End Sub

Función de configuración del registro:

Private Function TogglePDFWarning(newVal As Integer) As Integer ''This function reads and writes the registry value that controls ''the dialog displayed when Word opens (and converts) a PDF file Dim wShell As Object Dim regKey As String Dim regVal As Variant ''setup shell object and string for key Set wShell = CreateObject("WScript.Shell") regKey = "HKCU/SOFTWARE/Microsoft/Office/" & _ Application.Version & "/Word/Options/" ''Get existing registry value, if any On Error Resume Next ''Ignore error if reg value does not exist regVal = wShell.RegRead(regKey & "DisableConvertPdfWarning") On Error GoTo 0 ''Break on errors after this point wShell.regwrite regKey & "DisableConvertPdfWarning", newVal, "REG_DWORD" ''Return original setting / registry value (0 if omitted) If Err.Number <> 0 Or regVal = 0 Then TogglePDFWarning = 0 Else TogglePDFWarning = 1 End If End Function