Visual Basic - Macro con problemas para el pegado especial

Life is soft - evento anual de software empresarial
 
Vista:
Imágen de perfil de Angelo88
Val: 5
Ha disminuido su posición en 2 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Macro con problemas para el pegado especial

Publicado por Angelo88 (3 intervenciones) el 29/08/2018 07:10:58
Buen dia como puse en la descripción tengo problemas con el pegado especial, les comento rápido, tengo que escanear todo los días al personal de la empresa en las actividades que están haciendo cada día, para esto solo requiero su identificacion y el de su operación, con estos datos obtengo otros como el nombre, la hora, la fecha, el tipo de operación, etc. cuando Ya tengo esta información una macro de boton me copia todo el rango que sería de A3:L3, lo copia, busca el siguiente renglón vacío de la hoja que le mando y lo pega, hasta ahí sin Problemas se va creando la base de datos. La situación es cuando es más de una operación, cree un evento que al ingresar el código del operador habré un cuadro de texto preguntando si es solo uno o varios, cuando es varios se desocultan (no se si este bien dicho) 14 renglones más que aparentemente están en blanco, como ya use el evento de la hoja no puedo poner otra macro que me inserte fórmulas al ingresar datos en la siguiente fila, por lo que se me ocurrió usar la formula IF y condicionarla para que en caso de haber datos en la celda que le especifico haga la fórmula que correspondería y en caso de no tener datos que no mostrara ningún dato, yo creyendo que la celda Quedaría sin valores, la fórmula quedarian así IF(D4>0,C3,””) y efectivamente si no hay datos yo no veo nada y en caso de haberlo si se muestra correctamente. El problema surge cuando activo la macro que copia y pega los valores, porque como lo dije anteriormente se abren más filas entonces el rango que copia ahora es de A3:L17 y efectivamente lo pega, pero las filas que están en blanco ya sea porque no se usaron es decir no había datos en la fila en cuestión que activara las formulas, pareciera que si copia datos, es decir copia el rango A3:L17, busca el siguiente renglón vacio y lo pega sin problemas pero cuando ingresó a un nuevo operador igual copia el rango pero no busca el siguiente renglón vacío para pegarlo si no que lo pega en el renglón que seguí después de haber pegado la información eso hace que haya espacioa hasta de 14 filas sin datos visibles, no se si es problema de la macro o de las fórmulas, como dato adicional intente correr la macro sin que hubiera fórmulas en ese rango y efectivamente lo pega justo en el siguiente renglón. Entonces no se si quizá el problema sea que al usar la condición “” algo se quede oculto en la celda y sea lo que se esté copiando.





De antno muchas gracias y perdón por toda la explicación creo que es demasiado pero quería explicarme a detalle.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.097
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Macro con problemas para el pegado especial

Publicado por Antoni Masana (395 intervenciones) el 29/08/2018 08:55:06
Creo entender más o menos el problema que tienes. Lo que no se es lo que haces, no lo que dices que haces.

Entiendo que cuando que cuando una persona hace una sola operación la cosa funciona bien, pero cuando hay varias la cosa falla porque deja filas en blanco que la macro no es capaz de identificar con la siguiente entrada de datos.

La única forma de ayudarte es que subas un fichero de ejemplo, con sus datos, unos ejemplos de entrada correcta y fallida, y las correspondientes explicaciones para realizar la prueba.

Si en la macro pones POPO donde debería poner PEPE como lo voy a saber si no lo veo y tu que lo ves no te has dado cuenta como puedo decirte donde esta el error.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Miguel
Val: 5
Ha disminuido su posición en 2 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Macro con problemas para el pegado especial

Publicado por Miguel (3 intervenciones) el 29/08/2018 14:32:53
Capture


Anexo foto y el fichero, la macro que hace ese pegado se llama "AgregarRegistroDiario"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.097
Bronce
Ha mantenido su posición en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Macro con problemas para el pegado especial

Publicado por Antoni Masana (395 intervenciones) el 30/08/2018 10:25:52
Primeros cambios:

En la hoja Registro he modificado la formula de A3, C3 y E3 para que no de error.

En la macro AgregarRegistroDiario
- Mira si hay datos a copiar.
- Cuenta las línes a copiar.
- Busca la primera fila vacia.
- Copia los datos.

La forma en que Excel te dice que puedes ir a la última línea es verdad y mentida a la vez:

Es verdad porque va a la última línea que hay datos
Pero es mentira porque aunque borres el contenido para el Excel siguen siendo celdas con datos y siempre va a la última que hubo datos y a veces esto puede ser molesto y confuso.

Por esta razón utilizo el WHILE para buscar la primera fila vacía

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Sub AgregarRegistroDiario()
    Dim Fila As Long, Last_Row As Integer
 
    Sheets("Registro").Visible = True
    Sheets("Registro").Select
    ActiveSheet.Unprotect
 
    ' ---&--- Mira si hay datos para agregar
 
    Fila = 3
    If Cells(Fila, "A") = "" Then
       MsgBox "No hay datos para agregar", vbCritical, "SIN DATOS"
       Exit Sub
    End If
 
    ' ---&--- Cuenta el número de lineas
 
    While Fila <= 17 And Cells(Fila + 1, "D") <> ""
          Fila = Fila + 1
    Wend
 
    ' ---&--- Copia las líneas
 
    Range("A3:L" & Fila).Select
    Selection.Copy
 
    ' ---&--- Busca la primera fila Vacia
 
    Last_Row = 24
    While Cells(Last_Row, "D") <> ""
          Last_Row = Last_Row + 1
    Wend
 
    ' ---&--- pega los Datos
 
    Range("A" & Last_Row).Select
    Selection.PasteSpecial Paste:=xlPasteValues, _
                           Operation:=xlNone, _
                           SkipBlanks:=False, _
                           Transpose:=False
 
    ' ---&--- Deja las filas ocultas
 
    Range("B3,D3,I3,D4:D17").Select
    Range("B3,D3,I3,D4:D17").Activate
    Selection.ClearContents
 
    ActiveSheet.Unprotect
    Range("D4:D17").Select
    Selection.Locked = True
    Selection.FormulaHidden = False
    Rows("4:17").Select
    Selection.EntireRow.Hidden = True
 
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    Range("B3").Select
End Sub

En la macro de la hoja registro he puesto que verifique que el código de empleado es correcto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim x As Byte
 
    'se controla el rango B3
 
    If Intersect(Target, Range("B3")) Is Nothing Then Exit Sub
 
    'si algo cambió en el rango de datos, evalúo el resultado que lo tengo en A8
 
    If Range("B3") > 0 Then
 
        If Cells(3, "C") = "" Then
           MsgBox "Este emplado no existe", vbCritical + vbOKOnly, "ERROR CODIGO"
           Range("B3").Select
           Exit Sub
        End If
 
        x = MsgBox("Son varias JDS?", 32 + 4, "Portal de entrenamiento")
        If x = 6 Then
            ActiveSheet.Unprotect
                Rows("3:19").Select
                Selection.EntireRow.Hidden = False
                Range("D4:D17").Select
                Selection.Locked = False
                Selection.FormulaHidden = False
                Range("D3").Select
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        Else
            Range("D3").Select
        End If
    End If
End Sub

Quízas hay más cosas que corregir o mejorar pero de momento y contestando a tu inquietud solo de estos.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Miguel
Val: 5
Ha disminuido su posición en 2 puestos en Visual Basic (en relación al último mes)
Gráfica de Visual Basic

Macro con problemas para el pegado especial

Publicado por Miguel (3 intervenciones) el 30/08/2018 14:18:49
Agradezco mucho su respuesta ahora mismo lo pruebo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar