Jump to content

paikerr

Members
  • Content Count

    129
  • Joined

  • Last visited

Everything posted by paikerr

  1. Hola a todxs, ¿Cómo se hace para reiniciar un mismo archivo Excel? He probado con el siguiente código, pero obviamente no funciona (porque la lectura de líneas va desde arriba hasta abajo): ... ActiveWorkbook.Save Application.Quit Workbooks.Open Filename:="C:\Users\paikerr\Dropbox\Documentos\PRUEBAS.xlsm" Windows("PRUEBAS.xlsm").Activate ... Gracias de antemano por vuestro tiempo.
  2. Definitivamente, no tengo ni p... idea de qué es lo que está ocurriendo. El código del archivo Excel sobre el que estoy aplicando las pruebas, me funciona perfectamente. Descargar: ACTUALIZAR.xlsm (archivo de pruebas) Sin embargo, cuando exporto ese mismo código desde archivo de pruebas al archivo original sobre el que directamente trabajo, me ocurre algo muy gracioso: "Si el procedimiento 'PRUEBAS2' se ejecuta a través del condicional 'If / Else', entonces NO se almacena el valor 'True' dentro de la variable 'Hola'. Pero si el procedimiento 'PRUEBAS2' lo ejecuto de manera manual a través de la ventana de macros, entonces SI se almacena el valor 'True' dentro de la variable 'Hola'." Esto debe ser cosa de brujas, ahora que se aproxima Halloween...
  3. Pues esperad... Porque tengo que prepararlo todo. Disculpadme, pero voy a tardar un poco.
  4. ' *** ZONA DE DECLARACIONES **** ' Public Hola As Boolean ' *** ZONA DE PROCEDIMIENTOS *** ' Sub PRUEBAS1() If Hola = False Then MsgBox "Bienvenido al foro 'ayudaexcel'" ' Aquí tengo introducido mucho más código VBA, pero mostrarlo ahora no es lo que me interesa. ' Lo que me preocupa es comprobar por qué no se almacena el valor 'True' en la variable 'Hola'. Call PRUEBAS2 Else Application.Quit End If End Sub Sub PRUEBAS2() ' *** DECLARACION DE VARIABLES *** ' Dim Mat, Vec(1 To 4), Q&, i&, j%, vec_CH, vec_CF, iKey$ Dim Dic1 Set Dic1 = CreateObject("Scripting.Dictionary") Dim Dic2 Set Dic2 = CreateObject("Scripting.Dictionary") Application.ScreenUpdating = False ' *** ACTUALIZACION DE DATOS *** ' With Sheets("Hoja1") If .Cells(2, 1) = "" Then GoTo Fin Mat = .Range("i2", .Cells(1, 1).End(xlDown)): Q = UBound(Mat) For i = 1 To Q For j = 6 To 9: Vec(j - 5) = Mat(i, j): Next iKey = Mat(i, 1) & Mat(i, 2) & Mat(i, 3) & Mat(i, 4) Dic1(iKey) = Vec Dic2(iKey) = i Next End With With Sheets("Hoja2") On Error Resume Next .Outline.ShowLevels RowLevels:=0, ColumnLevels:=3 .Outline.ShowLevels RowLevels:=0, ColumnLevels:=2 On Error GoTo 0 With .Range("e5", .[b5].End(xlDown)) Mat = .Cells: Q = UBound(Mat) vec_CH = .Offset(, 6).Resize(, 2) vec_CF = .Offset(, 9).Resize(, 2) End With For i = 1 To Q iKey = Mat(i, 1) & Mat(i, 2) & Mat(i, 3) & Mat(i, 4) If Dic1.Exists(iKey) Then vec_CH(i, 1) = Dic1(iKey)(1) vec_CH(i, 2) = Dic1(iKey)(2) vec_CF(i, 1) = Dic1(iKey)(3) vec_CF(i, 2) = Dic1(iKey)(4) Dic2(iKey) = 0 End If Next .[h5:i5].Resize(Q) = vec_CH .[k5:L5].Resize(Q) = vec_CF With .[j5].Resize(Q) .FillDown .Offset(1) = .Offset(1).Value End With With .[m5].Resize(Q) .FillDown .Offset(1) = .Offset(1).Value End With End With With Sheets("Hoja1") .[j2].Resize(Dic2.Count) = Application.Transpose(Dic2.items) .[a1].CurrentRegion.Sort .[j1], xlAscending, Header:=xlYes Set Mat = .[a1].CurrentRegion.Columns("j"). _ Find(what:=0, LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious) If Not Mat Is Nothing Then .Range("a2", Mat).Delete xlShiftUp .[a1].CurrentRegion.Columns("j").ClearContents End With Fin: Mat = Empty: Dic1 = Empty: Dic2 = Empty: vec_CH = Empty: vec_CF = Empty ' *** SALIR DE LA MACRO *** ' Hola = True Beep End Sub Este código me lo pasó por aquí @Cacho R. Ya os digo... He probado con introducir al final del procedimiento las instrucciones "Dic1.RemoveAll" y "Dic2.RemoveAll", y en algunas pruebas si he conseguido que se almacenara el valor "True" dentro de la variable "Hola". Pero aún así, me sigue dando problemas constantemente. El objetivo de esta movida es que "si se ha ejecutado por primera vez el procedimiento PRUEBAS2, entonces que salgamos de la aplicación si volvemos a ejecutar manualmente el procedimiento PRUEBAS1". Perdonadme todos por mi ignorancia...
  5. Gracias a todxs de nuevo. Efectivamente mi código de prueba funciona a la perfección, pero no consigo dar con el problema. Sin embargo, dentro de mi código de archivo creo que se debe a que tengo activado un 'Scripting.dictionary', y no me reconoce la declaración de nuevas variables... No sé, pero esto ya va siendo un quebradero de cabeza. ¿Os pasó el código de mi archivo?
  6. Igual existe alguna otra forma de realizarlo... Pero se me ha ocurrido hacerlo con una variable lógica.
  7. Muchas gracias, @Leopoldo Blancas. El problema es que no quiero construir un bucle, sino lo que quiero construir es lo siguiente: > La primera vez que ejecute el procedimiento "PRUEBAS1", también se ejecute "PRUEBAS2" y se active el valor verdadero en la variable "Hola". > De modo que se quede almacenado el valor "True" en la variable "Hola", para volverlo a usar de nuevo en otros procedimientos. > Así si volviera a ejecutar el procedimiento "PRUEBAS1" de manera manual, entonces que se cierre la aplicación "If .../ Else > Application.Quit / End If". ¿No sé si me explico? La idea es básicamente que si "PRUEBAS2" ya se ha ejecutado una primera vez, entonces si volvemos a ejecutar "PRUEBAS1" que se cierre directamente la aplicación.
  8. Hola a todxs, Tengo el siguiente código de programación: ' Zona de Declaraciones ' Public Hola As Boolean ' Zona de Procedimientos ' Sub PRUEBAS1() If Hola = False Then MsgBox "Bienvenido/a al foro 'ayudaexcel.com'" PRUEBAS2 Else Application.Quit End If End Sub Sub PRUEBAS2() MsgBox "¿Podemos ayudarte?" ACTIVAR_VARIABLE End Sub Sub ACTIVAR_VARIABLE() Hola = True End Sub Lo que quiero conseguir con el código anterior es lo siguiente: 1) Si el procedimiento "PRUEBAS1" se ejecuta por primera vez, entonces que realice todo el código contenido en el mismo. 2) Una vez haya terminado de ejecutar el procedimiento "PRUEBAS1", entonces que pase a realizar el procedimiento "PRUEBAS2" sin necesidad de llamarle manualmente. 3) Cuando termine de ejecutar "PRUEBAS2", que se active la variable "Hola" con el valor booleano "True" a través del procedimiento "ACTIVAR_VARIABLE". 4) De modo que si volviera a ejecutar de nuevo el procedimiento "PRUEBAS1", entonces la bifurcación condicional pase directamente a "Else" y aplique el código "Application.Quit". Es decir, la variable "Hola" sólo se activa en modo verdadero cuando se ejecuta el procedimiento "PRUEBAS2" por primera vez. Y si la variable "Hola" toma el valor "True" y se volviera a ejecutar el procedimiento "PRUEBAS1", entonces que nos expulse/salgamos directamente de la aplicación. ¿No sé si me he explicado bien? Igual existe alguna otra opción de hacer lo mismo sin dar tantas vueltas... No sé, pero necesito de vuestra ayuda. Muchas gracias de antemano por vuestro tiempo.
  9. A veces, este tipo de chorradas me llevan a perder más tiempo que ni sé. Estaba utilizando vbQuestion. En fin... Sea como fuere, aquí os paso una lista con los diferentes sonidos que emiten: beep emite un sonido breve y grave. Sub Sonido_beep() beep MsgBox "Hola mundo, ¿cómo estás?" End Sub vbCritical (16) emite un sonido progresivo y algo más duradero. Sub Sonido_vbCritical() MsgBox "Hola mundo, ¿cómo estás?", vbCritical End Sub vbQuestion (32) no emite ningún sonido. Sub Sonido_vbQuestion() MsgBox "Hola mundo, ¿cómo estás?", vbQuestion End Sub vbExclamation (48) emite un sonido breve y más agudo. Sub Sonido_vbExclamation() MsgBox "Hola mundo, ¿cómo estás?", vbExclamation End Sub vbInformation (64) emite dos sonidos agudos y muy breves. Sub Sonido_vbInformation() MsgBox "Hola mundo, ¿cómo estás?", vbInformation End Sub
  10. Jajaja.. ¡Que tío más grande!
  11. Gracias por el aporte, @Leopoldo Blancas.
  12. Hola a todxs, Pero tengo una duda que es una chorrada como un piano de grande: ¿Cómo se hace para introducir un "beep" al mismo tiempo que se despliega un mensaje de alerta con MsgBox? He probado con este código, pero el sonido va unos segundos adelantado al momento en el que se despliega la ventana de alerta. ... Beep If MsgBox("Hola, mundo de 'ayudaexcel.com'", vbOKOnly) = vbOK Then Cells.Clear ... Quizás en este ejemplo no se perciba la diferencia, al contrario que en mi macro de origen en la cual tengo decenas de líneas de código y genera muchos procesos al mismo tiempo. Lo suyo sería algo como el siguiente código, pero VBE no me lo acepta. ... Beep & If MsgBox("Hola, mundo de 'ayudaexcel.com'", vbOKOnly) = vbOK Then Cells.Clear ... En fin. Que ya sé que es una tontería, pero me está dando runrún en la cabeza...
  13. Hola a todxs, He leído un texto por ahí que decía lo siguiente: "Cualquiera que sea la opción elegida en la 'Seguridad de macros', si instala un programa antivirus compatible con Microsoft Office System 2010, los libros que contengan macros serán analizados antes de abrirse." Me gustaría saber qué hay de cierto en lo anterior, y si conocéis algún antivirus que tenga en cuenta este detalle, es decir, que analice las macros ajenas (descargadas de Internet o por cualquier otro medio) antes de ejecutarlas en mi ordenador. Muchas gracias de antemano por vuestro tiempo. Saludos.
  14. Una duda más (igual es una chorrada): ¿Cómo se activa o descarga la opción de Intellisense en Excel?
  15. Gracias por la aclaración, @Gerson Pineda. Me sonaban campanas... Pero después de leer tu comentario, te has explicado muy bien.
  16. De todos modos, y perdóname por mi ignorancia, pero este código parece haberlo copiado de la Grabadora de macros. Si es así, ¿qué opción has utilizado? Buscar y seleccionar > Ir a Especial... > (y luego???)
  17. A eso es a lo que me refería, @Antoni. Muchas gracias. Te voy a ser sincero, @Gerson Pineda. No he trabajado nunca con Power Query. Pero intentaré echarle un ojo. Gracias.
  18. Y cuál es el programa??? Por simple curiosidad...
  19. Si, así fue como lo vi. Gracias @Gerson Pineda.
  20. Perfecto. Lo guardo, para usarlo luego más tarde. Gracias @Haplox.
  21. Gracias @Haplox. Eso que dices es completamente cierto. Podría construir un bucle For/Next, y a partir de ahí rastrear a ver si coinciden los datos. Pero pensé que igual existía algún otro método más eficiente, como así ocurre cuando operamos con una sola columna: ... ActiveSheet.Range("$A$1:$A$1048576").RemoveDuplicates ...
  22. Perfecto, gracias @Haplox. *** Tema cerrado ***
  23. Hola a todxs, Me gustaría desarrollar una macro que me permitiera eliminar todos aquellos datos duplicados que coinciden en varias columnas. Creo que se entiende mejor con una imagen: https://www.dropbox.com/s/r5i8qmchk8v33wk/Foto.jpg?dl=0 El objetivo de la macro consiste en desplazar todos los datos hacia arriba (xxx.Delete Shift:=xlUp), una vez se hayan detectado que los valores por columnas están duplicados dentro de la matriz de datos. ¿No sé si me he explicado bien? (Mejor ver imagen)
  24. Jajaja... En realidad, me refería a la ruta de acceso, como por ejemplo la siguiente: C:\Program Files\Microsoft Office\Templates\3082 Es que estoy navengando en mi disco duro, y no termino de encontrar la ruta de acceso en la que se alojan todos mis archivos personales y temporales usados por Microsoft Office Excel. Gracias.
×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png