Buscar una hoja y activarlo, sino crearlo
Tengo mas de 100 hojas. Necesito que desde un texbox (del formulario) me busque esa hoja, si lo encuentra que lo active, de lo contrario que lo crea(con los datos ingresados en el texbox)
Ejem: Ingreso en el texbox hoja35 al darle ENTER que me arroje el resultado (si existe la hoja, que lo active. Si no existe que lo crea con el nombre hoja35)
1 Respuesta
.22/11/16
Buenas tardes, Frank
Imagino que ya tendrás armado tu formulario con el textbox.
La rutina que hace lo que solicitas es la siguiente:
Private Sub CommandButton1_Click() If Len(TextBox1.Value) Then LaHoja = TextBox1.Value Else MsgBox "Faltó ingresar el nombre de la hoja" & Chr(10) & "No se realizará acción alguna", vbOKOnly, "FALTA NOMBRE" Exit Sub End If On Error Resume Next Set HojaBusq = ActiveWorkbook.Sheets(LaHoja) If Err <> 0 Then 'creación de la hoja nueva On Error GoTo 0 Sheets.Add After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = LaHoja Sheets(Sheets.Count).Select Else 'ir a la hoja existente HojaBusq.Select End If Err.Clear On Error GoTo 0 Set HojaBusq = Nothing End Sub
Tiene, además, un control de que hayas ingresado un nombre
Coméntame si es lo que buscabas -y, en tal caso, agradeceré que califiques mi contribución- o escribeme de nuevo aquí, si necesitas más apoyo con esto.
Un abrazo
Fernando
(Buenos Aires, Argentina)
.
Hola Fernando, excelente.
Sin embargo esto necesito que se active o funcione desde un texbox. Ejem: Si le doy Enter una vez ingresado el nombre que me crea la hoja (si no existe) o active (si ya existe)
Será posible ver la forma que funcione desde el texbox?
.
Bien, Frank
Podía ser con un botón, como lo que te pasé, o al dar enter o Tab.
Para ello, sólo cambiará la primera línea del mismo código:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Len(TextBox1.Value) Then LaHoja = TextBox1.Value Else MsgBox "Faltó ingresar el nombre de la hoja" & Chr(10) & "No se realizará acción alguna", vbOKOnly, "FALTA NOMBRE" Exit Sub End If On Error Resume Next Set HojaBusq = ActiveWorkbook.Sheets(LaHoja) If Err <> 0 Then 'creación de la hoja nueva On Error GoTo 0 Sheets.Add After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = LaHoja Sheets(Sheets.Count).Select Else 'O ir a la hoja existente HojaBusq.Select End If Err.Clear On Error GoTo 0 Set HojaBusq = Nothing End Sub
Desde luego, si el nombre del Textbox fuera distinto a TextBox1, reemplazalo por el que tengas en tu formulario.
Abrazo
Fer
.
Fer, acabo de realizarlo y me funciona cuando la hoja es nueva (osea cuando no existe) pero cuando la hoja existe no lo activa
Acabo de probar con
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
pero no funciona cuando le doy ENTER.
.
Hola, Frank
Me parece que se cruzaron los mensajes. Pero con la segunda rutina me funcionó perfecto en ambos casos.
Fíjate de usar la versión como esta:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Len(TextBox1.Value) Then LaHoja = TextBox1.Value Else MsgBox "Faltó ingresar el nombre de la hoja" & Chr(10) & "No se realizará acción alguna", vbOKOnly, "FALTA NOMBRE" Exit Sub End If Unload Me On Error Resume Next Set HojaBusq = ActiveWorkbook.Sheets(LaHoja) If Err <> 0 Then 'creación de la hoja nueva On Error GoTo 0 Sheets.Add After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = LaHoja Sheets(Sheets.Count).Select Else 'O ir a la hoja existente HojaBusq.Select End If Err.Clear On Error GoTo 0 Set HojaBusq = Nothing End Sub
Esta agrega una linea para que salga del formulario cuando le indicaste el nombre de la hoja.
Saludos
Fer
.
Hola Fer
Estoy tratando que funcione tal como me adjuntaste. Es más respete tu formato solo para probar la funcionalidad, pero no funciona al 100%.
Cuando le doy enter no funciona, no reconoce nada.
Solo funciona cuando cierro el formulario con equis.
.
Buenas, Frank
Es extraño, porque todas las pruebas que hice funcionaron correctamente desde la primera vez.
Asegurate de que sea realmente un TextBox y que su nombre sea TextBox1.
Si el nombre fuese otro deberás reemplazarlo en todas las apareciere.
Habría que revisar qué otras cosas hace tu formulario para entender si hay alguna otra instrucción en conflicto.
¿Podrás pasar una imagen de tu formulario?
Saludos
Fer
.
Donde dice fecha (texbox1) ingreso la fecha (o cualquier otro contenido)
En este texbox1 escribo 11-11-2016 y automáticamente me debe mostrar (o activar) la hoja(11-11-2016), si este no EXISTE lo debe CREAR automáticamente y renombrar con el contenido del texbox1(osea 11-11-2016).
Ojo todo debe funcionar UNICAMENTE SI LE DOY ENTER.
Nota: Las hojas están ocultas pero eso no es el problema, pues añado .visible = True y listo. Repito esto no es el problema.
Espero me ayudes
Saludos
.
Claro, Frank
Ese dato era importante. La rutina deberá evaluar si está oculta o no:
Con un formulario similar, esta rutina va a la hoja aunque estuviese oculta:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) If Len(TextBox1.Value) Then LaHoja = TextBox1.Value Else MsgBox "Faltó ingresar el nombre de la hoja" & Chr(10) & "No se realizará acción alguna", vbOKOnly, "FALTA NOMBRE" Exit Sub End If Unload Me On Error Resume Next Set HojaBusq = ActiveWorkbook.Sheets(LaHoja) If Err <> 0 Then 'creación de la hoja nueva On Error GoTo 0 Sheets.Add After:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = LaHoja Sheets(Sheets.Count).Select Else 'O ir a la hoja existente If HojaBusq.Visible = False Then HojaBusq.Visible = True HojaBusq.Select End If Err.Clear On Error GoTo 0 Set HojaBusq = Nothing End Sub
Pruébala así y dime si funciona bien.
Saludos
Fer
.
Fer, como te comente en el post anterior. El problema no esta en las hojas ocultas, sino en el ENTER.
Osea si le doy ENTER al texbox debería hacer una de las dos opciones(o crear o activar la hoja)
En el código que me pasaste texbox1 aparece con Exit haciendo que solo funcione si solo si cierro el formulario con equis . ESTO ESTA MAL.
Tampoco es el change().
Aquí esta mi problema el no saber con qué tipo debe funcionar texbox1_¿?
.
Probablemente sean dos problemas, pero si la hoja estaba oculta no hubiera ido a ella.
Veo que lo diseñaste dentro de un marco, que queda estéticamente lindo pero en general se usa para agrupar objetos.
Prueba con esta instrucción:
Private Sub Frame1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
También prueba con la tecla Tab, como para cambiar de casilla y verás que lo hace bien.
O prueba dejnado la rutina que te mandé y quitando el marco.
Saludos
Fer
.
¡Gracias!
Excelente.
En verdad he leído harta literatura de vba excel y no había reparado lo del frame. Estéticamente se ve genial, sin embargo puede tener estos detalles que impidan correr correctamente la macro.
De todas maneras te comento que la solución que encontré fue agregarle el siguiente encabezado:
Private Sub TextBox1_AfterUpdate()
Me funciono de maravilla.
Gracias nuevamente y doy por finalizado este post.
Un saludo
Frank Segura
Lima,Perú
- Compartir respuesta