Utilizar Buscar y Reemplazar en Excel con macros vba

Una opción viable para aprender macros en Excel es utilizando la grabadora de macros, aunque la mayoría de las veces, las macros generadas se tendrán que modificar a nuestros propósitos.
La funcionalidad de Excel de buscar y reemplazar, es una de las herramientas más socorridas por los usuarios. Lo interesante radica cuando queremos adecuarlo a nuestras macros.
Ver video Utilizar un ComboBox como lista de búsqueda en Excel
Suscríbete al canal de EXCELeINFO en YouTube para aprender más de Excel y macros.
Si utilizamos la grabadora de macros para obtener el código de buscar, la macro que nos arrojaría sería:
Sub Macro1() ' ' Macro1 Macro ' Macro grabada el 18/11/2010 por Sergio A Campos H ' ' Cells.Find(What:="EXCELeINFO", After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate End Sub
Si utilizamos la grabadora de macros para obtener el código de reemplazar, la macro que nos arrojaría sería:
Sub Macro2() ' ' Macro2 Macro ' Macro grabada el 18/11/2010 por Sergio A Campos H ' ' Cells.Find(What:="EXCELeINFO", After:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False).Activate ActiveCell.Replace What:="EXCELeINFO", Replacement:="exceleinfo", LookAt _ :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _ ReplaceFormat:=False Cells.FindNext(After:=ActiveCell).Activate End Sub
Como la manera de utilizar la herramienta de buscar y reemplazar es mediante un formulario, la grabadora de macros arroja el código de todas las opciones del formulario utilizado, pero realmente, a menos que sí necesitemos buscar algún texto con más exactitud, la macro se podrá sintetizar de manera que ocupemos menos espacio en memoria y sea más ágil.
Ejemplos de macros:
Sub Prueba_buscar() Cells.Find(What:="EXCELeINFO", After:=ActiveCell).Activate End Sub ' Sub Prueba_reemplazar() Cells.Replace What:="EXCELeINFO", Replacement:="exceleinfo" End Sub
Descarga el archivo de ejemplo
Utilizar un ComboBox como lista de búsqueda en Excel.rar
Gran post. Gracias
y si por ejemplo tengo una cadena “abcd1hjj1h”, y quiero reemplazar (o borrar) únicamente los dos últimos elementos (1h), ¿como lo hago para que no me borre también los que están en medio?
abcd1hjj1h –> abcd1hjj
Utiliza la siguiente macro para eliminar los dos últimos dígitos:
Sub test()
largo = Len(ActiveCell)
ActiveCell.Value = Left(ActiveCell.Value, largo – 2)
End Sub
Saludos !!
si quiero que me muestre en un formulario digamos la categoria que esta en la columna b y muestre su codigo que esta en la columna a ? como seria?
Hace unos días publiqué un video donde explico la función BUSCARV en un formulario. Te paso el link para que lo revises y comentes cómo te fue: http://exceleinfo.wordpress.com/2012/02/05/video-tutorial-1-uso-de-buscarv-con-vba/
lo logre efectivamente incluso con un label1 en vez de textbox2 pero necesito que sea automatico es decir si se ingresa personal1 en textbox1 automaticamente en label 1 aprarece la edad intente poniendolo asi
Private Sub TextBox1_Change()
Dim nombre As String
Dim Rango As Range
Set Rango = Sheets(1).Range(“A1:B4”)
nombre = Application.WorksheetFunction.VLookup(Me.TextBox1.Value, Rango, 2, 0)
Me.Label1 = nombre
End Sub
donde textbox1 es donde sale el nombre y label1 sale la edad
La cuestión aquí es que la macro se estará ejecutando cada vez que se captura un carácter, lo cual ocasionaría error desde el principio. Si deseas aún así utilizar ésta manera, puedes hacerle una modificación al código:
Private Sub TextBox1_Change()
Dim Nombre As String
Dim Rango As Range
On Error Resume Next
Set Rango = Sheets(1).Range(“A1:B4”)
Nombre = Application.WorksheetFunction.VLookup(Me.TextBox1.Value, Rango, 2, 0)
Me.Label1.Caption = Nombre
On Error GoTo 0
End Sub
que me recomenarias usar de manera que no tenga que presionar un boton para obtener el codigo… se podria utilizar el combobox como un activante de cambio? porque en realidad debo usar un combobox en vez de un textbox
creo que lo logre mir loq ue hice:
Private Sub UserForm_Initialize()
Range(“A2”).Select
Do While ActiveCell Empty
ComboBox1.AddItem ActiveCell.Value
ActiveCell.Offset(1, 0).Select
Loop
End Sub
Private Sub ComboBox1_Change()
Dim nombre As String
Dim Rango As Range
Set Rango = Sheets(1).Range(“A1:B4”)
nombre = Application.WorksheetFunction.VLookup(ComboBox1, Rango, 2, 0)
Me.Label1 = nombre
End Sub
utilizando los nombres por dfecto
lo mando de nuevo porque no se mostraron unos caracteres por el font…
Para llenar el combo no te sugiero el Do While, ya que si tuvieras algún espacio vacío te dejará fuera los demás datos.
Te sugiero uses la siguiente manera para llenarlo:
Private Sub UserForm_Initialize()
Me.ComboBox1.RowSource = “A1:A4”
End Sub
Además de que son menos líneas y más sencillo.
tenes toda la razon es ma sencillo y menos codigo menos consumo derecursos menos por consiguiente menos kbs de peso
hola buen dia,
quiesiera saber si se puede reemplazar solo una fila o solo una columna con ese comando
o alguna forma de remplazar esto.
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.Find(What:=”60000″, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
ActiveCell.Replace What:=”60000″, Replacement:=y, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Cells.FindNext(After:=ActiveCell).Activate
GRACIAS
De manera mas simple …. solo cambiar una fila y no toda la hoja.
Sub byr()
Dim x As Variant
Dim y As Variant
x = InputBox(“buscar”)
y = InputBox(“reemplazar por “)
Cells.Replace What:=x, Replacement:=y
End Sub
Aquí lo que necesitas es que la búsqueda y el reemplazo se realice en el rango que tú quieras.
En la parte que dice Cells.Replace … ahí nos indica que busque en todo el libro, pero si cambias algo así como Range(“A:A”).Replace … ahí sólo buscará en la columna A.
Funciono perfecto, Gracias.
Hasta ahora estoy aprendiendo sobre todo esto, creo que estare pasando por aca mas seguido,
Saludos
Son bienvenidos todos los apasionados de Excel !!
tengo 10 columnas con informacion y en tres de ellas teno nombre ap-paterno y ap-materno
usando vba tengo textbox 1 2 y 3 como puedo buscar en la lista el nombre completo si lo tengo separado en 3 columnas?
de antemano gracias por la ayuda
Te sugiero hacer una columna adicional donde concatenes los 3 datos, así tu búsqueda será mejor.
Hola quiero saber si me puedes ayudar es que tengo un formulario en el que tengo varios TextBox digamos nombre documento y varios datos personales, quiero poder llamar los datos por el textbox nombre y navegar como autocompletar para llegar a un dato especifico visualizado en un ListBox al dar click sobre el resultado del ListBox que me cargue los datos en los textbox que me permita modificarlos, me guarde los cambios o me permita eliminar .
te agradezco la ayuda es que estoy varado en ese pedazo.
Hola.
No voy a dar “jaboncillo” acerca de lo buena que es la página, ya que es evidente.
Llevo varios dias intentando el cambiar una fórmula por otra y he encontrado esta página, en la que con absoluta precisión se explica como hacer cambios en una celda. Pero estos cambios se refieren al contenido, no a la fórmula en sí misma.
Por ejemplo, y a mosdo de demostración, necesitaría cambiar el contenido de una celda:
=CARACTER(K7) por =CODIGO(K7). En el primer caso veríamos en la Celda “T” y una vez cambiado veríamos “56”.
Si este proceso lo hago con la grabadora de macros el cambio se realiza correctamente, pero cuando ejecuto la macro ya no se realiza.
Sub Macro1()
‘
‘ Macro1 Macro
‘ Cambiar formula
‘
‘
Cells.Replace What:=”Caracter”, Replacement:=”Codigo”, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End Sub
¿Que es lo que puede ocurrir para que esto no funcione cuando se ejecuta la macro?.
El metodo Range.Replace no tiene el parámetro LookIn (xlFormulas,xlValues,xlComments) que si tiene el método Range.Find. Pero con este método tampoco me localiza las celdas al ejecutar la macro, aunque si lo haya hecho al construir la macro con la grabadora de macros.
¿Alguna idea?
Gracias por tu atención.
No siempre el código grabado con macros, servirá posteriormente y vale sólo tomar fragmentos del código y adecuarlo.
Pero para este caso te recomiendo crear un macro que convierta la fórmula en texto para después hacer el reemplazo de tu texto. La macro sería esta:
Sub Reemplazar()
Dim FormulaOriginal As String
Dim FormulaNueva As String
FormulaOriginal = ActiveCell.FormulaLocal
FormulaNueva = Application.WorksheetFunction.Replace(FormulaOriginal, 2, 8, “CODIGO”)
ActiveCell.FormulaLocal = FormulaNueva
End Sub
Ya va de tu parte adecuarla a tus diferentes necesidades.
Gracias por tu rapidísima respuesta.
Como continuaba con la macro ya he hecho más o menos lo que me sugieres.
La macro la ejecuto desde otro libro ya que me interesa guardar los cambios en una hoja de otro libro diferente.
El esquema de la macro es el siguiente:
Selecciono todo el rango ocupado para cada hoja del libro a analizar
(“A1:” LibroAnalizar.Worksheets(NombreHoja).Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select)
Despues para cada celda del rango compruebo si es formula
If celda.HasFormula Then
En el caso de que sea formula compruebo que tenga la función que quiero sustituir
Texto = celda.FormulaLocal
y si lo tiene lo sustituyo y actualizo el contenido de la celda
R = ReemplazarTexto(Texto, TextoIni, TextoFin)
celda.FormulaLocal = R
finalmente cierro el libro salvando cambios
LibroAnalizar.Save
Funciona perfectamente.
El único inconveniente es que tarda mucho más (y cuando digo mucho más, es mucho más) que la función integrada de Buscar/Reemplazar.
Si lo consideras necesario limpio un poco el código, haciéndolo más genérico y os lo envio.
Amplio el mensaje anterior:
Para lo que necesito la macro de cambiar fórmulas es para saber en que celdas he realizado los cambios, o simplemente donde utilizo una determinada fórmula. Si no quisiera saber que celdas he cambiado sería suficiente la función integrada Buscar/Reemplazar de Excel, que si permitiera copiar el listado de celdas donde aparece una determinada cadena, haría innecesaria la macro.
Gracias por tu ayuda otra vez.
Lo que pasa con la macro es que sólo valida que la celda tenga fórmula y independientemente de cuál sea, intenta realizar el reemplazo, pero cuando se topa con una fórmula que no sea CARACTER arroja error. La siguiente macro también valida que la función que tenga la celda sea CARACTER y si no es, no hace nada, y reduciendo así el tiempo de ejecución:
Sub Reemplazar()
Dim FormulaOriginal As String
Dim FormulaNueva As String
On Error Resume Next
Range(“A1”).Select
ActiveSheet.Range(Selection, Selection.End(xlDown)).Select
For Each celda In Selection
FormulaOriginal = celda.FormulaLocal
Funcion = Mid(FormulaOriginal, 2, 8)
If celda.HasFormula Then
If Funcion = “CARACTER” Then
FormulaNueva = Application.WorksheetFunction.Replace(FormulaOriginal, 2, 8, “CODIGO”)
celda.FormulaLocal = FormulaNueva
Else
End If
Else
End If
Next celda
On Error GoTo 0
End Sub
Gracias. Perfecto.
Y si necesito buscar con un botón, dentro de una columna en particular, el texto que se ingresa en un cuadro de texto? Lo que necesito hacer es lo siguiente:
Tengo una lista de nombres, apellidos, direcciones, telefonos, etc, y quiero buscar todos los que se llamen “Pedro”, por ejemplo, y que las demas filas, que no poseen el nombre pedro, que se oculten, y luego con otro boton volver a mostrar todas las filas de la hoja… Como seria? Soy nuevo en esto… Se nota? jajajaja
Para lo que necesitas me suena más bien a aplicar un filtro por nombre, no crees ??
Cómo andas en tema de filtros ??
Estuve trabajando y pude hacer que funcione con esto:
Private Sub BotonBuscar_Click()
Captura.UsedRange.Rows.Hidden = True
Range(“1:1”).Select
Selection.EntireRow.Hidden = False
Dim X As Integer
For X = 2 To Captura.UsedRange.Columns.Count
Captura.Cells(X, 2).Find(What:=TBuscar.Text).Select
If TBuscar.Text = ActiveCell.Value2 Then
Selection.EntireRow.Hidden = False
Else
MsgBox (“No se Encuentra”): Exit Sub
End If
Next
End Sub
Pero tengo unos temitas, los que hasta ahora descubri:
1) Cuando no se encuentra lo que escribi, no me tira el MsgBox, sino que me sale error 91.
2) Cuando busco por lo primero que me aparece en la columna, me marca todo bien, cuando busco por lo segundo me salen 2 de 3, y cuando busco a partir de ahi, me sale solo 1…
Que podra ser???
Cuál es el objetivo de tu código, para qué usas Find dentro de un For ??
Puedes comentar por favor.
hola sergio, tengoun problema con la macros, espero puedas apoyarme:
deseo buscar dentro de una celda un nombre y crear una hoja con el nombre péro el problema es que el nombre trae titulos. Ejemplo:
Dr. Alejandro Perez
Ing. Antonio Perez
Lo que deseo es que solamente quede
Alejandro Perez
Antonio Perez
Y en base a ello crear nuevas hojas con su nombre.
e usado este codigo pero no funciona
nombre_docente = ActiveCell.FormulaR1C1
t1 = ActiveCell.FormulaR1C1 = “=FIND(“” “”,activecell,1)”
t2 = Len(nombre_docente)
nombre_docente = Mid(nombre_docente, t1, t2)
agradeceremucho el apoyo gracias
Hola Vincent:
Te envío un código con lo que te logré captar. Lo adecúas a tus necesidades:
Sub NuevasHojas()
Dim NombreEncontrado As Range
Pregunta = InputBox("Escribe el nombre a encontrar", "Nombre")
If Pregunta = "" Then Exit Sub
Set NombreEncontrado = Cells.Find(Pregunta, ActiveCell)
t1 = Application.WorksheetFunction.Find(Pregunta, NombreEncontrado)
t2 = Len(NombreEncontrado)
ActiveWorkbook.Sheets.Add
ActiveSheet.Name = Mid(NombreEncontrado, t1, t2)
End Sub
Estimado Sergio muchas gracias, por el apoyo
Hola,
estoy intentando maquetar unos test para examen que estoy estudiando. Los test vienen sin formato y he ido adaptando macros que he encontrado en la red para ir haciendo ciertos arreglos.
Me gustaría darle negrita a todas las líneas donde se encuentran las preguntas, pero no lo logro. Estaba tratando de hacerlo con el siguiente código, donde busca la palabra “PREGUNTA:” y con un código que encontré se supone que cambiaría la fila entera, pero no va. Igual es más complicado.
Sub Buscarycambiaranegrita()
currentCell.EntireRow.Font.Bold = True
Do Until IsEmpty(ActiveCell)
Cells.Find(What:=”PREGUNTA:”, After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Select
Loop
End Sub
Hace unos días que empecé a ver macros porque no encontraba ninguna solución a través del menú de Buscar y Reemplazar, así que más perdido que un pulpo en un garaje. 🙂
Saludos y gracias por este espacio que pones a nuestra disposición.
Suponiendo que las celdas donde tienes la palabra “PREGUNTA:” es el rango A1:A14 puedes utilizar el siguiente código. Sólo hay que modificar el rango que quieres validar.
Sub Negritas()
For Each Celda In Range("A1:A14")
If Celda.Value = "PREGUNTA:" Then
Celda.EntireRow.Font.Bold = True
End If
Next Celda
End Sub
Muchas gracias. Lo probé pero no me funciona porque no te di toda la información. A parte de “Pregunta:” en la misma celda está todo el texto de la pregunta.
Ejemplo:
Pregunta: ¿Cuántos son los meses del año?
Entonces tendría que encontrar “Pregunta:” más el resto. ¿Cómo se podría hacer, con un comodín que indique el resto del texto de la celda?
If Celda.Value = (“PREGUNTA:” & cualquier otra cosa) Then ???
Saludos y gracias de nuevo.
En la parte de la validación reemplaza la línea por esta:
If Left(Celda.Value, 9) = "Pregunta:" Then
Perfecto.
Un saludo!
Hola estoy buscando una macro que reemplace valores de una columna reasignando valores consecutivos es decir:
en mi columna inicial tengo valores del tipo ab_1, ab_2
y a cada par definido por el (_1) y( _2) reemplazarlos por numeros consecutivos crecientes de tal forma que la columna de resultados sea
ab_1 -> 1
ab_1 -> 1
ab_1 -> 1
ab_2 -> 1
ab_2 -> 1
ab_2 -> 1
ac_1 -> 2
ac_1 -> 2
ac_1 -> 2
ac_2 -> 2
ac_2 -> 2
ac_2 -> 2
¡Gracias por tu ayuda!
Estimado:
Tengo un Excel, con datos “en blanco” (con un guión) en algunas columnas.
Lo que requiero es saber como puedo rellenar esos datos, si se cumple la condición de que el valor de la columna anterior (misma fila) y de la siguiente (misma fila) es el mismo, vale decir:
A B C D
1) 3 – 3 4
2) 2 – 1 4
deseo que con la macro, quede así:
A B C D
1) 3 3 3 4
2) 2 – 1 4
Agradecería que me compartieras un ejemplo con lo que deseas.
Hola mi pregunta es como validar el codigo de busqueda
Sub Prueba_buscar()
Cells.Find(What:=”hola”, After:=ActiveCell).Activate
End Sub
si por ejemplo en mi hoja de excel no existe “hola” entonces que no me depure la macro, si no que me mande un mensaje de texto que me diga que no existe el dato.
muchas gracias por la ayuda
Que tal.
Para esto debes implementar un manejador de errores en tu código. A continuación te paso el link de un artículo desde este mismo Blog.
http://blogs.itpro.es/exceleinfo/2013/11/05/implementar-controlador-de-errores-en-excel-vba/
Esta genial, me gustaria saber como puedo covertir esta formula =SI(E7114=””;””;SIERROR((CONSULTAV(E7114;E:F;2;0));””)) ….. me explico, quiero hacer una macro en la cual yo ingrese cierto texto o numero en una celda inmediatamente busque y reemplaze las celdas siguientes con los datos correspondientes, es decir que por ejemplo en la celda A3: numero de cc y en B3: nombre, si mas adelante en A7114: ingreso un numero y este ya se encuentra en la base lo busque y en la celda B7114: ingrese automaticamente el nombre correspondiente… se puede???? es basicamente convertir la formula en formula para macro… quedo atento y agradezco su ayuda
Buen día Sergio, le agradecería si me puede ayudar. Estoy tratando de hacer un botón en una hoja de calculo llamada “Búsqueda” dentro de un libro que contiene 20 hojas “hoja1, hoja2, etc” necesito una macro que me haga una búsqueda de registros digamos un valor dentro de cada hoja y en todo el libro, me traiga la información no solo del registro buscado sino de toda la fila donde se encuentra dicho registro ejemplo: busco Valor “10000” debe traer nombre “Jose”, apellido “Perez”, Teléfono “45454555” y me los pegue en la hoja Búsqueda. si existen mas registros con el mismo valor “10000” en otras hojas del libro me haga la misma operación. Hasta el momento encontré la siguiente macro pero no la he podido adaptar, ya que solo trae un registro y la verdad no le entiendo la lógica ya que no soy experto.
Option Explicit
Sub Buscar()
Dim WS As Worksheet
Dim rBingo As Range
Borrar_Form
For Each WS In ThisWorkbook.Worksheets
If WS.Name Like “1*” Then
‘1* debe ser el nombre comun de las hojas en este caso 1
‘* el asterisco que sigue es para el resto del mobre comodin
Set rBingo = WS.Cells.Find(What:=[C4], lookat:=xlWhole)
If Not rBingo Is Nothing Then Exit For
End If
Next WS
If rBingo Is Nothing Then
‘ No encontrado
MsgBox “Valor ” & [C4] & ” no encontrado”, vbInformation, “Solicitudes CDP´s 2014”
Else
Copiar_Objeto WS, rBingo.Row
End If
End Sub
Sub Borrar_Form()
Dim rCell As Range
Set rCell = [Objeto]
Do While rCell “”
rCell.Offset(0, 1).Value = “”
Set rCell = rCell.Offset(1, 0)
Loop
[Nota].Value = “”
End Sub
Sub Copiar_Objeto(ByRef queWS As Worksheet, ByVal queFila As Long)
Dim rCell As Range
Set rCell = [Objeto]
On Error Resume Next
Do While rCell “”
rCell.Offset(0, 1) = queWS.Cells(queFila, queWS.Rows(1).Find(rCell.Value).Column)
Set rCell = rCell.Offset(1, 0)
Loop
On Error GoTo 0
[Nota].Value = “La información se encuentra en la hoja ” & queWS.Name & “, en la fila ” & Format(queFila, “#,##0”)
End Sub
Muchas gracias por la ayuda.
Buen dia Sergio, Me puedes ayudar tengo este codigo y no lo he podido acondicionar a mi necesidad. lo que busco o requiero es que me haga la busqueda de un registro en un libro por varias hojas y me traiga las coincidencias en una hoja llamada busqueda. pero que traiga todos los que encuentre. ejemplo si pongo valor 100 me busque y traiga los que se encuentran en la hoja 1, en la hoja 3, en la hoja 15…el codigo es el siguiente:
Option Explicit
Sub Buscar()
Dim WS As Worksheet
Dim rBingo As Range
Borrar_Form
For Each WS In ThisWorkbook.Worksheets
If WS.Name Like “Dir*” Then
Set rBingo = WS.Cells.Find(what:=[Codigo], lookat:=xlWhole)
If Not rBingo Is Nothing Then Exit For
End If
Next WS
If rBingo Is Nothing Then
‘ No encontrado
MsgBox “Código ” & [Codigo] & ” no encontrado”, vbInformation, “AM Consultores”
Else
Copiar_datos WS, rBingo.Row
End If
End Sub
Sub Borrar_Form()
Dim rCell As Range
Set rCell = [Datos]
Do While rCell “”
rCell.Offset(0, 1).Value = “”
Set rCell = rCell.Offset(1, 0)
Loop
[Nota].Value = “”
End Sub
Sub Copiar_datos(ByRef queWS As Worksheet, ByVal queFila As Long)
Dim rCell As Range
Set rCell = [Datos]
On Error Resume Next
Do While rCell “”
rCell.Offset(0, 1) = queWS.Cells(queFila, queWS.Rows(1).Find(rCell.Value).Column)
Set rCell = rCell.Offset(1, 0)
Loop
On Error GoTo 0
[Nota].Value = “El dato está en la hoja ” & queWS.Name & “, en la fila ” & Format(queFila, “#,##0”)
End Sub
Éste código lo estás desarrollanto tú ? Qué errores te da ?
Buen día Sergio, gracias por la pronta respuesta.
El código lo saque de la pagina http://www.excelnegocios.com donde baje un archivo y funciona perfecto pero al tratar de editarlo y acomodarlo a mi necesidad no me deja y se daña, lo otro es que cuando lo ejecuto normal en el archivo descargado solo busca un registro único y lo trae a la otra hoja pero no busca si existen mas de uno. no se como adjuntar el archivo para que lo puedas ver. pero esta en la pagina que puse y su nombre es Buscar-datos-en-todas-las-hojas-macros-excel .
Buenas tardes Sergio,
Tengo un problemilla a ver si tu me podias ayudar. Todos los días me desacrgo un fichero en el que el una de las columnas son fechas en el siguinete formato: 02.02.2015.
Normalmente hago buscar y reemplazr desde excel y ca,bio los “.” por “/” para excel me las reconozca como fechas.
Intentando automatizar el proceso a traves de VB cuando utilizo el codigo:
Selection.Replace What:=”.”, Replacement:=”/”
Me realiza los remplazos pero me invierte los meses y los días, es decir si el dato original es 06.02.2015, una vez pasa el codigo lo que me devuleve es 02/06/2015.
Agradecería cualquier solución que me pudieras dar.
Muchas gracias de antemano.
Saludos,
Fernando.
¿a mi también me pasa, pudiste solucionarlo?
Hola Fernando, no soy tan conocedor como Sergio, pero creo que la solucion es que selecciones y busques el punto y reeplazalo por el signo menos, sin comillas y ya, de pronto adicionalmente dale formato de fecha a las celdas seleccionadas.
Por VBA: Selection.Replace What:=”.”, Replacement:=”-“, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Att Jorge
Buenas Noches
Para todos, Quizas Sergio o alguien mas pudiera ayudarme con esto, requiero en un formulario hacer tres busquedas simultaneas, donde con tres combox me busque el valor de cada uno en una hoja especifica, diferente de las de los otros combobox y presente el resultado en el mismo formulario, pero en otros tres combobox o label mas amplios, donde se observe todos los datos de la fila donde se encontro el dato, incluyendo duplicados.
En formulario he usado la opcion de busqueda pero solo me bota el primer dato, intente directamente en una hoja de dartos con la funcion buscarv, y dandole nombre al rango de busqueda, pero solo me bota el primer dato, y buscando individualmente, en esa funcion emplee =SI.ERROR(BUSCARV(“*”&D1&”*”;datoz;8;0);”-“), pero adicionando en un modulo: Selection.SpecialCells(xlCellTypeFormulas).Select
para que funcionara, no se alguine tenga una mejor idea, de antemano, gracias
Te recomiendo que pegues una imagen de tu formulario donde expliques lo que deseas.
Tengo en una hoja un formulario de entrega de planillas identificadas con un ID único y toma los datos de una tabla dinámica vinculada a otra hoja que es la que tiene toda la base de datos (Base). Estos datos se concatenan para que entren en una celda (por cuestiones de diseño del comprobante).
Cada ID tiene un estado cuando está en la oficina (por ej. “INCORRECTA”) y cuando se hace la entrega al responsable el estado debería cambiar a “P/CORREGIR”. Quisiera saber si hay alguna forma práctica y liviana para que el botón ‘Imprimir Comprobante’ me cambie el estado de cada ID incluido en el comprobante.
Buenos días, quien puede ayudarme, tengo varias hojas de excel que quisiera buscar y reemplazar en cada una un numero, por ejemplo, tengo las hojas 1,2,3,4,…etc. en una parte de la hoja aparece un numero en la hoja1 aparece 1, en la hoja2, 2, en la hoja3, 3 y asi sucesivamente, lo que quiero hacer es ubicar ese numero en cada hoja y luego reemplazarlo con OE-01, OE-02, OE-03….ECT. GRACIAS POR LA AYUDA. ES URGENTE.
post data
el numero que quiero reemplazar siempre esta en la celda G4 en cada hoja
Buen Día.
En esta ocasión necesito su ayuda espero y me puedan apoyar.
TENGO LA SIGUIENTE SITUACIÓN
A diario en mi base de excel tengo una columna con nombres de empresas con razón social
Ejemplo:
empresa 1 , S.A. de C.V. SOFON E.N.R
empresa 2 S. P. R. De R. L. De C. V.
empresa 3 , S.A. de C.V. de S.O.C.I.
empresa 4 , S.A. de C.V. (S.E.E.P.)
empresa 5 S.C DE A.P DE R.L DE C.V
Para alimentar otra base necesito solo el nombre de la empresa SIN:
S.A. de C.V. SOFON E.N.R.
S. P. R. De R. L. De C. V. ,
S.A. de C.V. de S.O.C.I.
etc,etc,etc…….
Lo remplazo manualmente con la opción que me muestra en la barra de herramientas y me cuesta mucho tiempo tener que realizar esta actividad a diario ya que cuento con casi mas de 2000 razones por quitar.
Gracias