Mi lector Omar E. me deja la siguiente consulta en donde tiene una tabla, mas o menos, como esta:
Entonces: nuestra macro deberá tomar el primer codigo en la hoja "incompleta", ir a "tabla_productos" y buscar si ese código existe... si es así, colocar su nombre al lado, en la columna B.
a esta hoja la llamaremos "incompleta".
Entonces: nuestra macro deberá tomar el primer codigo en la hoja "incompleta", ir a "tabla_productos" y buscar si ese código existe... si es así, colocar su nombre al lado, en la columna B.
[+/-] Ver el resto / Ocultar
Existen muchas formas de realizar esta tarea, desde utilizar el método Find(), que no es otra cosa que el famoso "control + b" que ejecutamos siempre, hasta echar mano de algún bucle.
Utilizaré la segunda opción, ayudado de las WorkSheetFunction de VBA. Estas WorkSheetFunction equivalen a manejar las funciones de Excel (en este caso, BuscarV) desde Visual Basic.
Pero mejor vayamos con el "paso a paso" y observemos como primer medida el siguiente código:
Sub Buscar()'defino las variables de uso local Dim RangoBusqueda As Range Dim Resultado 'ahora seteo el rango en donde la macro deberá buscar el código, 'que es la tabla que se encuentra en la hoja "tabla_productos": 'noten que el rango incluye ambas columnas, ya que deberemos 'buscar el código y que la funcion nos devuelva el nombre: Set RangoBusqueda = Sheets("tabla_productos").Range("a2:b5") 'ahora ejecuto la WorksheetFunction.VLookup (BuscarV en inglés). 'paso los mismos argumentos que la archiconocidoa función de 'excel: valor buscardo, el rango en donde buscaré, la columna 'en donde se encuentra el valor a devolver y (opcional) si los 'datos están o no ordenados. 'En este caso busco el código nro 2: Resultado = Application.WorksheetFunction.VLookup(2, RangoBusqueda, 2, False) 'y por ultimo muestro el resultado: MsgBox Resultado 'destruyo el rango, para liberar recursos del sistema Set RangoBusqueda = Nothing End Sub
El Sub de arriba me devuelve lo siguiente:
exacto. según la primer tabla, el código nro 2 corresponde al producto "pan".
Si por casualidad ingreso un código inexistente, la macro me arrojará este mensaje de error:
este error, como sucede siempre, nos detendrá la ejecución de macro. Se produjo cuando modifiqué el código arriba expuesto por:
Resultado = Application.WorksheetFunction.VLookup(7, RangoBusqueda, 2, False)
Observen que busco el código nro 7... pero no existe en "tabla_productos", de allí que arroje error.Ahora bien, ya sabemos como buscar un valor y tenemos presente que VBA nos dará problemas si NO encuentra ese valor. Para concluir con el ejemplo de Omar, debemos realizar un bucle que recorra la hoja "incompleta", busque cada código en nuestra tabla de productos y, si existe, colocar su nombre en la columna B.
El código:
Sub Buscar()'defino las variables de uso local Dim RangoBusqueda As Range Dim Resultado, Valor Dim I As Long 'ahora seteo el rango en donde la macro deberá buscar el código, 'que es la tabla que se encuentra en la hoja "tabla_productos": 'noten que el rango incluye ambas columnas, ya que deberemos 'buscar el código y que la funcion nos devuelva el nombre: Set RangoBusqueda = Sheets("tabla_productos").Range("a2:b5") 'recorremos la columa A de la hoja "incompleta", con un For: With Sheets("incompleta") 'recorro de la fila 1 a la 5 For I = 1 To 5 'tomo el codigo presente en la primer columna: Valor = .Cells(I, 1).Value 'coloco un controlador de errores: On Error Resume Next 'busco a Valor en "tabla_productos" Resultado = Application.WorksheetFunction.VLookup(Valor, RangoBusqueda, 2, False) 'si hubo error (el codigo NO existe), dejo la celda en blanco If Err.Number = 1004 Then .Cells(I, 2).Value = "" Err.Clear Else 'si encontró el Valor, le coloco el nombre del producto en columna 'de al lado .Cells(I, 2).Value = Resultado End If Next I End With 'aviso que terminó el proceso: MsgBox "finalizado" 'destruyo el rango, para liberar recursos del sistema Set RangoBusqueda = Nothing End Sub
Si ejecutamos la macro y nos vamos a la hoja "incompleta".... veremos que cada código tiene su respectivo nombre de producto:
vean la fila 3: nuestra macro no completó el código numero 5... sencillamente por que el código numero 5 no existe en la hoja "tabla_productos":
Ahora bien Omar E.: fijate que especifiqué dentro del código el rango de busqueda (tabla_productos!A2:B5) y luego en el bucle que recorre la hoja "incompleta" puse claramente que recorra hasta la fila 5. Estos parámetros deberás ajustarlos a tu proyecto, adecuandolos a los valores que tengas dentro de el. Si esto te presenta algún problema me avisás o bien pasame el archivo y lo moldeo a tus necesidades.
Una posible forma de que la macro "sepa" hasta donde debe recorrer la hoja "incompleta" es detectar la ultima fila ocupada de la columna A. Esto se hace:
(digamos que el cursor "se posiciona" en la ultima fila de la hoja, primer columna, y de allí "sube" hasta encontrar la primer celda ocupada, guardando su numero de fila (row) )
y luego el bucle quedaría:
For I = 1 to Uf
Next I
Aqui te dejo el link para descargar el ejemplo.
Suerte y espero que te sea de utilidad.
- Obtener enlace
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- Correo electrónico
- Otras aplicaciones
Omar E. Muchas gracias tocayo, realmente era lo que yo buscaba, me ha servido mucho, porque aquí en el trabajo es un constante estar buscando información en un listado enorme, ahora solo modificaré los rango, y quedará listo para lo que necesito.
ResponderEliminarMuchas gracias en verdad!!!!
bueno Omar, me has dado una alegria enorme al avisarme que el ejemplo fue de utilidad y puedes aplicarlo a tu trabajo. cualquier cosa que necesites me avisas.
ResponderEliminarHola,
ResponderEliminartengo un problema con el siguiente codigo:
With Sheets(hojadatos).PivotTables("Tabla dinámica1").PivotFields("paquet")
For i = 1 To .PivotItems.Count
nombreitem = .PivotItems(i).Value
Sheets(hojaactiva).Range("j1").Value = nombreitem
If Application.IsNA(Application.WorksheetFunction.VLookup(Range("j1"), rngCriterios, 1, False)) Then
.PivotItems(i).Visible = False
Else
If Application.WorksheetFunction.VLookup(Range("j1").Value, rngCriterios, 1, False) = nombreitem Then
.PivotItems(i).Visible = True
Else
.PivotItems(i).Visible = False
End If
End If
Next i
End With
El problema es que en la funcion vlookup Si valor buscado es inferior al menor de los valores de la primera columna de la matriz en la que realizar la búsqueda, VLookup devuelve el valor de error #N/A.
lo que estoy buscando son pivotitems de TD. lo que estoy probando con este codigo es que analize si devuelve N/A y que .pivotitems sea visible=false si no da error que evalue dependiendo del rango de busqueda. no se si me explicado bien.
Espero sus comentarios.
Agradezco antemano su ayuda y su tiempo
no comprendo muy bien el planteamiento. para detectar el error y manejarlo, yo haría lo siguiente:
ResponderEliminarDim myPivot
'capturo el error:
On Error Resume Next
myPivot=Application.WorksheetFunction.VLookup(Range("j1").Value, rngCriterios, 1, False)
'si se produce el error 1004, el dato NO está:
if err.number=1004 then
'ocultamos:
.PivotItems(i).Visible = False
'si no hay ningún error:
elseif err.number=0 then
'si pasa algo no contemplado:
else
msgbox err.description,,err.number
end if
creo haber respondido (espero) tu pregunta de como capturar si BuscarV devuelve un error.
estas lineas tuyas "...si no da error que evalue dependiendo del rango de busqueda" no las termino de entender. cualquier cosa pasame el archivo o detallame un poco mas el tema.
quedo al aguardo de tus noticias.
Hola,
ResponderEliminarGracias por tu respuesta tan rapida.
Perdona por no haberme explicado mas claramente. Es justo lo que buscaba. Me has ayudado mucho, estsaba un poco encallado con este tema.
un placer leer tus aportes.
muchas gracias por avisar y por tu comentario. vos sabés que anoche, un par de horas luego de responder tu consulta, me volvió el tema a la cabeza y me quedé pensando. como siempre, en programación las cosas se pueden hacer de varias formas.
ResponderEliminaraquí tenes otra forma de capturar el error, sin la necesidad de utilizar el controlador On Error Resume Next:
If Application.WorksheetFunction.IsErr(Application.WorksheetFunction.VLookup("excel", Range("a1:a10"), 1, 0)) Then
MsgBox "hay un error"
Else
MsgBox "no se produjeron errores"
End If
lo que hago es "anidar" a VLookup() dentro de la worksheetfunction "IsErr" (eserror). y funciona.
fijate si te sirve, dado que el código es mas sencillo.
suerte.
Hola,
ResponderEliminarVeo que eres de los mios no olvidas los temas incluso una vez resueltos. Esa opcion que me adjuntas es la que estava provando, pero no se porque no me funcionaba. incluso provaba con isNa() o on iferror() pero no habia manera.
no se si es por que estoy trabajando con pivotitems de tablas dinamicas o es que estaba haciendo algo mal.
gracias nuevamente por tu tiempo.
jaja, tal cual, algun día voy a tener que limpiar mi bien rígido, por que las ideas y problemas planteados me quedan dando vuelta siempre, o por lo menos por un buen tiempo.
ResponderEliminarte comento algo que omití en mi post anterior, el por que tu código no funcionaba:
1) vos escribiste la siguiente instrucción:
Application.IsNA
2) y yo:
Application.WorksheetFunction.IsErr
tu codigo está solicitando que se capture un error a nivel aplicacion: "application.isna". aparte hace uso un solo tipo de error: IsNa (que significa: no aplica), dejando de lado cualquier otro que se produzca. no es que no sea válido, de hecho lo es, pero no sería para este ejemplo, sino para otro tipo de casos. vos no querés saber si existieron errores a nivel aplicación, sino a nivel funcion.
este ultimo detalle lo logro mediante:
Application.WorksheetFunction.IsErr
en donde "capturo" al error a nivel función (worksheetfunction). yo estoy diciendo "si se produce un error en la funcion buscarv... hacé tal cosa". ¿se entiende la diferencia?
vos estabas trabajando sobre el objeto aplicación y yo lo hice a nivel función.
entre los puntos 1) y 2) que arriba diferencié podrás darte cuenta sobre la cuestión.
en excel son todos objetos, siguiendo una rigurosa jerarquía: aplicación (excel), workbook (libro), worksheet (hoja), range (rango)... y así con todos. cada uno tiene sus propiedades, metodos y eventos.
WorksheetFunction es una propiedad del objeto Application: "Application.WorksheetFunction"
luego, la función que utilices es un método de WorksheetFunction:
"Application.WorksheetFunction.Max()"
no sería válido escribir:
Application.Vlookup()
lo correcto es:
Application.WorksheetFunction.Vlookup()
de la misma forma se procede en la captura de errores, tu solución requería que se trabaje sobre la función en sí y no sobre el objeto Application.
suerte y gracias por tus mensajes.
hola,
ResponderEliminarperdona por la tardanza però es que estava probando de nuevo lo que me comentas y no hay manera que me funcione. De hecho es de las primeras opciones que estava probando.
el codigo es el siguiente: (me falla justo cuando hace el if iserror
Sub tabladinamica()
Application.Calculation = xlCalculationManual
Dim rngCriterios As Range
Dim i As Long
Dim FilasCriterio As String
hojaactiva = ActiveSheet.Name
rng1 = Sheets(hojaactiva).Range("e8").End(xlUp).Row
Set rngCriterios = Sheets(hojaactiva).Range("e1:e" & rng1)
FilasCriterio = rngCriterios.Count
With Sheets("2009").PivotTables("Tabla dinámica1").PivotFields("mes")
For i = 1 To .PivotItems.Count
If Application.WorksheetFunction.IsError(Application.WorksheetFunction.VLookup(CDbl(.PivotItems(i)), rngCriterios, 1, False)) Then
.PivotItems(i).Visible = False
Else
.PivotItems(i).Visible = True
End If
Next i
End With
Set rngCriterios = Nothing
Sheets("2009").Select
Range("A4:n100").Select
Selection.Copy
Sheets("hoja2").Select
Range("A10").Select
ActiveSheet.Paste
With Sheets("2009").PivotTables("Tabla dinámica1").PivotFields("mes")
For y = 1 To .PivotItems.Count
.PivotItems(y).Visible = True
Next y
End With
Application.Calculation = xlCalculationAutomatic
End Sub
Gracias por tu tiempo
El código que te pase funciona, ya que lo probé con ese y otros ejemplos antes de postearlo. Me parece que tu código ha variado y el problema radica en otro lado.
ResponderEliminarVos primero pusiste:
Application.WorksheetFunction.VLookup(Range("j1"), rngCriterios, 1, False)
y ahora veo:
Application.WorksheetFunction.VLookup(CDbl(.PivotItems(i)), rngCriterios, 1, False)
los argumentos son distintos. Y anteriormente me comentaste que el ejemplo te sirvió.
Revisa bien los valores que estas pasando como parámetro, si no das oon la solidum tendras que pasarme el archivo así reviso el código en vivo.
Tengo una serie de libro, en el libro "indicadores"tengo una lista donde a cada fila tiene una columna que toma un valor falso o verdadero, pero en otra hoja llamda "lista" necesito mostrar solo los indicadores que tengan como valor la palabra "TRUE" quiero sabes como va el codigo de esa consulta.
ResponderEliminaranonimo:
ResponderEliminaren cuanto a tu consulta sobre los valores verdaderos o falsos, necesitaría que me hagas llegar el archivo con algún ejemplo, así lo analizo correctamente y puedo ayudarte bien.
escribime a: damianexcel@gmail.com
Y SI QUIERO COLOCARLE UN INPUTBOX PARA QUE ME DIGA EL PRODUCTO
ResponderEliminarSI LE COLOCO UN INPUTBOX PARA QUE ME DIGA EL PRODUCTO
ResponderEliminarhola Jesus. en el ejemplo voy tomando los valores a buscar desde una celda, con la instrucción:
ResponderEliminarValor = .Cells(I, 1).Value
si en lugar de ellos preferís o necesitas que el usuario ingrese dicho valor (mediante un inputbox) debería ser:
Valor=InputBox("Ingrese el valor a buscar:")
esa línea de código hay que colocarla antes del bucle for...next, eliminado la sentencia anterior dentro del bucle.
fijate si podes o si no avisame y modifico el archivo para que te sirva.
un abrazo.
hola de antemano gracias por la ayuda..
ResponderEliminarnecesito utilizar application.worksheetfunction.vlookup
en una macro de excel
pero para que se entienda bien, lo que quiero es pasar el resultado a una variable y de esa variable pasar el valor a la celda en cuestión.
El problema que no puedo resolver es que la tabla donde busco los datos se encuentra en otro libro y este libro no está abierto.
Necesitaría que me ayuden con el código y saber si puedo hacerlo sin abrir el libro o si es necesario que esté abierto. Gracias
Hola Gerardo.
ResponderEliminarConozco dos formas de leer datos desde un libro cerrado de acuerdo a lo que me planteas:
1) con el control ADO, mismo que se utiliza para leer cualquier base de datos. (link a la entrada: http://damianexcel.blogspot.com/2011/07/obtener-datos-desde-otro-archivo-de.html)
2) usando BuscarV, pero colocandola en una celda de la siguiente forma:
Sub InsertarFuncion()
Dim Ruta As String
Ruta = "'C:\Users\damian\Desktop\[Libro2.xls]Hoja1'!$A$1:$B$4"
Range("a1").Formula = "=Vlookup(1, " & Ruta & ", 2, 0)"
End Sub
te explico: creas el Libro1.xls y el Libro2.xls y a ambos los guardas en el Escritorio. En el Libro2.xls, y desde el rango A1 hasta B4 armas una tabla, por ejemplo:
A B
1 queso
2 manteca
3 vino
4 fiambres
sencillo: código en columna A y nombre de producto en columna B. cierras el Libro2.xls y vuelves a Libro1.xls y dentro de un módulo pegas el sub que mas arriba te dejé.
en la variable Ruta creo la dirección al lugar del disco en donde está Libro2, con el nombre de la hoja y el rango donde debe buscar, para luego utilizarlo como segundo argumento de BuscarV.
y por último, en A1, coloco a BuscarV:
=Vlookup(1,Ruta,2,0)
que en este caso te devuelve el valor: queso.
fijate si te sirvió y me avisas.
un abrazo y gracias por tu mensaje.
Gerardo: aqui te dejo un link al post que armé en base a tu consulta:
ResponderEliminarhttp://damianexcel.blogspot.com/2011/09/otras-formas-de-utilizar-buscarv.html
Hola Damian, como estas?
ResponderEliminarte consulto, estoy trabajando en excel, soy programador abap pero de excel no caso una.
Necesito esto de simple (hoja1 A1:I1 copy. hoja2 A1:I2 paste) bueno que a esto meta adentro de un loop y lo haga hasta que terminen los registros, osea que encuentre un blanco. Desde ya, si me podes ayudar gracias!
Estimado: desde ya te agradezco el mensaje. Necesitaría que me pases un pequeño archivo con algunos registros y así ver el ejemplo "in situ" y de esa forma ayudarte mejor. Hasta donde entiendo tu pregunta, y suponiendo que vamos revisando la columna A hasta encontrar la primer celda en blanco, sería algo así:
ResponderEliminarSub CopiarCeldas()
Dim Fila1, Fila2 As Long
'empiezo desde la segunda fila, asumiendo que existen
'encabezados de tabla:
Fila1 = 2
Fila2 = 2
'quito el refresco de pantalla, para que la macro
'corra mas rápido
Application.ScreenUpdating = False
'ejecuto el bucle mientras haya valor en la fila de
'la columna A
While Range("a" & Fila1).Value <> ""
'copio y pego, armando el rango:
Range("a" & Fila1 & ":i" & Fila1).Copy Sheets("hoja2").Range("a" & Fila2)
'aumento la variable, para continuar con la
'siguiente celda
Fila1 = Fila1 + 1
Fila2 = Fila1
Wend
'elimino la seleccion de copiar, si es que existe
Application.CutCopyMode = False
'y activo nuevamente el refresco de pantalla
Application.ScreenUpdating = True
End Sub
copiá el código y pegalo en un módulo, para luego ejecutarlo. lo probé y funciona bien, cualquier cosa me avisas.
un abrazo
AGARDEZCO TU CLARIDAD EN LAS EXPLICACIONES. SALUDOS.
ResponderEliminarOk estimado, gracias por avisar, un placer poder ayudarte.
ResponderEliminarHola Mauricio: sin querer borre tu comentario, soy un desastre. Por suerte me llegó el Mail a mi casilla, asi que voy a levantar una entrada al respecto y luego coloco el link. Disculpame, el "dedo mas rapido que mente" me ganó de mano. Igualmente en breve respondo tu consulta sobre la búsqueda en múltiples hojas.
ResponderEliminarUn abrazo.
Muchas gracias por tu pronta respuesta Damian!
ResponderEliminarQue bueno que te haya quedado el registro del comentario en tu mail!
Agradezco tu excelente disposición!
Un abrazo,
Mauricio.
Mauricio: te dejo el link a la entrada que levanté con tu consulta, espero que te sirva:
ResponderEliminarhttp://damianexcel.blogspot.com/2011/10/buscar-valores-en-todas-las-hojas-del.html
cualquier cosa me avisas.
hola que tal, es muy buena la macro aqui publicada, pero aqui solo muestran el ejemplo con una variable, (un código= a un producto), pero que tal si se necesita otra variable adicional (por ejemplo departamento/código/ producto o Salchichoneria/código/jamón). mas o menos eso es lo que necesito.
ResponderEliminarexplicame un poco mejor que es lo que necesitas (podes enviarme un archivo de ejemplo al mail que figura al pié del formulario) y vemos como solucionamos ese tema ¿tiene que buscar varios datos en una misma celda, columna, hoja? detallame con precisión las necesidades de tu proyecto, seguro algo se puede hacer.
ResponderEliminarsalu2
Hola damian, abusando de tu amabilidad me podrias ayudar con esto??, necesito que de la captura de dos datos al unirlos me den el valor especifico de una columna.
ResponderEliminarejem
localidad camion coche moto
mexico 100 200 300
puebla 200 150 600
tlaxcala 142 452 25
solo pregunte localidad y transporte y me de el valor de la celda correspondiente
localidad: puebla
vehiculo: coche
resultado: 150
intente con las funciones de buscar pero no me funciono, stoy empezando con esto de las macros y programacion en excel, y me doy cuenta que todavia stoy muy verde!!.
grax por tu ayuda
Hola Luis.
ResponderEliminarDale una mirada este post: http://damianexcel.blogspot.com/2010/03/otras-formas-de-buscar-mas-complejas.html
mas exactamente en el segundo de los ejemplos que allí expongo: con las funciones COINCIDIR() e INDICE() puedes lograr la búsqueda que estás necesitando, sin recurrir a la programación de macros.
avisame si te fue de ayuda.
un abrazo y gracias x tu mensaje
Hola me gustaria saber com puedo encontrar lo siguiente:
ResponderEliminarque con una busqueda tipo vlookup me arreje 2 o mas resultados:
ejemplo:
A 23
B 32
C 45
A 83
al buscar letra A arroje los 2 resultados 23 & 83
por favor enviar a israel.castro@live.com
Muchas Gracias
Saludos
Israel: hacer eso con funciones es casi (casi) imposible. El trabajo es muy complejo y con grandes cantidades de datos Excel se tornaría "torpe y lento". Yo buscaría la solución por el lado de las macros, no con las fórmulas.
ResponderEliminarAvisame si de esa otra forma te sirve.
Hola tengo el siguiente problema tengo una matriz de 30000X2 y luego tengo un vector de Nx1 los datos en la primer columna de 30000X2 y Nx1 son parecidos pero no iguales, en Nx1 estan en desorden y en 30000XN estan en orden decreciente) quiero que busque el valor mas parecido entre estos dos vectores y me arroje el valor el vector de la segundo columna de la matriz 30000xN, lo he intendado con BuscarV y no me arroja el resultado correcto.
ResponderEliminarIsrael: te dejo el link a la entrada que realicé con tu consulta:
ResponderEliminarhttp://damianexcel.blogspot.com/2012/01/buscarv-con-varios-resultados.html
hice algo sencillo, pero funciona. Espero que te sirva en tus proyectos.
Saludos
Spinosa10: enviame el archivo a la la dirección de correo que figura al pié del formulario, no comprendo muy bien el problema... necesito un poco mas de información.
ResponderEliminarGracias y quedo al aguardo de tus noticias.
Hola Damian, muy interesante y tu blog y de mucha ayuda para aquellos que trabajamos con Excel. Mi inquietud es la siguiente, necesito hacer una macro que me consulte una columna en hoja con 150000 filas y 50 columnas aprox de acuerdo a los datos que me aparecen en otra hoja. Podria hacerlo con un buscarV. pero adicionalmente a la columna de coincidencias que encuentre me traiga otras columna que yo pueda seleccionar de la primera hoja a traves de un menu. Como no es seguro que me entiendas te envio a tu correo un archivo de muestra de lo que necesito. Gracias de antemano por tu ayuda.
ResponderEliminarOk, analizo el archivo y te aviso.
ResponderEliminarUn abrazo y gracias x tu mensaje.
Omar,
ResponderEliminarescribi esta macro para capturar los codigos de la tabla llamada "orden" que coincidan con la tabla "ventas", pero la macro me copia las formulas y solo me gustaria tener los valores de los codigos; como podria lograr esto?
Sub Ventas()
Dim i As Integer
Dim j As Integer
Worksheets("Ventas").Activate
Range("K2").Select
ActiveCell.Formula = "=INDEX(Orden!$X:$X,MATCH(Ventas!B2,Orden!$W:$W,0))&INDEX(Order!$AA:$AA,MATCH(Ventas!D2,Order!$Z:$Z,0))&INDEX(Orden!$AD:$AD,MATCH(Ventas!C2,Orden!$AC:$AC,0))"
Selection.Copy
For i = 1 To 348
ActiveSheet.Paste
Range("K2").Offset(i, j).Select
Next i
End Sub
De antemano muchas gracias por tu ayuda,
Henry
Hola buenas tardes
ResponderEliminarGracias por este código de verdad que es muy útil, en especial porque yo trabajo con hojas llenas de datos y con esto el trabajo que me tomaba una hora ahora solo lo hago en 10 minutos. Sin embargo quisiera tu ayuda para agregar una característica a esta a esta rutina:
Usando el mismo ejemplo que hay aquí, cómo puedo hacer para que en la hoja "incompleta" si no encuentra el valor 5, lo señale de rojo y en la columna B aparezca la leyenda "No existe".
De antemano muchas gracias
Estimo que dentro del bucle las cosas deben ser distintas. Primero: quitar el "Activesheet.Paste", ya que ese comando pega todo.
ResponderEliminarY reemplazar: Range("K2").Offset(i, j).Select
por:
Range("K2").Offset(i, j).PasteSpecial xlPasteValues
en lugar de ir seleccionando la celda con el Offset utilizo la instrucción para pegar solo los valores.
antes de probar guardá el libro así si los resultados no son los deseados cerrás sin cambios. cualquier cosa me avisas.
ElAbuelo: que bueno que pudiste aplicar el ejemplo a tu proyecto, realmente las macros nos salvan horas y horas de trabajo.
ResponderEliminarBueno, el código tiene un capturador de errores: si alguno se produce, significa que el valor no existe y pone en blanco la columna B. Hay que reemplazar esto:
If Err.Number = 1004 Then
.Cells(I, 2).Value = ""
por esto:
If Err.Number = 1004 Then
.Cells(I, 2).Value = "no existe"
.Cells(I, 1).Font.Color = vbRed
si se produce el error coloco "no existe" en la segunda columna y le doy fuente roja (vbRed) a la primera.
Si quisieras otra leyenda, como "inexistente", o la que sea, simplemente la reemplazas.
Otros colores para usar pueden ser: vbYellow, vbGreen, vbBlue, vbWhite, vbMagenta, vbBlack
realiza los cambios que te indico y me avisas.
muchas gracias x tu mensaje
Estimado he estado leyendo su blog y lo encontre muy interesante, ando en busca de una macro que me pueda ayudar en mi problema, tengo codigos que se repiten en una misma columna, necesito filtrar por cada codigo y por cada uno copiar las filas resultantes y pegar en una hoja diferente, espero me puedas ayudar, te lo agradeceria mucho.
ResponderEliminarSaludos.
Wladimir: enviame el archivo, así trabajo sobre el ejemplo y levanto un post con tu consulta.
ResponderEliminarAvisame por aquí cuando hayas realizado el envío.
Gracias
hola dam, necesito una macro para validar si en una celda existe un hiperlink, si existe guardare el nombre y la ruta de este en una bd, de lo contrario en la bd los campos nombre y ruta del hiperlink quedaran vacios.
ResponderEliminarAnómino:
ResponderEliminaruna forma muy sencilla es la siguiente:
If ActiveCell.Hyperlinks.Count <> 0 Then
MsgBox ActiveCell.Hyperlinks.Item(1).SubAddress
Else
MsgBox "no hay hipervínculo"
End If
el If.. revisa que haya un hipervínculo, mostrando la propiedad SubAddress, que es esa dirección que vos necesitas.
Si no hay hipervínculo, muestro el mensaje avisando.
Cualquier cosa me avisas.
HOLA Damian Omar Silva
ResponderEliminarNO SE SI ME PUEDAS APOYAR YA QUE TENGO UN CODIGO PERO EL QUE ME HACE EL FILTRO DE UNA TABLA DINAMICA
ActiveSheet.PivotTables("Tabla dinámica6").PivotFields( _
"Nivel 1 de categorización operacional").ClearAllFilters
With ActiveSheet.PivotTables("Tabla dinámica6").PivotFields( _
"Nivel 1 de categorización operacional")
.PivotItems("FALLA HARDWARE").Visible = False
.PivotItems("FALLA SOFTWARE").Visible = False
.PivotItems("REGISTRO DE LLAMADA").Visible = False
.PivotItems("SIN ACCESO").Visible = False
End With
PERO EN ESTECASO COMO LE PUEDO HACER PARA NO TENER ESTOS VALORES DE
FALLA SOFTWARE
FALLA HARDWARE
REGISTRO DE LLAMADA
SIN ACCESO
LO PUEDA SUSTITUIR CON UN EL VALOR QUE SE ENCUENTRA EN LA CELDA A1 ,A2, A3
ASI SI CAMBIO ESTE VALOR DE LA CELDA EL FILTRO SE AGA POR ESTE
anónimo: no comprendo muy bien tu planteamiento, por favor detallame mejor el caso así te puedo ayuda correctamente.
ResponderEliminargracias.
Hola,
ResponderEliminarNecesito sacar unas estadísticas de ventas de varios archivos (facturas), todos tienen el mismo formato, lo que necesitaría es conocer como poder por ejemplo conocer cuantas unidades se vendieron de una referencia.
Vamos buscar en cada uno de los archivos, si esta una unidad en concreto y sumarla en otro excel independiente.
Gracias de antemano
Hola
ResponderEliminarsoy nueva en el blog y quiero hacer una consulta:
tengo una hoja de excel y necesito que al ingresar 1 en cualquier celda de la columna A me traiga el valor de la celda respectiva de la columna B a la columna C y si ingreso 2 en cualquier celda de la columna A me deje vacio pero que sea con una macro porque con una formula en la columna B no queda vacia la columna B sino queda con la formula.
espero haberme hecho entender y que alguien me pueda ayudar
gracias