Validar datos antes de copiar

Necesito ayuda con un macro para EXCEL profesional plus 2013.

Parto de la base de que yo no tengo ni idea de programación VBA, y lo que voy haciendo es a base de corta pega y modificaciones deductivas, por lo que el código que aquí os pondré, seguramente se podrá hacer mucho más sencillo y eficaz.

Tengo una tabla en la cual ingreso unos datos, y mediante un botón macro los copio a una tabla de registro.

Quisiera que al ejecutar el macro validara que varias celdas contengan información y no estén en blanco antes de copiar, saltando un aviso de que falta información y no se ejecute la copia al registro.

Las celdas en cuestión son: C3 (código), D3(fecha) y después tengo 6 combobox en la que al menos alguno debe contener datos, así como sus casillas relacionadas.

Ejemplo: Combobox1. Me devuelve el valor seleccionado en la casilla G7, y en la celda C7 van (unidades) y D7 (lote). Así hasta el Combobox6 las casillas G12, C12 y D12.

Yo he buscado alternativas por internet y he probado varios macros, pero no consigo hacer lo que quiero. Ahora mismo solo lo tengo con el combobox1, ya que no se hacerlo con la condición de que al menos alguno de los combobox contenga datos (con sus correspondieste casillas de unidades y lote relacionadas). Aun así, lo que tengo tampoco me funciona bien. Tanto el código cliente, como la fecha o el lote, solo quiero que me avise que están vacías, pero que pueda continuar con la macro dejando cualquiera de esas casillas en blanco. La cuestión es que si por ejemplo la fecha y el lote están ambas en blanco, ahora mismo me saltaría el aviso de "falta fecha", y no me avisa de la falta de lote.

Esto es lo que tengo ahora mismo:

Sub Registro()

If Range("G7") = "-" Then

MsgBox ("NO HAY NINGUN PRODUCTO SELECCIONADO")
Exit Sub

Else
If Range("C7") = "" Then
MsgBox ("NO HAY UNIDADES DE PRODUCTO")
Exit Sub

Else

If Range("C3") = "" Then
MsgBox ("FALTA CODIGO CLIENTE")

Else
If Range("D3") = "" Then
MsgBox ("FALTA FECHA")

Else
If Range("D7") = "" Then
MsgBox ("NO HAY LOTE INTRODUCIDO")

End If
End If
End If
End If
End If

continuar = vbYes
respuesta = MsgBox("¿Desea copiar datos al registro?", vbYesNoCancel)
Select Case respuesta
Case vbYes
Dim filalibre As Integer
filalibre = Sheets("REGISTRO").Range("C65536").End(xlUp).Row + 1
Sheets("REGISTRO").Select
Sheets("REGISTRO").Cells(filalibre, 2) = ActiveSheet.Range("C3")
Sheets("REGISTRO").Cells(filalibre, 3) = ActiveSheet.Range("G3")
Sheets("REGISTRO").Cells(filalibre, 4) = ActiveSheet.Range("D3")
Sheets("REGISTRO").Cells(filalibre, 5) = ActiveSheet.Range("E3")
Select Case ActiveSheet.Range("G7").Value
Case Is = "HTC50"
colx = 6
Case Is = "HTC100"
colx = 8
Case Is = "HTC325"
colx = 10
Case Is = "HTD50"
colx = 12
Case Is = "HTD100"
colx = 14
Case Is = "HTD325"
colx = 16
Case Is = "HTD925"
colx = 18
Case Is = "HS50"
colx = 20
Case Is = "HS100"
colx = 22
Case Is = "HS325"
colx = 24
Case Is = "ERIZO"
colx = 26
Case Is = "LT450"
colx = 28
Case Is = "LT2000"
colx = 30
End Select
Sheets("REGISTRO").Cells(filalibre, colx) = ActiveSheet.Range("C7")
Sheets("REGISTRO").Cells(filalibre, colx + 1) = ActiveSheet.Range("D7")
...

Respuesta
1

Hay algunos detalles que no veo en tu macro:

  • Por ejemplo, en la columna "C" de "Registro" guardas la celda "G3", pero no explicaste qué tienes en en esa celda "G3" y si la celda está vacía, entonces en "Registro" en la columna "C" guardarás un vacío, eso no ayuda a encontrar última fila de datos de la columna "C" ya que tendrás un vacío.
  • Dices que quieres al menos un combo con datos, ¿pero pueden existir varios combos con datos?
  • Por qué verificas si en la celda tienes un guión "-"
  • En tu código veo que dependiendo del dato se asigna una columna, qué columnas aplican para cada combo
  • Los datos "HTC50", "HTC100", ¿etc los tienes en alguna hoja?, cómo se llama la hoja, ¿en cuál columna?, en la siguiente columna podrías poner el número de columna correspondiente.

Envíame tu archivo y me explicas cada punto en ese orden.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “daniel calvo

Te anexo la macro actualizada

Sub Registrar_Datos()
'Por.Dante Amor
    Set h1 = Sheets("REGISTRO")
    Set h2 = Sheets("PRODUCTOS")
    '
    'Validaciones
    'Código cliente, fecha o lote, solo quiero que me avise que están vacías,
 'pero que pueda continuar con la macro dejando cualquiera de esas casillas en blanco
    '
    If h1.Range("C3") = "" Then
        MsgBox "Falta el código de cliente", vbExclamation
    End If
    If h1.Range("D3") = "" Then
        MsgBox "Falta la fecha", vbExclamation
    End If
    If h1.Range("G3") = "" Then
        MsgBox "Falta el Albarán", vbCritical
        Exit Sub
    End If
    '
    existe = False
    cad_uds = ""
    cad_lot = ""
    For i = 6 To 11
        'valida combos
        If h1.Cells(i, "G") <> "-" Then
            existe = True
            'valida unidades
            If h1.Cells(i, "C") = "" Then
                cad_uds = cad_uds & "C" & i & "."
            End If
            'valida lotes
            If h1.Cells(i, "D") = "" Then
                cad_lot = cad_lot & "D" & i & "."
            End If
        End If
    Next
    '
    If existe = False Then
        MsgBox "No hay productos seleccionados" & vbCr & vbCr & _
               "El proceso se detendrá", vbCritical
        Exit Sub
    End If
    If cad_lot <> "" Then
        MsgBox "No hay Lotes en las celdas : " & cad_lot & vbCr & vbCr & _
               "Presiona Aceptar para continuar", vbExclamation
    End If
    If cad_uds <> "" Then
        MsgBox "Se reguieren Unidades en las celdas : " & cad_uds & vbCr & vbCr & _
               "El proceso se detendrá", vbCritical
        Exit Sub
    End If
    '
    'Registrar los datos
    u = h1.Range("C" & Rows.Count).End(xlUp).Row + 1
    h1.Cells(u, "B") = h1.Range("C3")   'cod cliente
    h1.Cells(u, "C") = h1.Range("G3")   'albaran
    h1.Cells(u, "D") = h1.Range("D3")   'fecha
    h1.Cells(u, "E") = h1.Range("E3")   'nom cliente
    '
    For i = 1 To 6
        If h1.OLEObjects("ComboBox" & i).Object.ListIndex > 0 Then
            fila = h1.OLEObjects("ComboBox" & i).Object.ListIndex + 2
            col = h2.Cells(fila, "C")
            h1.Cells(u, col) = h1.Cells(i + 5, "C")
            h1.Cells(u, col + 1) = h1.Cells(i + 5, "D")
        End If
    Next
    MsgBox "Datos registrados", vbInformation
End Sub

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas