Jump to content

paikerr

Members
  • Posts

    195
  • Joined

  • Last visited

  • Country

    Spain

About paikerr

  • Birthday May 22

Profile information

  • Gender
    Hombre
  • Localización:
    Segovia, Castilla y León

Converted

  • Campos
    ,
  • Mi versión de Excel:
    2

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

paikerr's Achievements

  1. Gracias @Gerson Pineda. Me tocará hacerlo así... Que remedio!
  2. Okey... Bueno. Gracias por la info.
  3. Gracias @Antoni. Así quedaría definida la función (por si a alguien le interesa): Function ReferenciarColumnas(numero As Integer) As String Application.ScreenUpdating = False ' Tratamos los errores de la función... On Error Resume Next ' Declaramos las variables de ámbito local... Dim letras As Variant letras = Split(ThisWorkbook.ActiveSheet.Columns(numero).Address, "$") ' Si el número introducido no es válido, entonces... If numero <= 0 Or numero > 16384 Then ' Notificamos al usuario con un mensaje de error... MsgBox Prompt:="Upps, parece que hubo un error... Por favor, el número introducido debe estar " & _ "comprendido entre los valores 1 y 16384.", _ Title:="NUMERO INCORRECTO" ' En caso contrario... Else ' Referenciamos el número de columna... ReferenciarColumnas = letras(2) End If End Function Saludos.
  4. Una pregunta: "¿Alguien sabe cómo centrar los títulos de un cuadro MsgBox que no se utilizando espacios en blanco, sino que se realice de manera automática?" Debe existir algún valor de una propiedad que desconozca. Gracias.
  5. Hola a todos, Me gustaría preguntar si alguien tiene desarrollada una función tal que cuando el usuario introduzca un número cualquiera, entonces la función devuelva la referencia de la columna asociada a ese número. Algo así, por ejemplo: Function ReferenciarColumnas(numero As Integer) As String Application.ScreenUpdating = False ' Limpiamos los errores anteriores (por si acaso)... Err.Clear ' Tratamos los errores de la función... On Error Resume Next ' Si el número introducido no es válido, entonces... If numero <= 0 Or numero > 16384 Then ' Notificamos al usuario con un mensaje de error... MsgBox "El número introducido no es válido." & vbCr & _ "Por favor, el número introducido debe estar comprendido entre los valores 1 y 16384." ' En caso contrario... Else ' Notificamos al usuario con un mensaje de confirmación... MsgBox Chr(numero + 64) End If End Function El problema es cuando el usuario introduce un valor superior a 26, ya que supera la letra "Z". Y habría que empezar otra vez desde la columna "A", pero añadiéndole la siguiente letra al final. Es decir, Número: 27 ---> Columna: AA Número: 28 ---> Columna: AB Número: 29 ---> Columna: AC ... y así sucesivamente, hasta llegar a la columna XFD. Esta es la típica función que ya está desarrollada. Por eso, pregunto por el foro a ver si alguien se anima a compartirla conmigo. Gracias por vuestro tiempo.
  6. Hola a todos, Me gustaría que al pulsar una tecla o un atajo de teclado, se le aparezca un mensaje en un MsgBox al usuario de la aplicación ofimática. No sé muy bien cómo plantear el problema. Se me ocurre lo siguiente, pero no funciona: Sub MostrarMensaje() If Application.OnKey Key:="{c}" Then MsgBox "Hola mundo" End Sub Alguien tiene una idea mejor? Gracias.
  7. Hola @Antoni, Muchas gracias por tomarte un tiempo en responderme. Voy a estudiar tu código, y coger ideas que siempre es bueno para cultivar mi conocimiento. El caso es que ya lo solucioné de una manera mucho más sencilla, y es del siguiente modo: Paso 1) Este es el código de la función comprobarContraseña: Function comprobarContraseña(CONTRASEÑA_HOJA As String) As Boolean ' Tratamos los errores de la función... On Error Resume Next ' Declaramos las variables de ámbito local... Dim contraseña As String contraseña = InputBox(Prompt:="Por favor, introduzca la contraseña de la hoja:", _ Title:="INSERTAR CONTRASEÑA") ' Si la contraseña no coincide, entonces... If contraseña <> CONTRASEÑA_HOJA Then comprobarContraseña = False ' En caso contrario... Else comprobarContraseña = True End If End Function Paso 2) Este es el código del evento Worksheet_BeforeDelete: Private Sub Worksheet_BeforeDelete() Application.ScreenUpdating = False Application.StatusBar = "Procedimiento en ejecución..." ' Limpiamos los errores anteriores (por si acaso)... Err.Clear ' Tratamos los errores del evento... On Error Resume Next ' Si la contraseña no coincide, entonces... If FUNCIONES.comprobarContraseña(CONTRASEÑA_HOJA) = False Then ' Copiamos la hoja... ThisWorkbook.ActiveSheet.Copy After:=Sheets(ThisWorkbook.ActiveSheet.Index) ' Y notificamos al usuario con un mensaje de error... MsgBox Prompt:="Upps, parece que hubo un error... Por favor, introduzca la contraseña correcta.", _ Buttons:=vbCritical, _ Title:="CONTRASEÑA INCORRECTA" ' En caso contrario... Else ' Notificamos al usuario con un mensaje de confirmación... MsgBox Prompt:="La hoja de datos " & HOJA & " del libro " & ThisWorkbook.Name & " se ha eliminado correctamente.", _ Buttons:=vbInformation, _ Title:="HOJA DE DATOS ELIMINADA CON EXITO" End If Application.StatusBar = False End Sub Y paso 3: Este es el código del evento Worksheet_Activate: Private Sub Worksheet_Activate() Application.ScreenUpdating = False Application.StatusBar = "Procedimiento en ejecución..." ' Limpiamos los errores anteriores (por si acaso)... Err.Clear ' Tratamos los errores del evento... On Error Resume Next ' Y renombramos la hoja (por si acaso)... If ThisWorkbook.ActiveSheet.Name <> HOJA Then ThisWorkbook.ActiveSheet.Name = HOJA Application.StatusBar = False End Sub Poniéndo este código en orden, entonces ya se puede eliminar cualquier hoja del libro solicitándo una contraseña al usuario. Decir también que las variables HOJA y CONTRASEÑA_HOJA, son constantes. De manera que habría que declararlas en la zona de declaraciones del módulo. Por ejemplo: Const HOJA As String = "MiHoja" Const CONTRASEÑA_HOJA As String = "MiContraseña" Aunque todo esto @Antoni, ya lo dominas a la perfección... Jejeje. Pero lo dejo por el foro, por si alguien se anima a leerlo. Saludos.
  8. Hola a todos, Tengo este evento creado de tipo Worksheet_BeforeDelete: Private Sub Worksheet_BeforeDelete() Application.ScreenUpdating = False Application.StatusBar = "Procedimiento en ejecución..." ' Limpiamos los errores anteriores (por si acaso)... Err.Clear ' Tratamos los errores del evento... On Error Resume Next ' Si la contraseña no coincide, entonces... If FUNCIONES.comprobarContraseña(CONTRASEÑA_HOJA) = False Then ' Copiamos la hoja... ThisWorkbook.ActiveSheet.Copy After:=Sheets(ThisWorkbook.ActiveSheet.Index) ' Y notificamos al usuario con un mensaje de alerta... MsgBox Prompt:="Upps, parece que hubo un error... Por favor, introduzca la contraseña correcta.", _ Buttons:=vbCritical, _ Title:="CONTRASEÑA INCORRECTA" ' En caso contrario... Else ' Notificamos al usuario con un mensaje de información... MsgBox Prompt:="La hoja de datos " & HOJA & " del libro " & ThisWorkbook.Name & " se ha eliminado correctamente.", _ Buttons:=vbInformation, _ Title:="HOJA DE DATOS ELIMINADA CON EXITO" End If Application.StatusBar = False End Sub La función comprobarContraseña también es muy sencillita: Function comprobarContraseña(CONTRASEÑA_HOJA As String) As Boolean ' Tratamos los errores de la función... On Error Resume Next ' Declaramos las variables de ámbito local... Dim contraseña As String contraseña = InputBox(Prompt:="Por favor, introduzca la contraseña de la hoja:", _ Title:="INSERTAR CONTRASEÑA") ' Si la contraseña no coincide, entonces... If contraseña <> CONTRASEÑA_HOJA Then comprobarContraseña = False ' En caso contrario... Else comprobarContraseña = True End If End Function Las variables HOJA y CONTRASEÑA_HOJA las tengo declaradas como constantes públicas, aunque en este caso se pueden sustituir por cualquier valor. Bueno, con el código anterior en mano, mi idea es la siguiente: "Quiero que el usuario antes de eliminar la hoja introduzca una contraseña en un InputBox. Si coincide, entonces se muestra un mensaje de confirmación al usuario y la hoja se elimina. Y si la contraseña de la hoja no coincide, entonces se crea una copia de la hoja y se muestra un mensaje de error al usuario". Es simple. Pero el problema que tengo es que siempre que la contraseña no coincide, se crea una copia de la hoja con el nombre seguido de un número. Por ejemplo: Eliminamos la "Hoja1" y acto seguido se crea la hoja "Hoja1 (1)", eliminamos la "Hoja1 (1)" y acto seguido se crea la hoja "Hoja1 (2)", eliminamos la "Hoja1 (2)" y acto seguido se crea la hoja "Hoja1 (3)", y así sucesivamente... Simplemente, quiero que la copia creada se llame "Hoja1", pero me devuelve un error de tipo "La hoja creada ya existe". En fin, espero haberme explicado bien. Agradezco cualquier aporte por vuestra parte. Saludos, y muchas gracias por vuestro tiempo.
  9. Hola Antoni, Efectivamente así es como al final lo he tenido que solucionar. Mencionar también que si la hoja está oculta es fundamental hacerla visible, porque de lo contrario también dará error. En definitiva, y copiando tu código quedaría algo así: Sub InmovilizarPaneles() Application.ScreenUpdating = False Const HOJA as String = "Hoja2" ' Cambiar el nombre de la hoja... ThisWorkbook.Sheets(HOJA).Activate ThisWorkbook.Sheets(HOJA).Visible = xlSheetVisible ThisWorkbook.Sheets(HOJA).Cells(2, 2).Select ActiveWindow.FreezePanes = True Application.ScreenUpdating = True End Sub Saludos, y gracias por el aporte.
  10. Voy a estudiarlo. A ver que puedo sacar en claro de todo ello. Saludos, y muchas gracias por el aporte.
  11. Hola @Antoni, no. No funciona. El objeto Windows sólo admite como parámetro el índice 1, que es lo mismo que decir "Windows(1) = ActiveWindow". Pero gracias por el aporte.
  12. Hola compañeros, Mi problema es el siguiente: "Tengo una macro que ejecuta un código cualquiera sobre varias hojas, y entre ello está inmovilizar los paneles de una hoja. El problema es que yo no quiero que se inmovilicen los paneles de la ventana activa, sino de la ventana de la hoja que yo le indique. Esto se debe a que introduzco la sentencia 'ActiveWindow.FreezePanes = true' Entonces, mi pregunta es: ¿No existe otra sentencia para inmovilizar paneles que no sea la anterior? Es decir, algo así como 'ThisWorkbook.Worksheets("Hoja1").FreezePanes = true'. Ya probé con la sentencia anterior, pero obviamente no me deja dado que FreezePanes es una propiedad del objeto Window." En fin, espero haberme explicado bien. Agradezco cualquier aporte. Saludos.
  13. Perfectooo!! Ahora si que si. Al final lo puse en un evento de hoja Worksheet_Activate.
  14. Hola @Gerson Pineda, recién me doy cuenta de que este pequeño "truco" se anula en el momento que se cierra la aplicación ofimática. Excel en este caso. Sabes cómo se hace para dejarlo estable para siempre? Saludos.
  15. Si, efectivamente eso es lo que hago. No obstante, cuando el código de mi procedimiento hace llamadas a otros procedimientos, a veces se me hace complicado detectar el error. Por eso, me preguntaba si era posible que devolviera el número de fila en donde el editor de VBA detecta el error, así como ocurre con otros IDE tipo NetBeans, eclipse, ATOM, etc. Pero bueno, si no es posible... Muchas gracias por contestar, @Antoni. Saludos.
×
×
  • Create New...

Important Information

Privacy Policy