Macro para buscar valor "#N/A" en una columna

Me podrían ayudar con esta macro,

Tengo una macro que me genera un reporte de inventario en un archivo excel, el archivo tiene códigos y formulas para la descripción de cada código,

Ejemplo.

Código descripción

001 zanahorias.

002 cebollas.

003 tomates.

004 #N/A.

La macro continua después de llenar los campos de "descripción por medio de formulas, lo que necesito es que, la macro me muestre un mensaje cuando no encuentre un código en la base de datos por ejemplo el código "004 no se encontró y mostró #N/A cuando encuentre este valor que me de un mensaje que me diga "Se encontró nuevo código favor agregarlo a la base de datos. Y que luego continué la macro, solo que me muestre la alerta, y si en un caso no se encuentran códigos nuevos que la macro continué normalmente.

1 respuesta

Respuesta
1

Es sencillo, si dices que la macro ya te muestra el N/A, solo tendrías que añadir el mensaje, para decirte donde debes poner el código, seria bueno que pongas la macro!

pues esta un poco grande la macro, pero igual te pongo una parte donde pienso que podría ir el código que necesito, gracias de antemano por tu interés en ayudarme con este problemita. que me quiebra la cabeza.

Workbooks.OpenText Filename:= _
"C:\Documents and Settings\echajon\Escritorio\59.xls", Origin:=xlWindows, _
StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(10 _
, 1), Array(32, 1), Array(40, 1), Array(43, 1), Array(60, 1), Array(74, 1), Array(90, 1), _
Array(97, 1), Array(107, 1), Array(114, 1), Array(121, 1)), TrailingMinusNumbers:= _
True
Columns("C:G").Select
Selection.Delete Shift:=xlToLeft
Rows("1:4").Select
Selection.Delete Shift:=xlUp
Cells.Select
ActiveWorkbook.Worksheets("59").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("59").Sort.SortFields.Add Key:=Range("A1"), SortOn _
:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("59").Sort
.SetRange Range("A1:L457")
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range("A1:E1309").Select
Selection.Copy
Windows("inventario.xlsx").Activate
Sheets("77").Select
Range("A2").Select
ActiveSheet.Paste
Range("D307").Select
ActiveSheet.Range("$A$1:$F$409").AutoFilter Field:=1, Criteria1:=">1", _
Operator:=xlAnd
Sheets("77").Select
ActiveSheet.Range("a2", ActiveSheet.Range("a2").End(xlDown)).Select
Selection.Offset(0, 0).Resize(Selection.Rows.Count + 1, _
Selection.Columns.Count + 4).Select
Selection.Copy
Sheets("mold (2)").Select
Range("A855").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Selection.Copy
Sheets("mold (2)").Select
Range("A855").Select
ActiveSheet.Paste
Windows("59.XLS").Activate
ActiveWindow.Close False
'esta parte eliminas las filas vacías entre cada bodega
finrgo = Range("A65536").End(xlUp).Row
Range("A1").Select
While ActiveCell.Row <= finrgo
If ActiveCell.Value = "" Then
ActiveCell.EntireRow.Delete
finrgo = finrgo - 1
Else
ActiveCell.Offset(1, 0).Select
End If
Wend


''el código nuevo tendría que ir aca, donde termino de eliminar las filas vacías. y queda en la columna B los #N/A donde no encontró el código.

''copia la hoja llamada molde y la renombra de acuerdo al dia de la fecha actual menos uno
Sheets("molde (2)").Select
ActiveSheet.Name = Day(Now()) - 1
'copia hoja y pega valores. elimina columnas B hasta E
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select
Columns("B:E").Select
Range("B628").Activate
Selection.Delete Shift:=xlToLeft
Range("A1").Select
Sheets.Select
Sheets.Copy
ChDir "C:\Documents and Settings\echajon\Escritorio"
ActiveWorkbook.SaveAs Filename:= _
"C:\Documents and Settings\echajon\Escritorio\inventario marzo.xlsx", FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Windows("combox.xlsm").Activate
ActiveWindow.Close False
End Sub

for i = 1 to Application.ActiveSheet.Range( b3 ).End(xlDown).row

if cells(2, i).value = "#N/A" then

msgbox ("Código " & cells(1,i).value & " no encontrado")

end if

next

Donde i=1 tendría que ser el valor de la primera fila con datos de la columna B, si no hay ningún dato daría un error. El código esta sin probar, ya me comentas si funciona o donde te da error.

Ahora que veo, no han aparecido las comillas, acuérdate de ponerlas en range("b1")

Y creo que en cells seria al revés, primero la fila, que seria i, y luego la columna, que seria siempre 2 (columna B)

no me funciona el código, ya le hice los cambios que me sugeriste y no pasa nada la macro se salta el código como si nada, logre adaptar un código que encontré en esta pagina pero me gustaría que mostrara en el mensaje el cóntenido de la celda a la izquierda de la celda activa,

un ejemplo seria que la celda activa es B45, entonces el nuevo código estaría en la celda A45. me ayudas con esto,

este es el código, si le puedo hacer algunos arreglos me comentas.

finrgo = Range("B65536").End(xlUp).Row
Range("B1").Select
While ActiveCell.Row <= finrgo
If ActiveCell.Value = "#N/A" Then
MsgBox ("nuevo código")

ActiveCell.Offset(1, 0).Select

Else
ActiveCell.Offset(1, 0).Select
End If
Wend

Por supuesto, ahora veo que en mi código había puesto en range b3, que debería ser b1, ese código que dices puede que funcione pero tiene varios inconvenientes:

1. La formula no funcionaria mas allá de la fila numero 65536, es un limite de numero de filas de versiones "antiguas" de microsoft excel.

2. La función va posicionando el foco en cada celda, lo que hace que el proceso invierta muchísimo tiempo en comparación con mi código o cualquier otro código que no use select, pero si aun asi, si te vale porque nunca vas a tener muchos registros, debes añadir antes de ese código: application.ScreenUpdating = False, y al final del código:

application.ScreenUpdating = true, para que el usuario no vea como se va posicionando en cada celda, aparte que se gana en velocidad.

Para lo que me comentas del msgbox:

msgbox ("Código " & activecell.offset(0,-1).value & " no encontrado")

gracias por las observaciones tratare de acomodar tu código para que funcione en mi macro y asi sea mas eficiente, y no invierta tanto tiempo en verificar cada celda,

ya veremos como me va..

Cuando tenga algo de tiempo libre reviso mi código y te lo posteo ya arreglado y testeado, probablemente mañana.

te dejo la parte de la macro donde esta el código, la macro no me da error, pero tampoco me muestras el mensaje de alerta de código nuevo encontrado aun cuando puedo revisar por mi mismo que en la celda b 350 hay un valor #N/A. la macro pasa de largo y no muestra ningún mensaje.

saludos.

''copia la hoja llamada molde y la renombra de acuerdo al dia de la fecha actual menos uno
Sheets("molde (2)").Select
ActiveSheet.Name = Day(Now()) - 1
'copia hoja y pega valores. elimina columnas B hasta E
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select
Columns("B:E").Select
Range("B628").Activate
Selection.Delete Shift:=xlToLeft
Range("B1").Select
For i = 1 To Application.ActiveSheet.Range("b1").End(xlDown).Row
If Cells(i, 2).Value = "#N/A" Then
MsgBox ("Código " & ActiveCell.Offset(0, -1).Value & " no encontrado en la base de datos")
End If
Next
Sheets.Select
Sheets.Copy
ChDir "C:\Users\Molder\Desktop"
ActiveWorkbook.SaveAs Filename:= _
"C:\Users\Molder\Desktop\inventario marzo.xlsx", FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
ActiveWindow.Close
Windows("combox.xlsm").Activate
ActiveWindow.Close False
End Sub

Sustitúyelo por este que lo he probado y funciona:

For i = 1 To Application.ActiveSheet.Range("b1").End(xlDown).Row
If Cells(i, 2).Text = #N/A Then
MsgBox ( Código & Cells(i, 1).Text & no encontrado en la base de datos )
End If
Next

Daba un error por usar cells. Value, supongo que sera por el símbolo #, usando el cells.text se corrige. También he corregido el código del msgbox.

Esto funcionara bien siempre y cuando no haya alguna celda vacía entre la primera celda y la ultima de la columna B, si quieres empezar a comprobar los valores desde una celda distinta que no sea la 1, tendrías que cambiar el range("b1") y el for i = 1

Espero que con esto quede resuelto, ya me dices algo

no pude hacer que me funcionara el código, pero muchas gracias por la ayuda lo seguiré probando haber si logro que funcione.

saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas