Macro para modificar campo de un registro
Necesito que alguien me ayude con una macro. Tengo un formato o plantilla en Excel 2007, los datos que se diligencian en ésta se copian con una macro en otra hoja, registro por registro (desde la columna A hasta la Columna AY), creando una base de datos, lo que necesito es poder llamar un registro ya guardado en la BD con una número único o llave y poder modificar algún(os) de los campos, por ejemplo, cambiar un campo llamado Estado y cambiarlo de "Registrado" a "Solucionado" y que en lo posible pueda tener el dato de la hora y fecha en que se realizó éste cambio, si es posible que también me regalen una macro para eliminar todo un registro.
1 respuesta

Se puede hacer lo que solicitas pero tienes que ser muy exquisito que campos te gustaría poder modificar. Para ello, si me lo puedes explicar más detalladamente y además colocar una foto, facilitaría el trabajo.
Para la fecha y hora, como añadir otro campo podría ser un follón para tus plantillas y no solo eso, sino que necesitarías un campo por cada dato modificado. Podría ser un auténtico desastre o vete tu a saber como quedaría la cosa. Te propongo para ello añadir un comentario o modificar si ya tuviera alguno con la información solicitada.
Para eliminar un registro tampoco habrá pegas mientras sea a través de un dato único.

Hola mfervic voy a explicarlo con más detalle, en la hoja 1 tengo una plantilla dibujada en excel 2007 (.xlm) con 50 campos aprox., con una macro copia todos éstos registros y los pega en la hoja 2 (creando una BD desde la columna A hasta la columna AY), en la hoja 3 tengo una plantilla igual a la de la hoja 1, pero ésta es una consulta, es decir, con un número único llamo todo un registro anteriormente guardado en la hoja 2 (BD), lo que requiero es que en la hoja 3 que es una consulta, poder hacer el llamado a un registro y en un campo llamado "Estado" poder cambiar de estado "Registrado" a "Solucionado" y otros campos que quizá en el desarrollo vea que son necesarios. Adicionalmente, poder en la misma plantilla de consulta, hacer un botón para eliminar el registro.
No sé si me he hecho entender, espero haber sido clara. Agradezco tu ayuda.

Vamos a ello. Abre el proyecto y crea un módulo donde pegarás el código que te escribo:
Option Explicit
Function comprobar_cod(cod As Variant, ByRef i As Integer, ByRef r As Integer) As Boolean
'Importante!
'cambia la letra de la columna de los códigos por la real
'la fila es irrelevante por lo que elige la primera que contenga código
Const codes = "A1"
Dim c As Integer
'me posiciono en la primera celda donde empiezan los códigos
Range(codes).Select
r = ActiveCell.Row
c = ActiveCell.Column
i = 0
Do While Cells(r + i, c).Value <> cod And Cells(r + i, c).Value <> "" i
= i + 1
Loop
If Cells(r + i, c).Value = cod Then
comprobar_cod = True
Else: comprobar_cod = False
End If
End Function
Sub B_ESTADO_click()
On Error Resume Next
'Importante!
'cambia la letra de la columna estado por la real
'la fila es irrelevante por lo que elige la primera que contenga datos
Const status = "B1"
'tipo de estado
'modifica esta constante si en un futuro quieres cambiar el nombre
Const nom_estado = "Solucionado"
'Variables para el proceso
Dim cod As Variant
Dim dato As String, comentario As String
Dim i As Integer, r As Integer, c As Integer
Application.ScreenUpdating = False
código:
cod = Application.InputBox("Introduzca número de código (Cancelar para salir)")
If cod = False Then
Exit Sub
ElseIf cod = "" Then
MsgBox "No ha introducido ningún código. Vuelva a intentarlo.", vbOKOnly + vbExclamation
GoTo código
Else:
cod = CDbl(cod)
If comprobar_cod(cod, i, r) = False Then
MsgBox "No existe el código " & cod & " en el registro. Imposible continuar.", vbOKOnly + vbExclamation
Exit Sub
End If
End If
'modifico el dato estado
c = Range(status).Column
dato = Cells(r + i, c).Value
Cells(r + i, c).Value = nom_estado
'añado el comentario al estado
comentario = Now
Cells(r + i, c).Comment.Delete
Cells(r + i, c).AddComment comentario
MsgBox "Se ha modificado el estado del código " & cod & " del estado " & dato & vbCrLf & _
" al estado " & nom_estado, vbInformation + vbOKOnly
End Sub
Sub B_ELIMINAR_Click()
On Error Resume Next
'Importante!!!!!!
'cambia la letra de la columna de los códigos por la real
'la fila es irrelevante por lo que elige la primera que contenga código
Const codes = "A1"
Dim cod As Variant
Dim respuesta As String
Dim i As Integer, r As Integer, c As Integer
Application.ScreenUpdating = False
código:
'pregunto por el código a eliminar
cod = Application.InputBox("Introduzca número de código a eliminar (Cancelar para salir)")
If cod = False Then
Exit Sub
ElseIf cod = "" Then
MsgBox "No ha introducido ningún código. Vuelva a intentarlo.", vbOKOnly + vbExclamation
GoTo código
Else:
cod = CDbl(cod)
If comprobar_cod(cod, i, r) = False Then
MsgBox "No existe el código " & cod & " en el registro. Imposible continuar.", vbOKOnly + vbExclamation
Exit Sub
End If
End If
c = Range(codes).Column
Cells(r + i, c).Select
respuesta = MsgBox("¿Está seguro de que quiere eliminar el código " & cod & " de la lista?", _ vbYesNo + vbQuestion)
If respuesta = vbYes Then
'redimensiono la selección y la elimino
Selection.EntireRow.Select
Selection.Delete
Else:
Exit Sub
End If
Range (codes).Select
Application.ScreenUpdating = True
End Sub
Ahora en tu hoja3 create dos botones. Uno para el sub estado y otro para el sub eliminar.

Hola Mfervic, te agradezco mucho por tu aporte, pero tengo un problema con la sintaxis de la función en la línea "Do While Cells(r + i, c).Value <> cod And Cells(r + i, c).Value <> "" i
= i + 1" y en el Sub B_ELIMINAR_Click() en la línea "respuesta = MsgBox("¿Está seguro de que quiere eliminar el código " & cod & " de la lista?", _ vbYesNo + vbQuestion)". Me puedes ayudar... gracias.

Perdoname. Ha sido un error que he tenido al copiar y pegar. Te lo escribo correcto:
1er problema: Bucle
Do While Cells(r + i, c).Value <> cod And Cells(r + i, c).Value <> ""
i= i + 1
Loop
2º problema: pregunta eliminar
respuesta = MsgBox("¿Está seguro de que quiere eliminar el código " & cod & " de la lista?", vbYesNo + vbQuestion)
Para aclararte más el tema. En la primera línea, era la i que debia ir con i=i+1; en la segunda línea era el guión bajo que sirve para cuando tienes una línea larga de código poder pasar a la siguiente aunque para vba sigue siendo la misma.
Lo siento por los errores.

Hola mfervic Funcionó a la perfección, sólo que cambié la columna para que no genere otra columna con el cambio, sino que lo haga en el mismo campo, teniendo en cuenta que corresponde a una estructura de archivo definida. Una pregunta (espero que sea la última), cómo cambio el código para que puede hacer el cambio no solo en un campo, sino en varios con la plantilla de consulta de la hoja 3???... recuerda que tengo una plantilla dibujada en excel donde consulto con un código único, trayendo toda la información con un BuscarV y necesito cambiar o eliminar varios campos digitando el campo llave en mi plantilla. Qué pena, soy un poco lenta con ésto, pero es un proyecto que necesito que haga éstos cambios. Muchas gracias por tu tiempo y dedicación. :)

Hola Mfervic, también se me olvidó comentarte, creé los dos botones en la hoja 3 pero No funcionó, los creé en la hoja 1 donde tengo los datos y ahí si logré hacerlo funcionar, necesito que funcione NO desde la hoja 1 sino desde la hoja 3 que es donde tengo la plantilla, qué pena ponerte con tanta molestia. Saludos. Viviana.

Respecto a como poder modificar más columnas de la hoja3, se puede hacer añadiendo las constantes pertinentes para cada columna (como se ha hecho con la columna estado) y en el grupo de instrucciones donde se gestionaba el estado del código utilizar el grupo de instrucciones Select Case - End Select donde eligiendo una opción, me efectúe mis necesidades. Evidentemente, la opción de modificar el estado sería una de todas las que pusieses.
Con respecto a los botones, debería de funcionar ya que los sub, es se ejecutan dentro de la hoja donde se encuentren éstos ya que en ninguna parte del código se especifica una hoja de trabajo. También puede ser que en la hoja3, los códigos los trate como texto. Para ello, quita la instrucción cod = CDbl(cod) y colocala debajo del application. Inputbox en ambos sub, s, así:
cod = Application.InputBox("Introduzca número de código (Cancelar para salir)")
cod = CDbl(cod)
- Compartir respuesta
