Saltar al contenido

No quiero que aparezca cuadro de dialogo


Recommended Posts

publicado

Buenos dias a todos, cree el siguiente codigo porque muchos usuarios diferentes trabajan sobre el mismo archivo, y tienen diferentes accesos y conecciones a los discos de la red, de modo que cada que vez que alguien abría el archivo debia modificar todos los vinculos (son como 10) manualmente.

El problema que tengo ahora es que cuando el programa va realizando lo cambios, abre automaticamente varios cuadros de dialogo para seleccionar un archivo que  necesita para seguir ejecutandose. Los usuarios le damos cancelar a todos los cuadros de dialogo que aparecen y el codigo sigue su ejecucion normal. Mi consulta es, sabiendo que dando cancelar el programa sigue su ejecucion normal, no puedo bloquear ese cuadro de dialogo emergente y que tome como valor por defecto "Cancel". Les comparto el codigo (el codigo fue tomado de algun foro y modificado a mis necesidades)

Saludos.

	Application.ScreenUpdating = False 'Apagar el parpadeo de pantalla evitando  los movimientos de pantalla que se producen al seleccionar celdas, 		hojas y libros
    Application.Calculation = xlCalculationManual  'Apagar los cálculos automáticos evitando que se recalcule todo cada vez que se pegan o modifican 		datos
    Application.EnableEvents = False 'Apagar los eventos automáticos evitando que se disparen macros de evento si las hubiere
    ActiveSheet.DisplayPageBreaks = False 'Apagar visualización de saltos de página sirve para evitar algunos problemas de compatibilidad entre macros 		Excel 2003 vs. 2007/2010
    Application.DisplayAlerts = False 'Apaga las alertas

    ubicacion = ActiveWorkbook.Path 'Traemos la ubicacion actual del archivo

    Dim wbTrg As Workbook
    Dim sLinkNew As String
    Dim aLinks As Variant, vLink As Variant

        Set wbTrg = ThisWorkbook   'resume la funcion ThisW.. en wbTrg ..> no se porque

        Rem Set array with all excel links
        aLinks = ActiveWorkbook.LinkSources(xlExcelLinks) ' define un array con los links del libro
        
        Rem Replace each excel Link
        If Not IsEmpty(aLinks) Then 'si el array anterior no esta vacio, entonces...
            For Each vLink In aLinks ' para cada link en el array de links, hacer...
                texto = Split(vLink, "\") 'obtiene un array de todas las cadenas de texto separadas por la barra invertida, esto es para luego traer la 				ultima palabra(nombre del archivo) con la funcion Ubound obtiene el mayor indice de un array
                If texto(UBound(texto)) = "AtData.xla" Then
                'no quiero que haga nada
                Else
                wbTrg.ChangeLink Name:=vLink, NewName:=ubicacion & "\" & texto(UBound(texto)), Type:=xlExcelLinks
                End If



        Next: End If

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.DisplayAlerts = True

 

publicado

Hola.

Pues  ya tienes Application.DisplayAlerts = False eso debería suprimir la mayoría de los cuadros de diálogo, pero por lo que dices no está funcionando.

lamento no ayudarte mucho, porque yo no conozco una forma directa de suprimir estos cuadros de diálogo en el VBA. Aunque, puedes intentar un par de ideas.

Puedes intentar usar Application.OnKey para manejar el evento de presionar la tecla ESC (parecido a hacer clic en Cancelar)

Application.OnKey "{ESC}", "MyCancelRoutine"

Luego definir MyCancelRoutine para manejar el evento

Sub MyCancelRoutine()
    ' Aquí
End Sub

Otra opción sería usar SendKeys para enviar la tecla ESC. Sin embargo, toma en cuenta que SendKeys puede causar problemas si se usa incorrectamente

Application.SendKeys "{ESC}"

Recuerda, son ideas no soluciones. Si puedes prueba en una copia del libro por cualquier cosa. Y está al pendiente, en esta sección hay Maestros calificados que pueden aportar soluciones concretas.

¡Saludines!

publicado
hace 17 horas, Israel Cassales dijo:

 SendKeys para enviar la tecla ESC

Hola Israel. Muchisimas Gracias. Estuve investigando tu opcion esto podria ser una opcion (me da un poco de miedo probarla porque en todos los lugares en los que investigué advertian que fuese super cuidadoso al usar SendKeys.

 

Por si las dudas, aclaro, el cuadro de dialogo emergente que aparece al hacer correr el codigo es "para cambiar el vinculo de otro archivo, que esta en un orden posterior en la ejecucion del codigo". Es decir:

1 - el codigo modifica el vinculo del archivo 1

2 - excel detecta que le falta que se actualice el archivo 2, y en vez de esperar a que se actualice (que lo haria mismo codigo en la sentencia siguiente) corta la ejecucion y pide que se actualice manualmente el vinculo del archvio 2,

3 - al darle cancelar, se continua ejecuatando el codigo y se modifican los vinculos faltantes.

 

Podria pasar el archivo, pero enrealidad necesitaria pasarte todos los archivos, toda la carpeta. 

 

image.thumb.png.9f48876f5ca27755bfceab1742f191dc.png

publicado

Es cierto que SendKeys puede ser impredecible y podría causar problemas si se usa incorrectamente. Por esa causa la recomendación de tomar precauciones.

En 18/10/2023 at 12:04 , Israel Cassales dijo:

Sin embargo, toma en cuenta que SendKeys puede causar problemas si se usa incorrectamente

 

hace 8 horas, jbattiato dijo:

Por si las dudas, aclaro, el cuadro de dialogo emergente que aparece al hacer correr el codigo es "para cambiar el vinculo de otro archivo, que esta en un orden posterior en la ejecucion del codigo"

Entonces el problema parece ser que ¿el código está intentando actualizar los vínculos en un orden que no es el deseado? En ese caso una idea adicional podrías ser intentar desactivar la actualización automática de los vínculos antes de cambiarlos y luego reactivarla después. ¿Qué opinas?

Esto se puede hacer con la propiedad AskToUpdateLinks, algo así:

Application.AskToUpdateLinks = False ' Desactiva la actualización automática de los vínculos

' Aquí va tu código para cambiar los vínculos

Application.AskToUpdateLinks = True ' Reactiva la actualización automática de los vínculos

Algo así debería prevenir que Excel intente actualizar los vínculos automáticamente mientras tu código está cambiándolos, aunque no sé si esto sea opuesto a la primera descripción.

En 18/10/2023 at 7:59 , jbattiato dijo:

cree el siguiente codigo porque muchos usuarios diferentes trabajan sobre el mismo archivo, y tienen diferentes accesos y conecciones a los discos de la red, de modo que cada que vez que alguien abría el archivo debia modificar todos los vinculos (son como 10) manualmente.

Lamento no poder aportar más por ahora.

Saludines

publicado

mm no se pudo che de igual manera muchsimas Gracias por el tiempo que le dedicaste y el esfuerzo de buscar una solucion.

 

publicado

Hola

¿En dónde y/o cómo colocaste lo de AskToUpdateLinks recomendado por Israel? Asimismo, para este tipo de dilemas es conveniente enviar la captura de pantalla del cuadro de diálogo inicial que te da como respuesta tu macro, no solo uno secundario y/o lo que en tu evaluación son las causas.

publicado

Hola Abraham, Gracias por Responder.

Respecto a la segunda consulta, es es el primero cuadro de dialogo que arroja la macro, lo arroja 4 veces (con cuatro vinculos diferentes) y luego los vuelve a arrojar (los mismos 4 vinculos que en el primer caso). 

Respecto a tu primer consulta,  te comparto el codigo editado.  

 Application.ScreenUpdating = False 'Apagar el parpadeo de pantalla evitando  los movimientos de pantalla que se producen al seleccionar celdas, hojas y libros
    Application.Calculation = xlCalculationManual  'Apagar los cálculos automáticos evitando que se recalcule todo cada vez que se pegan o modifican datos
    Application.EnableEvents = False 'Apagar los eventos automáticos evitando que se disparen macros de evento si las hubiere
    ActiveSheet.DisplayPageBreaks = False 'Apagar visualización de saltos de página sirve para evitar algunos problemas de compatibilidad entre macros Excel 2003 vs. 2007/2010
    Application.DisplayAlerts = False 'Apaga las alertas
    Application.AskToUpdateLinks = False 'Desactiva la actualizacion automatica de los vinculos
    

    ubicacion = ActiveWorkbook.Path 'Traemos la ubicacion actual del archivo

    Dim wbTrg As Workbook
    Dim sLinkNew As String
    Dim aLinks As Variant, vLink As Variant

        Set wbTrg = ThisWorkbook   'resume la funcion ThisW.. en wbTrg ..> no se porque

        Rem Set array with all excel links
        aLinks = ActiveWorkbook.LinkSources(xlExcelLinks) ' define un array con los links del libro
     
        Rem Replace each excel Link
        If Not IsEmpty(aLinks) Then 'si el array anterior no esta vacio, entonces...
            For Each vLink In aLinks ' para cada link en el array de links, hacer...
                texto = Split(vLink, "\") 'obtiene un array de todas las cadenas de texto separadas por la barra invertida, esto es para luego traer la ultima palabra(nombre del archivo) con la funcion Ubound obtiene el mayor indice de un array

                
                If texto(UBound(texto)) = "AtData.xla" Then
                    
                Else
                wbTrg.ChangeLink Name:=vLink, NewName:=ubicacion & "\" & texto(UBound(texto)), Type:=xlExcelLinks

                End If



        Next: End If

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.DisplayAlerts = True
    Application.AskToUpdateLinks = True

 

 

 

publicado
En 18/10/2023 at 15:04 , Israel Cassales dijo:

Recuerda, son ideas no soluciones. Si puedes prueba en una copia del libro por cualquier cosa. Y está al pendiente, en esta sección hay Maestros calificados que pueden aportar soluciones concretas.

Israel, tu solucion fue la correcta. Estaba actualizando una macro equivocada, tenia una macro ejecutandose en ThisWorkbook (con open) y otra en un modulo asociada a un boton (la original, no la habia borrado), estaba aplicando las ediciones a esa macro que nunca se ejectuaba

Archivado

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

  • 109 ¿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
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Hola, veo que tienes 365, así que esta forma funcionará   Almacen.xlsx
    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
  • 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.