¿Te atreves a demostrar lo que sabes resolviendo alguno de estos
temas abiertos/no resueltos?

Macro que toma scre...
 
Compartir:
Avisos
Vaciar todo

Macro que toma screenshot de otras pantallas y los coloca en una hoja  

  RSS
Jeison Segura
(@jeison-segura)
Miembro activo Registered

Estoy tratando de hacer una macro que pueda tomar capturas de pantalla de las diferentes transacciones que ejecuto en un sistema y colocarlas en una hoja de excel, hasta ahora solo he logrado tomar capturas pero dentro de la misma hoja de excel, agradezco si alguien pueda ayudarme

Citar
Respondido : 15/09/2020 11:41 pm
RET
 RET
(@ret)
Miembro Admin

Hola @jeison-segura,

 

Podrias subir lo que tengas hecho para revisarlo?

 

IMF_RET

https://InformaticaMuyFacil.com

ResponderCitar
Respondido : 16/09/2020 7:24 am
Jeison Segura
(@jeison-segura)
Miembro activo Registered

@ret de momento tengo este código que toma captura pero de la pantalla activa y en mi caso lo que necesito es que sea de otra pantalla, específicamente de SAP que es donde se ejecutan diferentes transacciones

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _
bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const KEYEVENTF_KEYUP = &H2 ' key up
Private Const VK_SNAPSHOT = &H2C ' print screen key
Private Const VK_MENU = &H12 ' alt key
Private Const VK_CONTROL = &H11 ' ctrl key
Sub ScreensCapture(vk)
keybd_event vk, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, 0, 0
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 1
keybd_event vk, 0, KEYEVENTF_KEYUP, 0
End Sub
Sub Window_Capture_VBA(Optional sTitle = "")
Application.CutCopyMode = False
If sTitle <> "" Then
AppActivate sTitle
Application.Wait Now() + TimeValue("00:00:03")
ScreensCapture VK_MENU
Else
ScreensCapture VK_CONTROL
End If
Application.Wait Now() + TimeValue("00:00:03") 'tiempo de espera para tomar la captura
Sheets("BDMX").Activate 'seleccionar hoja donde se pega la captura
ActiveSheet.Cells(1, 2).Select 'seleccionar celda donde se pega la captura
ActiveCell.PasteSpecial 'pegar

Application.CutCopyMode = False
End Sub
Sub ScreenCapture()
Window_Capture_VBA ' captures all screens
End Sub

Esto básicamente toma una captura de la pantalla activa y la coloca en la hoja que yo le indique, la idea es que la macro ejecute las transacciones en SAP y por cada una de ellas vaya tomando esas capturas de pantalla y no lo haga de la pantalla actual porque sería la interfaz de la macro que no contiene información

ResponderCitar
Respondido : 16/09/2020 6:14 pm
RET
 RET
(@ret)
Miembro Admin

Hola @jeison-segura,

Como te veo suelto, te paso código con el que puedes hacer lo que dices: maximizar la ventana, sacar el pantallazo y pegarlo en tu Excel. Mételo como una Sub y llámala cuando la quieras usar.

Si te da algún problema de error en tiempo de ejecución, probablemente es porque no le da tiempo a maximizar, sacar el pantallazo, activar Excel y pegar. Se supone que el DoEvents debe gestionar eso, pero a veces no. En tal caso, usa el Sleep (está comentado) y juega con sus duraciones hasta que te sientas seguro de que estás cubierto. Reducirá la velocidad, pero asegurarás que funcione.

Para usar el Sleep tienes que declararlo

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)

Y el código

Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Const SW_SHOWMAXIMIZE = 3

Sub Pantallazo()
VentanaAlFrente ("NOMBRE_DE_TU_VENTANA")
'Sleep (500)
Application.SendKeys "({1068})"
'Sleep (500)
DoEvents
ThisWorkbook.Activate
DoEvents
ActiveSheet.Paste
End Sub

Public Function VentanaAlFrente(WindowTitle As String)
Dim iret As Long, THandle As Long

THandle = FindWindow(vbEmpty, WindowTitle)
If THandle <> 0 Then
If IsIconic(THandle) > 0 Then
ShowWindow THandle, SW_MAXIMIZE
Else
BringWindowToTop (THandle)
End If
End If
ShowWindow THandle, SW_SHOWMAXIMIZE
End Function

 

Ya me dirás si te funciona.

Saludos,

IMF_RET

https://InformaticaMuyFacil.com

ResponderCitar
Respondido : 16/09/2020 8:47 pm
Jeison Segura le gustó
Jeison Segura
(@jeison-segura)
Miembro activo Registered

@ret Te agradezco un millón es lo que buscaba, ya por último sabrás la manera de adaptar la captura al tamaño de la celda donde se pega o habrá que hacerlo manual?

ResponderCitar
Respondido : 16/09/2020 9:14 pm
RET
 RET
(@ret)
Miembro Admin

Hola @jeison-segura,

Te he adaptado un poco el código para que pegue las imágenes en columna hacia abajo. Tendrás que adaptarla a tus necesidades.

Las bases, ahí las tienes, ahora ya es tu trabajo ver si las quieres en columna, en una posición determinada o lo que sea.

Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Const SW_SHOWMAXIMIZE = 3
Global Posicion As Long

Sub Pantallazo()
Dim ImgNum As Integer
Dim ImgSize As Single
Dim ImgPos As Long 'Posicion absoluta de imagen
Dim ImgPaso As Integer 'Paso de imagen a imagen
Dim Img As Shape

VentanaAlFrente ("Macro que toma screenshot de otras pantallas y los coloca en una hoja – Macros VBA – Foro de Excel y macros VBA de Informática muy fácil - Google Chrome")
'Sleep (500)
Application.SendKeys "({1068})"
'Sleep (500)
DoEvents
ThisWorkbook.Activate
DoEvents
ActiveSheet.Paste
DoEvents

ImgSize = 280
ImgPaso = 100
'Leer índice de la última imagen pegada
ImgNum = ActiveSheet.Shapes.Count

'Posicionar y dar tamaño a imagen pegada
Set Img = ActiveSheet.Shapes(ImgNum)
With Img
Img.Width = ImgSize
Img.Left = 0
Img.Top = Posicion
End With
Posicion = Posicion + ImgPaso

End Sub

Public Function VentanaAlFrente(WindowTitle As String)
Dim iret As Long, THandle As Long

THandle = FindWindow(vbEmpty, WindowTitle)
If THandle <> 0 Then
If IsIconic(THandle) > 0 Then
ShowWindow THandle, SW_MAXIMIZE
Else
BringWindowToTop (THandle)
End If
End If
ShowWindow THandle, SW_SHOWMAXIMIZE
End Function

Y a ver si me haces publicidad por ahi entre tus contactos!

Saludos,

IMF_RET

https://InformaticaMuyFacil.com

 

ResponderCitar
Respondido : 17/09/2020 8:53 pm
Jeison Segura le gustó
Jeison Segura
(@jeison-segura)
Miembro activo Registered

@ret Saludos, de nuevo yo por acá, tu de casualidad sabrás porque si tengo un monitor extra se capturan las dos pantallas? me parece extraño porque en el código se especifíca el nombre de la pantalla que se quiere capturar, alguna idea?

ResponderCitar
Respondido : 01/10/2020 7:24 pm
Tomcat23
 Tomcat23
(@Tomcat23)
Invitado

Nos enseñas el código?

ResponderCitar
Respondido : 01/10/2020 10:39 pm
Jeison Segura
(@jeison-segura)
Miembro activo Registered

Lo solucione, era tan simple como agregar el simbolo % de la siguiente forma

Application.SendKeys "(%{1068})"

De cualquier manera Gracias :D
ResponderCitar
Respondido : 01/10/2020 11:41 pm

Dejar una respuesta

Nombre del autor

Correo electrónico del autor

Título *

 
Vista previa 0 revisiones Guardado