Actualizar datos en base de datos

¿Cómo agrego la opción de que antes de realizar una búsqueda nueva, o bien agregando un botón nuevo, actualice cualquier dato que se modifique, directamente en la base?
En lectura simple sería: Hoja Búsqueda: Si se modifica cualquier dato, en rango (A13:H50), entonces, buscar dato original y actualizar información en Hoja Base.
Pero tendría que estar asociado a la macro que ya tengo... Entonces, al modificar el dato, tendría que aparecer un cartel, preguntando si quiero actualizar la información en la hoja Base...

1 respuesta

Respuesta
2

Creo que tu consulta quedó sin respuesta porque no se comprende bien.

Cuando ya tienen una macro es importante que la escriban o por lo menos la parte que luego hay que ajustarla con el agregado.

Así que ha falta de información, pongamos imaginación y te comento que para controlar los cambios en un rango de celdas necesitas utilizar el evento Worksheet_Change y sería de este modo:

Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
'Controlo cambios en rango A13:H50 sinó cancela
If Intersect(Target, Range("A13:H59")) Is Nothing Then Exit Sub
'solicito confirmación
sino = MsgBox("¿Deseas modificar también la BASE?", vbQuestion + vbYesNo, "CONFIRMAR")
If sino <> vbYes Then
 'aquí las instrucciones si NO ACTUALIZA LA BASE
Else
 'aquí las instruccions para ACTUALIZAR LA BASE
End If
End Sub

Allí dentro del IF..Else..End If irán tus instrucciones o llamadas a tus otras rutinas.

Espero que con esto puedas avanzar. Si necesitas ayuda para la macro de actualización, finaliza esta consulta y en la nueva dejá las referencias (a qué hoja o libro, en qué col de datos se busca, etc)

Hola Elsa, muchas gracias...

esta es la macro que yo ya tengo: ingreso el texto a buscar y me trae todas las filas que coinciden con ese dato. En esas filas que traigo a la hoja 1, puede que yo quiera o necesite actualizar un dato, y lo que que quiero es si actualizo un dato en una fila, busque la fila original en la hoja 2 y actualice el dato correspondiente.

Hoja 1 = Buscador

Hoja 2 = Base de Datos

el orden en la base de datos es de la A2 a H2 hasta la fila 2000

TITULO
SUBTITULO
TOMO
APELLIDO
NOMBRE
EDITORIAL
STOCK
SECTOR

los datos que traigo, se ubican de igual forma, pero en las filas A13 a h13 y hacia abajo, dependiendo de la caintidad de coincidencias.

Ejemplo:

yo busco Borges, y me trae todas las filas que contienen la palabra Borges. Si yo viera que falta la editorial en alguna de las filas, quiero poder agregarla en la hoja Buscador, y luego que la macro busque la fila original y actualice el dato directamente ahí. Espero que ahora se entienda mejor.

Esta es la macro que ya tengo:

Dim algunaCoincidencia As Boolean
Dim Fila As Integer
Dim sede As String
Dim i As Integer, uFila As Integer, uColumna As Integer
Dim Hoja As Worksheet
Dim Rango As Range
Sub BuscarSede()
Hoja4.Activate
Range("A13:J45").ClearContents
Application.ScreenUpdating = False
sede = InputBox("Introduzca el texto de búsqueda")
If sede = Empty Then Exit Sub
sede = "*" & sede & "*" 'Añadimos los caracteres comodín al principio y al final
For Each Hoja In ThisWorkbook.Sheets
If Hoja.Name <> "Resumen" Then 'Esta es la hoja de resultados
Hoja.Activate
EncontrarSede Hoja
End If
Next
If algunaCoincidencia = False Then
MsgBox ("No se han encontrado coincidencias")
End If
End Sub
Sub EncontrarSede(Hoja As Worksheet)
'On Error GoTo salir
algunaCoincidencia = True
'Buscamos la última fila y columna de la hoja para acotar el rango
uFila = Hoja.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
uColumna = Hoja.Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
'Acotamos el rango
Set Rango = Range(Hoja.Cells(1, 1), Hoja.Cells(uFila, uColumna))
For Each celda In Rango 'Buscamos en todo el rango
If UCase(celda.Value) Like UCase(sede) Then 'Comparamos por parecido a
'On Error GoTo Hoja2Vacia
'Buscamos primera fila vacía en Hoja2
Fila = Hoja4.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 1
'Copiamos la fila de la Hoja en la Hoja2
Hoja.Rows(celda.Row).Copy Hoja4.Rows(Fila)
'Hemos encontrado coincidencia
algunaCoincidencia = True
End If
Next
Hoja4.Activate
Range("A13").Activate
Exit Sub '-----------------------------------------------
End Sub

lo que me enviaste está bien, ahora bien, yo tendría que agregarle a esto tuyo:

Private Sub Worksheet_Change(ByVal Target As Range)
'Controlo cambios en rango A13:H50 sino cancela
If Intersect(Target, Range("A13:H59")) Is Nothing Then Exit Sub
'solicito confirmación
sino = MsgBox("¿Deseas modificar también la BASE?", vbQuestion + vbYesNo, "CONFIRMAR")
If sino <> vbYes Then
'aquí las instrucciones si NO ACTUALIZA LA BASE
Else
'aquí las instruccions para ACTUALIZAR LA BASE
End If
End Sub

que si, se modifica, busque la fila en la hoja 2, y actualice los datos modificados en la hoja 1. Pero justamente eso es lo que no se me ocurre como hacer.... porque esta macro me ayudaron a hacerla...

En mi excel, la hoja Buscador es (hoja 4) y la hoja Base de Datos (hoja 1)

te lo aclaro porque sino se presta a confusión...

Gracias

¿Y cuál será la Hoja2?

EStás haciendo búsqueda por cualquier columna, ¿verdad? (En el ejemplo Borges entra en col Apellido) aunque también podría entrar en col Título (alguna obra o Biografía de Borges)

Lo que hay que hacer en este caso considerando que habrá duplicados en varias filas, es llevar además de los datos el nro de fila pero con tu macro no es posible, y antes de desarrollar una nueva confírmame si se hará búsqueda por cualquier col y si vas a mantener la solicitud del criterio desde un InputBox como lo tenías.

Sdos

Elsa

Hola Elsa!

Hoja 1 (Base de Datos)

Hoja 2 (Cargador) En esta hoja tengo una macro para cargar los datos en la base.

Hoja 4 (Buscador)

Respecto de la búsqueda, es correcto. Yo escribo "Borges" y me trae todas las filas que contienen la palabra, cualquiera sea la colummna en que se encuentre el nombre. Esto es porque a veces, la gente sabe el nombre del autor, a veces parte del titulo, o un dato minimo, entonces, para no recorrer las distintas opciones, lo que hacemos, es poner el dato que me dan, y traer todas las coincidencias.

De hecho, en la busqueda, si lo solo escribo "Bor", me va a traer todas las filas que contengan la esas tres letras.

El imputBox, quisiera que se mantenga, pero si no se puede, lo hacemos sobre una celda.

Muchas Gracias

El Input se mantiene pero es una de las pocas cosas que mantuve.

Para empezar le dí nombre a las hojas porque me hiciste un par de líos con los nros (en el texto dice Hoja4 pero en la macro Hoja1... entonces llamemos a las cosas x su nombre)

La macro de búsqueda., del módulo se simplifica a una sola:

Dim algunaCoincidencia As Boolean
Dim Fila As Integer
Dim sede As String
Dim i As Integer, uFila As Integer, uColumna As Integer
Dim Rango As Range
Sub EncontrarSede()
'Ajustada x Elsamatilde
Application.ScreenUpdating = False
'limpiamos la hoja Busqueda
Sheets("BUSQUEDA").Range("A13:J45").ClearContents
'solicitamos el criterio
sede = InputBox("Introduzca el texto de búsqueda")
If sede = Empty Then Exit Sub
sede = "*" & sede & "*" 'Añadimos los caracteres comodín al principio y al final
'trabajamos desde la base a la hoja Búsqueda
Sheets("BASE").Activate
'la copia se inicia en fila 13
Fila = 13
'Buscamos la última fila y columna de la hoja para acotar el rango
uFila = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
uColumna = ActiveSheet.Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
'Acotamos el rango
Set Rango = Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(uFila, uColumna))
'Buscamos en todo el rango
For Each celda In Rango
 If UCase(celda.Value) Like UCase(sede) Then 'Comparamos por parecido a
 'Copiamos la fila de la Hoja en la Hoja2
 ActiveSheet.Rows(celda.Row).Copy Sheets("BUSQUEDA").Rows(Fila)
 'agregamos a continuación el nro de fila. Nos hará falta para pasar los cambios
 Sheets("BUSQUEDA").Cells(Fila, 10) = celda.Row
 'Hemos encontrado coincidencia, INCREMENTAMOS LA FILA
 Fila = Fila + 1
 algunaCoincidencia = True
 End If
Next
'PASAMOS A LA HOJA
Sheets("BUSQUEDA").Select
Range("A13").Activate
If algunaCoincidencia = False Then
 MsgBox ("No se han encontrado coincidencias")
End If
End Sub

Y en el objeto HOJA = BUSQUEDA, va la otra que a cada cambio en alguna celda del rango te pregunta si pasar el cambio a la base o no, Por sí se fija en la fila que se agregó en col J y allí pasa el cambio.

Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
'Controlo cambios en rango A13:H50 sinó cancela
If Intersect(Target, Range("A13:H59")) Is Nothing Then Exit Sub
'solicito confirmación
sino = MsgBox("¿Deseas modificar también la BASE?", vbQuestion + vbYesNo, "CONFIRMAR")
If sino = vbYes Then
 'la fila del registro me lo dá la col J
 filax = Range("J" & Target.Row)
 'la col es la col de la celda modificada
 colx = Target.Column
 'copio todo el registro en la fila que corresponde según col J
 Target.Copy Sheets("BASE").Cells(filax, colx)
End If
End Sub

Probala y si todo está resuelto no olvides finalizar la consulta.

Sdos

Elsa

http://aplicaexcel.galeon.com/manual_VBA2010.htm

Hola Elsa... El buscador está genial, es decir, funciona a la perfección.

Mi duda radica en el private sub worksheet_change ... cuando presiono el botón buscador, antes de que ingrese cualquier dato, ya me pregunta si quiero realizar cambios en la base de datos, y cuando ingreso la palabra "borges" me pregunta 20 veces si quiero realizar cambios antes de que me muestre la lista de coincidencias.

Se puede modificar para que se ejecute mediante botón? es decir, por medio de otro botón? es decir, yo lo utilizaría solo en caso que se modifique un dato...

Muchas Gracias por tu ayuda...

No, vamos a impedir que se ejecute el Change al momento de pasarle datos agregando en la rutina del módulo las líneas en negrita (dejo algunas líneas más para ubicarte):

'agregamos a continuación el nro de fila. Nos hará falta para pasar los cambios
Application.EnableEvents = False
Sheets("BÚSQUEDA").Cells(Fila, 10) = celda.Row
'Hemos encontrado coincidencia, INCREMENTAMOS LA FILA
Fila = Fila + 1
algunaCoincidencia = True
Application.EnableEvents = True
End If

También en la rutina de la hoja, vamos a agregar una línea para que no se ejecute cuando borres el rango manualmente o cuando la macro limpie el rango para una nueva búsqueda. Agregá la línea en negrita:

Private Sub Worksheet_Change(ByVal Target As Range)
'x Elsamatilde
'si hay cambios en + de 1 celda es que se está borrando y no hace falta ejecutar este evento
If Target.Count > 1 Then Exit Sub


Sdos

Elsa





Realmente Genial!!!!! lo mas significativo es que lograste comprender lo que buscaba, con los datos que te di, que en algún momento fueron confusos... Muchas gracias por resolverme este problema.... MUCHÍSIMAS GRACIAS!!!!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas