Saltar al contenido

Ayuda!! Guardar un archivo word desde macro


Recommended Posts

Hola, soy Andrea y este año he aprendido un poco de vba, he avanzado bastante sin embargo hoy me encuentro algo detenida por un error que me genera la macros que he hecho.. he indagado en varios sitios y no he encontrado solución al error, he implementado 2 formas y no he conseguido nada.

La macro se trata de reemplazar datos que están definidos en otra hoja y se reemplazan en un plantilla word, hasta ahí todo bien.. pero es necesario que sea lo mas automatizado posible por ende intento que se guarde en una carpeta especifica, y bueno se guardan pero al intentar abrir el archivo da error, se pega el notebook, todo deja de funcionar.. aveces me da el  error 5174 ( Archivo no encontrado o borrado) cosa que no es así.. de verdad me es muy importante encontrar solución para guardar los archivos y luego poder abrirlos, ya que luego de crearlos se linkean con otros archivos word y hacen un archivo final.  Pero no puedo terminar el producto final por  así  decirlo ya que al ejecutar desde excel se bloquean y dan errores. 

 

La macro que he usado es esta:

 

Sub AWord()

On Error Resume Next

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim Titulo As String
Dim ruta As String
Dim nombre As String

ruta = ThisWorkbook.Path

'Ubicacion y nombre de la plantilla


'La ubicación está dada por la concatenación de los datos de dos celdas + la extensión del archivo de plantillas de Word.
wArch = Sheets("Rutas").Range("C5").Text

direc = Sheets("Rutas").Range("C3").Text

nombre = " OPP-" & Hoja1.Range(" C11 ") & " " & Hoja1.Range(" C7 ")
'Con la variable siguiente definimos que vamos a trabajar con un documento de Word.

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
'Creamos un documento nuevo con la plantilla

objWord.Documents.Add Template:=wArch, NewTemplate:=False, DocumentType:=0

'Utilizamos For para recorrer todas las variables de 1 al dato de la celda C1.
For i = 1 To Hoja3.Range("C1").Value 'celda dónde está la cuenta
datos = Hoja3.Range("B" & i).Text 'dónde están los datos
reemp = Hoja3.Range("A" & i).Text 'dónde están las etiquetas

     'utilizamos buscar y reemplazar de word
     With objWord.Selection.Find
            .Text = datos 'busca el texto de datos
            .Replacement.Text = reemp 'reemplaza por el texto
            .Execute Replace:=2 'la variable en dos es para reemplazar todos los valores
     End With

Next i
 objWord.Activate 'Activa el documento de word
 

    ChangeFileOpenDirectory direc
    'Donde se guardara el archivo word   
    
    ActiveDocument.SaveAs2 Filename:=nombre & ".docx", FileFormat:= _
        wdFormatXMLDocumentMacroEnabled, LockComments:=False, Password:="", _
        AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
        EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
        :=False, SaveAsAOCELetter:=False, CompatibilityMode:=15


Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub


  image.thumb.png.d4fdaa1255cb8ca649ca2034bef5e609.png

Enlace a comentario
Compartir con otras webs

Hola

Es una mala costumbre el uso de On Error Resume Next a menos que sea estrictamente necesario, y en tu caso no lo es. Borra dicha línea. Después de borrarla notarás algunos errores que debes corregir. Te adelanto que esta línea, tal cual la tienes, no está haciendo nada:

ChangeFileOpenDirectory direc

Esto de aquí:

FileFormat:= _
        wdFormatXMLDocumentMacroEnabled

Cámbialo por esto:

FileFormat:= _
        wdFormatDocumentDefault

Ojo, no he revisado el detalle de tus variables con las que intentas crear la ruta, pero dado lo que comentas, asumo que son correctas.

Ah ¿Por qué colocas esto?

CompatibilityMode:=15

Comentas.

Enlace a comentario
Compartir con otras webs

Hola gracias por responder! 

Mira realice los cambios sugeridos y la macro funciona  al 100% en la segunda compilación... te explico, cuando ejecuto la macro me expulsa el archivo w ord pero sin nombre y no lo guarda donde necesito y en el excel sale error 462

image.png.3b3d1c8eece16691e5c6b7e65d82c556.png

 

image.thumb.png.710f8f8407e4e75e84d3c421b6ef9c9d.png

 

Luego vuelvo a ejecutar la macro y funciona, me guarda el archivo word con el nombre establecido y donde yo indique. Sin embargo, cuando modifico cualquier casilla  de la  hoja inicio que altere en algo el archivo word y vuelvo a ejecutar nuevamente da error, debo cancelar la macro vuelvo a ejecutar y funciona nuevamente como debiese .

 

 

Disculpa que te pregunte por esto, pero he estado aprendiendo VBA por mi cuenta este año y aun me falta mucho por aprender.. si me pudieras ayudar con este nuevo error lo agradecería,  en resumen: ejecuta la macro modificada y expulsa el archivo sin nombre y sin guardar y al mismo tiempo da el error 462

Error 462  en tiempo de ejecución:
El equipo servidor remoto no existe o no está disponible

Finalizo la macro y ejecuto nuevamente, pero esta vez si guarda y coloca el nombre correspondiente. Si cambio cualquier casillla de la hoja inicio vuelve a dar error al expulsar el word y a las 2da vez funciona. 

 

Te agradecería mucho tu ayuda!!!

Esta es la nueva macro que utilice:

 

Sub AWord()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim Titulo As String
Dim ruta As String
Dim nombre As String

Call EliminarOferta

ruta = ThisWorkbook.Path

'Ubicacion y nombre de la plantilla
'La ubicación está dada por la concatenación de los datos de dos celdas + la extensión del archivo de plantillas de Word.
wArch = Sheets("Rutas").Range("C5").Text

direc = Sheets("Rutas").Range("C3").Text

nombre = " OPP-" & Hoja1.Range(" C11 ") & " " & Hoja1.Range(" C7 ")
'Con la variable siguiente definimos que vamos a trabajar con un documento de Word.

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
'Creamos un documento nuevo con la plantilla

objWord.Documents.Add Template:=wArch, NewTemplate:=False, DocumentType:=0

'Utilizamos For para recorrer todas las variables de 1 al dato de la celda C1.
For i = 1 To Hoja3.Range("C1").Value 'celda dónde está la cuenta
datos = Hoja3.Range("B" & i).Text 'dónde están los datos
reemp = Hoja3.Range("A" & i).Text 'dónde están las etiquetas

     'utilizamos buscar y reemplazar de word
     With objWord.Selection.Find
            .Text = datos 'busca el texto de datos
            .Replacement.Text = reemp 'reemplaza por el texto
            .Execute Replace:=2 'la variable en dos es para reemplazar todos los valores
     End With

Next i
 objWord.Activate 'Activa el documento de word
    

    ActiveDocument.SaveAs2 Filename:=direc & "\" & nombre & ".docx", _
    FileFormat:=wdFormatDocumentDefault
      
Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
 

image.png

 

Enlace a comentario
Compartir con otras webs

Hola, funciona la macro con esas ultimas ediciones que me recomendaste y  lo coloque en la macro de tablas que tengo y me  expulsa  los archivos word con las tablas, pero me da error, esta es la macro de las tablas: 

Cita

 

Sub TablaConfig2()

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Sheets("ConfigX (1)").Select

If ActiveSheet.Name = "ConfigX (1)" Then


Dim WordApp As Object
Dim ruta, nombre, direc As String
Dim b, mc As String

Set WordApp = CreateObject("Word.Application")


ruta = ThisWorkbook.Sheets("Rutas").Range("C6").Text
direc = ThisWorkbook.Sheets("Rutas").Range("C6").Text
nombre = "ConfigX (1)"


b = Sheets("ConfigX (1)").Select

mc = Sheets("ConfigX (1)").UsedRange.Address(False, False)
Range(mc).Select


   Debug.Print mc

'Formatos 

Sheets("ConfigX (1)").Select

    Columns("A:A").ColumnWidth = 10
    Columns("B:B").ColumnWidth = 28
    Columns("C:C").ColumnWidth = 4
    Columns("D:D").ColumnWidth = 30
    
    
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
    End With
    
    Range(mc).Select
    
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    
  With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With

'Formatos 

   
Sheets("ConfigX (1)").Range(mc).Copy

With WordApp
'Con este codigo se abrira Word y se creara un documento nuevo
.Visible = True
.Activate
.Documents.Add
End With


 
WordApp.Selection.PasteSpecial Link:=True
 

  
   WordApp.ActiveDocument.SaveAs2 Filename:=direc & "\" & nombre & ".docx", FileFormat:=wdFormatDocumentDefault
 

Else
End If
 

 End Sub 

 

Cuando intento colocar  en la linea

.Visible = False

me da este error

image.png.14a01c2695092d055f3a062de5f8b681.png

Y ademas cuando abro el archivo cuando lo vuelvo a colocar la linea

.Visible = True

 Todos los archivos quedan automáticamente en MODO LECTURA y no me deja abrirlos, la idea es que no queden protegidos para abrirse con facilidad y editar si es necesario, a estos archivos expulsados por el excel NO se le puede quitar la protección... 

 

Es 2da vez que me sucede esto y no se porque se guardan de ese modo! Por favor ayuda! Se los agradezco mucho!

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 96 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hi Trate de ver que hacían las fórmulas en cuestión pero a su libro le falta o le faltan hojas, por lo que solo podría participar con un par de ideas en general. Lo que entiendo es que según el valor de B3 en C3 debe poner una fórmula u otra, así que es posible que si combina DIRECCION() con INDIRECTO() pueda intercambiar de una fórmula a otra. =SI(B3="Xl",INDIRECTO(DIRECCION(3,5)),SI(O(B3=1,B3=2,B3=3),INDIRECTO(DIRECCION(4,5)),"")) Otra forma sería poner nombre a esas fórmulas en el cuadro de nombres para que las pueda mandar llamar a una o a la otra según el resultado de B3. Por favor tome en cuenta, es solo una idea.
    • Buenas tardes! Tengo el siguiente código: Private Sub btnCargaBancos_Click() Dim TasaCompra, TasaVenta As Double Dim InvBanesco, InvVzla, MontoBanesco, MontoVzla As Double Dim TasaDiaBan, TasaDiaVzla, TasaActual As Double 'Inversion = Val(txtInversion.Text) InvBanesco = Val(CDbl(txtInverBanesco.Text)) InvVzla = Val(CDbl(txtInverVzla.Text)) TasaCompra = Val(CDbl(txtTasaCompra.Text)) TasaVenta = Val(CDbl(txtTasaVenta.Text)) MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055)      TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then     TasaActual = TasaDiaBan Else     TasaActual = TasaDiaVzla End If MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco.Value = MontoBanesco txtBcoVenezuela.Value = MontoVzla txtTasaDiaria.Value = TasaActual End Sub   Como se puede apreciar InvBanesco ,  InvVzla , TasaCompra y TasaVenta, son valores que introduce el usuario a través de los respectivos cuadros de texto. Tengo los siguientes problemas: a. Las fórmulas no se ejecutan correctamente (pareciese que no reconociese los números entrados vía cuadros de texto). b. Al darle valor cero (0) a cualquiera de los valores de InvBanesco o  InvVzla, me genera un error en TasaDiaBan o TasaDiaVzla (según sea el caso), aunque, como se puede apreciar, debería generar un valor cero (0). Como dije en mi presentación estoy empezando en esto de la codificación...y quiero aprender de Uds! Agradezco su ayuda! Nota: lamentablemente el fichero es mas grande de lo permitido y no pude anexarlo.  
    • Hola buenas tardes. En una hoja plantilla donde realizo diferentes consultas de datos. tengo ya establecido dos formulas diferentes con función SI y buscar. estos buscan diferentes rangos de datos y recibendiferentes resultados. Cada formula varia según una palabra o numero  ejemplo si pongo Xl pone la formula 1 y si pongo cualquier numero entre 1 y 3 pone la segunda formula. Lo que necesito hacer es que si en una celda de la columna B3 pongo XL debería de considerar la formula 1 y si pusiera el numero 1 me pondría la segunda formula, dentro de la misma formula. Ya agregue la función SI($C3="Xl",Formula1.. Pero no me funciona, espero me puedan ayudar.   Muchas gracias Mariano   Formula doble si en celda existe.xlsx
    • Sub control2558() Application.ScreenUpdating = False Dim I As Integer I = 4 While Sheets("FT-ADF-2558").Cells(I, 102) <> "" Sheets("FT-ADF-2558").Cells(6, 82) = Sheets("FT-ADF-2558").Cells(I, 102) Dim NombreArchivo, RutaArchivo As String NombreArchivo = "Hoja Control " & Sheets("FT-ADF-2558").Cells(I, 102) RutaArchivo = ActiveWorkbook.Path & "\" & NombreArchivo & ".xlsm" Dim NuevoLibro As Workbook Set NuevoLibro = Workbooks.Add Sheets("FT-ADF-2558").Copy Before:=NuevoLibro.Sheets(1) NuevoLibro.SaveAs Filename:=RutaArchivo NuevoLibro.Close I = I + 1 Wend MsgBox ("Proceso generado con éxito") Application.ScreenUpdating = True End Sub  
    • Ese error es porque no existe la hoja 10 con ese nombre, entonces cámbialo por FT-ADF-2558
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.