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

Respuesta
1

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)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas