Simplificar macro que pasa datos de excel a formulario pdf

Me han sido de mucha ayuda y he aprendido mucho también; a propósito de esto, te consulto porque he utilizado una macro que compartiste hace tiempo que permite pasar datos de una hoja de excel a un formulario pdf; ¡Y funciona muy bien!... Mi problema es que los registros van en aumento y por tanto lo he adaptado de la siguiente forma...

Sub PasarDatosaPdf()
'Por.Dante Amor
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set h2 = Sheets("Datos") 'contador
f = 1
'
file = "Acta_" & f
Range("A2").Select
'
celdas = Array("A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2", "I2", "J2", "K2", "L2", "M2", "N2", "O2", "P2", "Q2")
'
ruta = "D:\Actas\"
nomb = "Acta_0"
ActiveWorkbook.FollowHyperlink ruta & nomb & ".pdf"
'
Application. Wait Now + TimeValue("00:00:02")
For i = LBound(celdas) To UBound(celdas)
Application. Wait Now + TimeValue("00:00:02")
DoEvents
SendKeys "{TAB}", True
DoEvents
H2. Range(celdas(i)). Copy
DoEvents
SendKeys "^v", True
DoEvents
Next
DoEvents
SendKeys "%ao", True
DoEvents
SendKeys (file)
DoEvents
SendKeys "{ENTER}", True
DoEvents
'
Application.ScreenUpdating = True
'
'
f = f + 1
file = "Acta_" & f
Range("A3").Select
'
celdas = Array("A3", "B3", "C3", "D3", "E3", "F3", "G3", "H3", "I3", "J3", "K3", "L3", "M3", "N3", "O3", "P3", "Q3")
'
Application.Wait Now + TimeValue("00:00:02")
ActiveWorkbook.FollowHyperlink ruta & nomb & ".pdf"
'
For i = LBound(celdas) To UBound(celdas)
Application. Wait Now + TimeValue("00:00:02")
DoEvents
SendKeys "{TAB}", True
DoEvents
H2. Range(celdas(i)). Copy
DoEvents
SendKeys "^v", True
DoEvents
Next
DoEvents
SendKeys "%ao", True
DoEvents
SendKeys (file)
DoEvents
SendKeys "{ENTER}", True
DoEvents
'
Application.ScreenUpdating = True
'
End Sub

Como verás, lo único que cambia en el Array es la fila, y no he encontrado la forma de poder utilizar una variable para que en un bucle pueda ir cambiando este valor hasta completar todas las filas de datos.

¿Hay manera de poder hacer esto sin tener que copiar y pegar todo el bloque de código?, pues si son 50 filas de datos sería un pergamino inmenso.

Muchas gracias de antemano.

PD - ¿La función TimeValue admite centésimas de segundo, por ejemplo que se pueda establecer el tiempo en 00:00:01.25?

1 respuesta

Respuesta
2

Te anexo la macro con el ciclo que va desde la fila 2 hasta la última fila con datos de la columna A

Sub PasarDatosaPdf()
'Por.Dante Amor
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set h2 = Sheets("Datos") 'contador
    '
    celdas = Array("A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2", _
                       "I2", "J2", "K2", "L2", "M2", "N2", "O2", "P2", "Q2")
    ruta = "D:\Actas\"
    nomb = "Acta_0"
    '
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    For f = 1 To u
        file = "Acta_" & f
        ActiveWorkbook.FollowHyperlink ruta & nomb & ".pdf"
        '
        Application. Wait Now + TimeValue("00:00:02")
        For i = LBound(celdas) To UBound(celdas)
            Application. Wait Now + TimeValue("00:00:02")
            DoEvents
            SendKeys "{TAB}", True
            DoEvents
            H2. Range(celdas(i)). Copy
            DoEvents
            SendKeys "^v", True
            DoEvents
        Next
        DoEvents
        SendKeys "%ao", True
        DoEvents
        SendKeys (file)
        DoEvents
        SendKeys "{ENTER}", True
        DoEvents
    Next
    Application.ScreenUpdating = True
End Sub

No estoy seguro si Wait te permita centésimas, pero prueba con Sleep, de esta forma; al principio de todo el código debes poner la instrucción Declare:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'
Sub PasarDatosaPdf()
'Por.Dante Amor
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set h2 = Sheets("Datos") 'contador
    '
    celdas = Array("A2", "B2", "C2", "D2", "E2", "F2", "G2", "H2", _
                       "I2", "J2", "K2", "L2", "M2", "N2", "O2", "P2", "Q2")
    ruta = "D:\Actas\"
    nomb = "Acta_0"
    '
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    For f = 1 To u
        file = "Acta_" & f
        ActiveWorkbook.FollowHyperlink ruta & nomb & ".pdf"
        '
        'Application. Wait Now + TimeValue("00:00:02")
        Sleep (2000) '2 segundos
        For i = LBound(celdas) To UBound(celdas)
            'Application. Wait Now + TimeValue("00:00:02")
            Sleep (1250) '1 segundo 25 centecimas
            DoEvents
            SendKeys "{TAB}", True
            DoEvents
            H2. Range(celdas(i)). Copy
            DoEvents
            SendKeys "^v", True
            DoEvents
        Next
        DoEvents
        SendKeys "%ao", True
        DoEvents
        SendKeys (file)
        DoEvents
        SendKeys "{ENTER}", True
        DoEvents
    Next
    Application.ScreenUpdating = True
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

¡Mil Gracias! 

Hola de nuevo... probando el código, el Array se mantiene en la fila 2; aunque el foco sí cambia de fila en cada bucle, y el archivo sí adquiere un nombre distinto hasta llegar a la última fila de datos, el contenido del archivo sigue siendo la información de la fila 2... En el Array es posible asignar una variable como se hace en la línea:

u = h2.Range("A" & Rows.Count).End(xlUp).Row

algo así como

celdas = Array("A" + variable u, "B" + variable u...)

Es como lo imagino, pero no sé si se pueda aplicar... al menos no he encontrado cómo

Tienes razón, me faltó actualizar el array, quedaría dentro del ciclo y de esta manera:

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'
Sub PasarDatosaPdf()
'Por.Dante Amor
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set h2 = Sheets("Datos") 'contador
    '
    ruta = "D:\Actas\"
    nomb = "Acta_0"
    '
    u = h2.Range("A" & Rows.Count).End(xlUp).Row
    For f = 1 To u
        celdas = Array("A" & f, "B" & f, "C" & f, "D" & f, "E" & f, "F" & f, "G" & f, "H" & f, _
                       "I" & f, "J" & f, "K" & f, "L" & f, "M" & f, "N" & f, "O" & f, "P" & f, "Q" & f)
        file = "Acta_" & f
        ActiveWorkbook.FollowHyperlink ruta & nomb & ".pdf"
        '
        'Application. Wait Now + TimeValue("00:00:02")
        Sleep (2000) '2 segundos
        For i = LBound(celdas) To UBound(celdas)
            'Application. Wait Now + TimeValue("00:00:02")
            Sleep (1250) '1 segundo 25 centecimas
            DoEvents
            SendKeys "{TAB}", True
            DoEvents
            H2. Range(celdas(i)). Copy
            DoEvents
            SendKeys "^v", True
            DoEvents
        Next
        DoEvents
        SendKeys "%ao", True
        DoEvents
        SendKeys (file)
        DoEvents
        SendKeys "{ENTER}", True
        DoEvents
    Next
    Application.ScreenUpdating = True
End Sub

sal u dos

Lo probaré ¡Gracias! 
Había intentado hacer eso mismo y me daba error... veré que hacía yo mal.
Gracias de nuevo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas