Jump to content

verzulsan

Members
  • Content Count

    890
  • Joined

  • Last visited

  • Days Won

    6

verzulsan last won the day on July 24 2011

verzulsan had the most liked content!

About verzulsan

  • Rank
    Advanced Member
  • Birthday 12/25/1980

Recent Profile Visitors

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

  1. Pensándolo bien, he llegado a la conclusión de que querer cambiar la selección activa de otra hoja es un sin sentido en si ya que tras mucho buscar, he visto que la selección activa solo puede ser accedida al entrar en la hoja, una vez fuera de la hoja, no puedes hacer nada con la selección activa de la hoja de la que te has ido. Siendo cierto lo de arriba, entonces, el cambio de selección va siempre sobre la hoja activa, la hoja que tienes delante que significa que viene siempre unido al evento Worksheet_SelectionChange. Por lo que concluyo que, si solo vas a poder ver o modificar la selección activa entrando en la hoja, cambiar dicha selección antes de entrar (si se pudiera claro está) no afectaría de ningún modo a nada del excel, ni a ningún dato, ni siquiera activaría eventos y el mismo efecto podría obtenerse asignando la selección para una hoja especifica en una variable que sería accedida solo en el momento de activar la hoja mediante eventos específicos. La persona que me ha planteado este problema en particular no me ha dado ningún tipo de explicación de por qué necesita conseguir esto del excel y tampoco da señales de vida por lo que cancelo la búsqueda de una solución puesto que parece que no hay nada que solucionar. Disculpen las molestias. Un saludo.
  2. Ok pues lo damos por zanjado entonces como que no es posible. Muchas gracias Gerson por tus soluciones. Un saludo.
  3. Gerson tu idea es buena, pero también selecciona la hoja en la que quiere cambiarse el rango, viene a ser lo mismo que lo mío pero con otro código. Hector Miguel, te doy toda la razón y no tengo esa información, pero realmente mi única curiosidad aquí es saber si es posible hacerse sin acceder a la hoja, no de esquivar esta piedra. Yo me inclino a pensar que no es posible y que para cambiar la selección de otra hoja, forzosamente hay que entrar en esa hoja.
  4. No, por que Goto, activa la hoja. Si quito el Application.screenupdating y hago stop despues de Goto, la hoja Activa es la Hoja2, es decir, he cambiado de Hoja mientras que lo que intento es que sin moverme de la Hoja1, pueda cambiar la seleccion de la Hoja2
  5. Te explicaria para que es si lo supiera, pero no es para mi, me pidieron ayuda para saber si yo sabia y el unico modo que se me ha ocurrido es activando la hoja como acabas de proponer. Busco una forma en la que se pueda obtener el mismo resultado del ejemplo del adjunto (que no es mas que un ejemplo) pero SIN ACTIVAR la "Hoja2"
  6. Hola Gerson, solo la seleccion como en el adjunto, Desde la Hoja1, cambiar la seleccion activa de la Hoja2 saludos
  7. Hola a todos, Estoy intentando cambiar la selección activa de una hoja no activa mediante VBA. La única forma que conozco es la del ejemplo adjunto pero no me vale porque tengo que acceder a la hoja objetivo; desactivo eventos, cambio a la hoja y entonces puedo acceder a las propiedades de la selección activa para finalmente volver a la hoja que activa la macro y activo eventos de modo que quede invisible al usuario toda la parafernalia. La pregunta, ¿Alguien sabe cambiar la selección de otra hoja sin tener que activar dicha hoja? Saludos a todos. ActiveCell_Hoja_No_activa.zip
  8. Creo que lo tengo, puede tener algunos fallitos pero como va el algoritmo duplicado en dos módulos diferentes (uno funciona al derecho "Compactar" y otro al revés "Compactar2") puedes compararlos para mejorarlo como mejor te convenga. Descargar Sistema Arbol al reves Saludos PD: Hola Enigma25, gracias por los cumplidos, me alegra que te haya gustado y saludos para ti también. PD2: Me estaba preguntando ahora que he terminado ¿El sistema de árbol al revés que aplicaciones tiene? ¿Para zurdos? ¿Para disléxicos?, Es solo curiosidad, si no se puede decir no pasa nada Saludos2
  9. Con el ejemplo te he entendido, es decir, quieres que actue exactamente igual que lo hace ahora pero en sentido contrario, como si abajo fuera arriba y arriba abajo. Intenta coger la logica del algoritmo y luego dale la vuelta a cada bucle, creo que son las variables Dim FilUp As Integer 'La fila en la que empieza el rango de compactacion Dim FilDown As Integer 'La fila en la que acaba el rango de compactacion Dim FilEOF As Integer 'El final de la hoja, solo para el ultimo segmento de compactacion Edit: Tengo unos minutos a ver si consigo que funcione y te lo paso.
  10. Hola Onardem, me alegro que te sirva, Seguramente se pueda pero no se si te he entendido bien, ¿podrias poner un ejemplo de como iria eso de las filas arriba y el titulo debajo?, saludos
  11. Justo lo que andaba buscando, funciona a la perfeccion. Saludos.
  12. Noticia original con enunciado propuesto desde un punto de vista alternativo: sociedad.elpais.com/sociedad/2013/12/16/videos/1387208927_861334.html Adjunto archivo con método alternativo basado en MCM; por lo visto, recorriendo los múltiplos del Minimo Comun Multiplo de los 12 meses del año tenemos nuestro numero en la tercera posición, ya que en los dos primeros múltiplos hay números repetidos. No sé que tipo de razonamiento se podría dar para que este método de búsqueda fuera valido, pero al menos no entra en conflicto con la premisa de “No se considerarán válidas las respuestas que den sólo el número o que lo hayan encontrado probando todos uno a uno (a mano o con un ordenador).” Ya que en este caso, solo deja 3 posibilidades a elegir usando algo tan sencillo como es sacar matematicamente el MCM de varios numeros y multiplicar eso por 3 y restarle 1. Dejo aqui un enlace a un foro matematico donde parece que estan luchando por sacar la respuesta a papel y lapiz. Creo que uno te lleva ventaja Antoni, ha sacado las dos ultimas cifras jajaja. gaussianos.com/desafios-matematicos-en-el-pais-desafio-extraordinario-de-navidad-2013-un-numero-curioso/ PD: El código anterior (mi primer mensaje #2) tiene tantos if anidados para realizar solamente el 33% de todas las operaciones que harian falta si se usara un contador normal desde (1 a 99.999), realmente no tiene mucha importancia porque ambos son muy rápidos así que aquí dejo mi otra versión: Sub Macro() For i = 1 To 99999 numCoincide = True For x = 2 To 11 If (i - x) Mod (x + 1) <> 0 Then numCoincide = False Next x If numCoincide = True Then For j = 1 To Len(i) For k = j To Len(i) If Mid(i, j, 1) = Mid(i, k, 1) Then numCoincide = False Next k Next If numCoincide = True Then Exit For End If Next i MsgBox i End Sub[/CODE]Aun que sin duda alguna, el método más rápido es el método MCM que va adjunto en el archivo. Numero_loteria_Calculando_mcm_vzs.xls
  13. Yo solo lo he sacado por macro, aun que si lo piensas, tambien es razonamiento, he razonado que me puedo tirar horas matematicamente hablando cuando un bucle de fuerza bruta lo hace al instante jajaja. Sub Macro1() Dim num As Long Dim a As Byte, b As Byte, c As Byte, d As Byte, e As Byte Dim x As Byte Dim numCoincide As Boolean For a = 0 To 9 For b = 0 To 9 If b <> a Then For c = 0 To 9 If c <> a Then If c <> b Then For d = 0 To 9 If d <> a Then If d <> b Then If d <> c Then For e = 0 To 9 If e <> a Then If e <> b Then If e <> c Then If e <> d Then num = a & b & c & d & e numCoincide = True For x = 2 To 11 If (num - x) Mod (x + 1) <> 0 Then numCoincide = False End If Next x If numCoincide = True Then GoTo FinFuncion End If End If End If End If Next e End If End If End If Next d End If End If Next c End If Next b Next a FinFuncion: MsgBox num End Sub[/CODE] Muy entretenido, deberiamos tener mas entretenimientos de este tipo. Saludos y me alegra volver a verte a ti tambien, aun que solo sea en periodos breves de vacaciones.
  14. Hello Permite cómodamente trabajar con muchas hojas ayudándote a organizar las hojas por categorías o decidir cuáles estarán visibles u ocultas. Pues pegado este código (made in sevilla) en cualquier hoja (dejo adjunto aun que da el mismo resultado pegar el codigo en una hoja cualquiera), la convierte en un panel de control de visibilidad de todas las hojas que contenga el libro. Muy fácil de usar, únicamente hay que copiar la hoja en cualquier libro. Option Explicit Private Const PreFix As String = " (ws) " 'Prefijo añadido al nombre de hoja para dinamizar el trato de hojas, _ me explico: _ Para poder generar un listado dinamico donde la lista no sea necesariamente en una columna de arriba a _ abajo, necesito reconocer el nombre en la celda inequivocamente, ya que si hay una celda llamada _ "FACTURAS" que indica "el nombre" de la hoja con todas las facturas y otra celda que pone _ "FACTURAS PASADAS" que significa el rotulo, o un apunte mio o lo que sea, pues la hemos pifiado _ ya el programa lo tomará como una hoja real, pero si le añadimos un prefijo, " (ws) ", o cualquier _ otro prefijo, es muy improbable que manualmente se introduzca el prefijo, _ AUN QUE NO IMPOSIBLE, pero queda ya fuera de mi analisis por improbable. _ _ RECUERDA: Las funciones estan preparadas para que prefijo tenga un espacio al principio y al final, _ Si se quiere quitar los espacios, habria que retocar todas las funciones que dependen de este formato. _ Ejem1: " (Nueva Etiqueta) " -> Correcto _ Ejem2: " -=]Nueva Etiqueta[=- " -> Correcto _ Ejem3: "(Nueva Etiqueta)" -> Incorrecto Private Sub Worksheet_Activate() Dim ws As Worksheet Dim i As Long ' Dim p As Range 'Var Aux para recorrer los rangos Dim RangoPreFix As Range 'Rango que engloba todas las celdas con PreFix (Existan o no las hojas) Dim ColorRojo As Long 'Color de las hojas que no se han encontrado en la coleccion de hojas del libro Dim ColorVerde As Long 'Color de las hojas que se han encontrado y que estan visibles Dim ColorAzul As Long 'Color de las hojas que se han encontrado y que estan ocultas ColorRojo = RGB(255, 0, 0) ColorVerde = RGB(0, 128, 0) ColorAzul = RGB(0, 0, 255) Dim HojasIntocables As String 'Array concatenado en texto con los nombres de hojas especiales _ que no van a ser tratadas automaticamente por las macros de ocultacion y mostracion 'Agrega tantas lineas como hojas necesites proteger HojasIntocables = HojasIntocables & "#" & "Cpanel" & "#" HojasIntocables = HojasIntocables & "#" & "HojaProtegida" & "#" i = 1 'Coloreamos de color rojo todas las casillas con prefijo, _ De esta manera, inicialmente no existe ninguna hoja asociada a ninguna celda. _ Asi que cuando termine el recuento de hojas, las que queden de rojo, son las que _ realmente no existen. Call setFormatoCasillaHoja(BuscarPreFix, ColorRojo) 'Recorre todas las hojas del libro en WS y (busca o crea) una celda linkada al estado de visibilidad de la hoja For Each ws In ThisWorkbook.Sheets If InStr(1, HojasIntocables, "#" & ws.Name & "#", vbTextCompare) = 0 Then 'La hoja no está protegida Set p = FindCellRangeByValue(PreFix & ws.Name) If p Is Nothing Then 'Si no encuentra la celda p, la crea en un hueco libre 'Apunta a la primera fila disponible de la columna 1 Do While (Cells(i, 1) <> "") i = i + 1 Loop Set p = Cells(i, 1) p.Value = PreFix & ws.Name End If 'Marca la celda como Hoja (visible/oculta) If ws.Visible = True Then Call setFormatoCasillaHoja(p, ColorAzul) Else Call setFormatoCasillaHoja(p, ColorVerde) End If End If Next End Sub 'Da formato a los caracteres desde la posicion 2 hasta largo(PreFix)-2 Private Sub setFormatoCasillaHoja(ByRef Celda As Range, ByRef Tono As Long) Dim Largo As Long On Error GoTo ErrorsetFormatoCasillaHoja Largo = Len(PreFix) - 2 With Celda.Characters(Start:=2, Length:=Largo).Font .Superscript = True .Color = Tono End With ErrorsetFormatoCasillaHoja: End Sub 'Busca una coincidencia exacta de texto en toda la hoja Private Function FindCellRangeByValue(Nombre As String) As Range On Error GoTo ErrorFindCellRangeByValue Dim Celda As Range Set Celda = Cells.Find(Nombre, [A1], -4123, 1, 1, 1, 1, 0, False) ErrorFindCellRangeByValue: Set FindCellRangeByValue = Celda End Function 'Genera y devuelve un rango con la seleccion de todas las casillas que contentan el PreFix en la primera posicion. Private Function BuscarPreFix() As Range On Error GoTo FinDeFuncion Dim Rango As Range Dim p As Range, q As Range Set p = Cells.Find(PreFix, [A1], -4123, 2, 1, 1, 0, 0, True) Set q = p Do If InStr(1, p.Value, PreFix, vbTextCompare) = 1 Then If Rango Is Nothing Then Set Rango = p Else Set Rango = Union(Rango, p) End If End If Set p = Cells.Find(PreFix, p, -4123, 2, 1, 1, 0, 0, True) If q.Address = p.Address Then Exit Do Loop FinDeFuncion: Set BuscarPreFix = Rango End Function 'Evento de doble click que actua como switch en las celdas etiquetadas con PreFix (muestra u oculta hojas) Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim ws As Worksheet If Target.Count = 1 Then 'Si el evento afecta a una sola celda If InStr(1, Target.Value, PreFix, vbTextCompare) = 1 Then 'Si el prefijo está al inicio del string 'Se comprueba que la hoja existe (Se le pasa la cadena sin el prefijo) Set ws = ExisteHoja(Mid(Target.Value, Len(PreFix) + 1, Len(Target.Value) - Len(PreFix))) 'Comprueba que la hoja exista antes de invertir visibilidad If Not (ws Is Nothing) Then Cancel = True Application.ScreenUpdating = False If ws.Visible = True Then ws.Visible = False Call setFormatoCasillaHoja(Target, RGB(0, 128, 0)) Else ws.Visible = True Call setFormatoCasillaHoja(Target, RGB(0, 0, 255)) End If Application.ScreenUpdating = True End If End If End If End Sub 'Comprueba si una hoja existe 'Parametro 'Asociado al nombre, Devuelve la hoja, si la hoja existe, hoja vacia si la hoja no existe Private Function ExisteHoja(NombreHoja As String) As Worksheet Dim hojaAux As Worksheet On Error GoTo Errores Set hojaAux = Sheets(NombreHoja) Errores: Set ExisteHoja = hojaAux End Function [/CODE] Consta de 2 eventos automáticos: [size=5][u][b]Evento 1:[/b][/u][/size] Activación de Hoja [indent]Al activar la hoja (esto es simplemente entrar en la hoja), se genera un listado (en la columna A desde la celda A1) en donde cada celda del listado contiene el nombre una de las hojas del libro que haya superado el filtro interno de hojas a tratar, llamaré "Celdas Hoja" a dichas celdas. La peculiaridad que tiene es que una vez generado ese listado, puedes mover las "Celdas Hoja" a otras posiciones y cuando vuelvas a entrar en la hoja, el listado se respeta.[/indent] Si existen datos en la columna A, buscará el primer hueco vacio. [u][b]Una "Celda Hoja"[/b][/u], [indent]consta de un "Prefijo" que la identifica, en este caso el prefijo es (ws) que viene de "WorkSheet" (podeis cambiar esta constante por cualquier otro prefijo), si una celda contiene un prefijo en cualquier parte que no sea en la posición 1, entonces no es una "Celda Hoja".[/indent] [b][u]El prefijo[/u][/b] de las "Celdas Hoja" puede ser de [b][u]3 colores[/u][/b]: [indent][b][u][color=#0000ff]Azul:[/color][/u][/b] La hoja referida por la "Celda Hoja" está visible [color=#336600][u][b]Verde:[/b][/u][/color] La hora referida por la "Celda Hoja" está oculta, he escogido verde porque mentalmente me recuerda a los comentarios en verde del VBA, como diciendo, Hoja desactivada, hoja oculta, podéis toquetear el código y poner el color que mas coraje os dé. [color=#ff0000][u][b]Rojo:[/b][/u][/color] Son "Ex-Celdas Hoja", es decir, fueron "Celdas Hoja" pero por el motivo que sea, esa hoja ya no existe con ese nombre en todo el libro. Generalmente va a ocurrir cuando cambiamos el nombre de una hoja y volvemos a la de Panel. También puede ocurrir si tenemos 2 o más "Celdas Hoja" idénticas, en este caso, la macro tomará la primera que encuentre como valida dejando en rojo la segunda (Está hecho así adrede).[/indent] [u][b]Evento 2:[/b][/u] Doble Click [indent]Haciendo doble click en una "Celda Hoja" (Cualquiera cuyo prefijo no sea rojo), invierte el estado de la hoja relacionada actuando como switch de la misma. Si la hoja está visible, se oculta, y si está oculta, se hará visible.[/indent] [size=3][color=#ff0000]NOTA:[/color] Para que la macro ignore algunas hojas que consideramos que no deberían ser tratadas por la macro, agregadlas dentro del código, al igual que las dos hojas del ejemplo de abajo (“Cpanel” y “HojaProtegida”):[/size] [CODE]HojasIntocables = HojasIntocables & "#" & "Cpanel" & "#" HojasIntocables = HojasIntocables & "#" & "HojaProtegida" & "#" HojasIntocables = HojasIntocables & "#" & "NombreHoja3" & "#" HojasIntocables = HojasIntocables & "#" & "NombreHoja4" & "#"[/CODE][size=3]Agregad tantas líneas como hojas queráis proteger.[/size] Merry Christmas Hoja auxiliar de control de visibilidad de hojas_vzs.xls
  15. Muchas gracias Antoni, me ha sido muy útil. Lo único que le he cambiado ha sido la forma de borrar las columnas ya que tras ordenar quedaban usadas las 2 últimas columnas y ralentizaba mucho la hoja usada como auxiliar. Union(Columns(Columns.Count - 1), Columns(Columns.Count)).Delete Shift:=xlToLeft[/CODE] Y luego como curiosidad, he visto (Y esto lo he visto de chiripa) que la instrucción Move ofrece 4 posibilidades curiosas: [CODE] 'Ordenacion separada (Deja las visibles arriba y ocultas debajo) 'Sheets(Orden(x)).Move After:=Sheets(Sheets.Count) 'Ordenacion separada (Deja las visibles abajo) 'Sheets(Orden(x)).Move After:=Sheets(1) 'Ordenacion separada (Deja las visibles abajo) 'Sheets(Orden(x)).Move Before:=Sheets(1) 'Ordena conjuntamente las visibles y ocultas) Sheets(Orden(x)).Move before:=Sheets(Sheets.Count)[/CODE] Lo he visto por que tengo una hoja “Panel” en la que listo todas las hojas del libro (Las visibles las marco de verde y las ocultas de rojo), pues tras ordenar, según la posibilidad que esté marcada de las 4 que pongo arriba, me agrupa las visibles arriba o abajo o me las ordena todas mezcladas, lo cual me es extremadamente útil para lo que ando haciendo. Una penúltima cosa que he puesto es, que antes de ordenar, guardo la hoja y celda activa para que tras ordenar me devuelva al mismo sitio ya que si no quedo en otra hoja distinta que no viene a cuento. Y ya por último, he tenido que desactivar y reactivar eventos para que no salte el WorkSheetChange cada vez que usas las columnas auxiliares (La primera vez me colgo la hoja pero afortunadamente habia guardado los cambios) Pongo el código modificado (Lo importante esta sin tocar, me ha molado mucho lo de cazar el numero a la inversa con una variable buffer ) [CODE]Sub OrdenarPorNombreHoja() Dim Orden(), Código As String, Fila As Long, Hoja As Worksheet Dim HojaActiva As Worksheet: Set HojaActiva = ActiveSheet Dim CeldaActiva As Range: Set CeldaActiva = ActiveCell Application.EnableEvents = False Application.ScreenUpdating = False Union(Columns(Columns.Count - 1), Columns(Columns.Count)).Delete Shift:=xlToLeft For Each Hoja In Sheets Código = "" For x = Len(Hoja.Name) To 1 Step -1 If IsNumeric(Mid(Hoja.Name, x, 1)) Then Código = Mid(Hoja.Name, x, 1) & Código Else Exit For End If Next Fila = Fila + 1 Cells(Fila, Columns.Count - 1) = Hoja.Name Cells(Fila, Columns.Count) = Left(Hoja.Name, x) & _ String(10 - Len(Código), "0") & Código Next Range(Cells(1, Columns.Count - 1), Cells(Fila, Columns.Count)).SortSpecial _ Key1:=Columns(Columns.Count), Order1:=xlDescending ReDim Orden(Fila) For x = 1 To Fila Orden(x) = Cells(x, Columns.Count - 1) Next Union(Columns(Columns.Count - 1), Columns(Columns.Count)).Delete Shift:=xlToLeft For x = 1 To Fila 'Ordenacion separada (Deja las visibles arriba y ocultas debajo) 'Sheets(Orden(x)).Move After:=Sheets(Sheets.Count) 'Ordenacion separada (Deja las visibles abajo) 'Sheets(Orden(x)).Move After:=Sheets(1) 'Ordenacion separada (Deja las visibles abajo) 'Sheets(Orden(x)).Move Before:=Sheets(1) 'Ordena conjuntamente las visibles y ocultas) Sheets(Orden(x)).Move before:=Sheets(Sheets.Count) Next Application.ScreenUpdating = True Application.EnableEvents = True HojaActiva.Activate CeldaActiva.Select End Sub[/CODE] Un saludo amigo, tus aportes siempre tan útiles cuando no interesantes como siempre
×
×
  • Create New...

Important Information

Privacy Policy