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

Respuesta
1

.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ú

.

Me alegro Frank de que te haya funcionado.

Uno ayuda medio a ciegas a veces al no ver lo mismo que quién pregunta.

Recuerda valorizar mi esfuerzo y colaboración.

Un abrazo

Fer

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas