Como hacer funcionar el If Then en esta macro

Tengo una macro excel para capturar datos en un USERFORM y vaciar éstos en una hoja que es seleccionada en un CbBx1 bajo la condición que esta hoja se encuentre vacía. Pero si la hoja seleccionada se encuentra ocupada debe desplazar un mensaje “Hoja ocupada”. Mi petición a Ustedes es su apoyo para corregir el If Then de esta macro. Gracias por su atención...

 Private Sub CommandButton1_Click() 'insertar el registro de Obras

Application.ScreenUpdating = False

Dim OBRA As String

OBRA = ComboBox1.Value

On Error GoTo sinhoja

Sheets(OBRA).Select

On Error GoTo 0

Sheets(OBRA).Unprotect

Dim condicion As String

       If OBRA = "" Then

      Sheets(OBRA).Activate

           Else

      MsgBox "Hoja ocupada"              

 Range("A1").Select

Range("b" & Cells.Rows.Count).End(xlUp).Offset(1).Select

 ActiveCell.Offset(1, 1) = "OBRA"

ActiveCell.Offset(1, 2) = TextBox1.Value  ' Obra

End If

Exit Sub

Application.ScreenUpdating = False

End Sub

2 Respuestas

Respuesta
2

Te anexo la siguiente macro, valida lo siguiente:

1. Que el combobox1 tenga datos

2. Que la hoja existe

3. Que la hoja esté vacía

Los datos, según tu macro los escribe en las celdas C3 y D3, ya que si la hoja está vacía siempre va a escribir en esas celdas.

Private Sub CommandButton1_Click() 'insertar el registro de Obras
'Por.Dante Amor
    Application.ScreenUpdating = False
    '
    If ComboBox1 = "" Then
        MsgBox "Selecciona una hoja en el combo"
        Exit Sub
    End If
    '
    existe = False
    For Each h In Sheets
        If h.Name = ComboBox1 Then
            existe = True
            Exit For
        End If
    Next
    If existe Then
        If Application.CountA(Sheets(ComboBox1.Value).UsedRange) = 0 Then
            Sheets(ComboBox1.Value).Range("C3") = "OBRA"
            Sheets(ComboBox1.Value).Range("D3") = TextBox1.Value
            MsgBox "Datos guardados"
        Else
            MsgBox "La hoja está ocupada"
        End If
    Else
        MsgBox "La hoja no existe"
    End If
    '
    Application.ScreenUpdating = False
End Sub


La macro hace lo que pediste, pero la verdad no entiendo lo que pretendes, ya que si quieres guardar por segunda vez en la misma hoja ya no vas a poder, porque ya guardaste unos datos anteriormente. Supongo que tus razones haz de tener.


Respuesta
2

Hay 1 instrucción que contempla el error que puede darse al intentar seleccionar una hoja (luego del Exit sub te faltan las instrucciones que te dejé en la 1er consulta).

    On Error GoTo sinhoja

    Sheets(OBRA).Select

Y ese error se va a dar si el elemento del combo queda vacío, es decir si OBRA = "", porque no se puede seleccionar una hoja sin nombre.

Entonces no veo necesidad de preguntar ... porque además no va a llegar a esta instancia por el control anterior, la siguiente consulta:

If OBRA = "" Then

Sheets(OBRA). Activate

Ahora, si no colocas el control On error, si es posible que llegues a esta sección de código, y entonces, si OBRA = "" te va a dar error tratar de activar una hoja sin nombre...

Una vez aquí, aclara por favor qué significa 'que si la hoja esté ocupada' ...

Sdos

Elsa

Aclaro un detalle porque se superpusieron las respuestas con el otro experto y solo lograrás confusión.

Si colocas:

OBRA = ComboBox1.Value
On Error GoTo sinhoja
Sheets(OBRA).Select
On Error GoTo 0

No hay ninguna necesidad de utilizar un bucle recorriendo todas las hojas para ver si existe. Esto evita demoras en el proceso... no la encuentra y se va al final con la llamada 'sinhoja'.

También saltará el error si OBRA = ""... significa que estoy contemplando todos los posibles errores.

Solo queda que me aclares qué significa que esté 'ocupada'

Sdos!

Te acabo de responder una nueva consulta pero aún veo esta sin valorar...

Excelente.- también estos códigos fueron utilizados en este programa los cuales quedan grabados para próximos programas. Muchas gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas