CODIGO Arreglo

05/08/2008 - 00:31 por Manny_90 | Informe spam
Que tal.

Me gustaria hacer un codigo donde me identifique cantidades que cambien de
una lista de datos de otra. En la hoja1 tengo Numero de parte, cantidad,
descripcion. En la hoja2 tengo Numero de parte, catidad, descripcion.
Necesito hacer un codigo donde inserte una hoja nueva y el la hoja nueva
liste los numeros de parte que cambian de cantidad, es decir, si en la hoja1
tengo: "Numero de parte" h123 "cantidad" 3, y en la hoja2 tengo "Numero de
parte" h123 "cantidad" 5, quiero que me liste en la hoja nueva una serie de
tabla donde diga, "Numero de parte", "de", "a" y liste los datos "h123" de
"3" a "5" (abajo del encabezado, oviamente).

La lista podria ser muy grande, por ejemplo:
SAA1402-60 1
01-0000-C1 1
01-1010-C1 20
01-4545-45 1
01-1030-C1 16
01-2200-C1 19
01-3310-C1 8
01-4750-C1 16
02-0022-B1 23
o mas. podria ser hasta 200..


Muchas gracias

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
05/08/2008 - 02:05 | Informe spam
hola, !

- "hoja1" y "hoja2" son los nombres reales de tus hojas ?
los titulos estan en la fila 1, los datos inician en la fila 2, y solo utilizas las columnas A, B y C ?

- alguna probabilidad de que existan partes repetidas en una o en ambas hojas ?
(que se debe hacer en este caso ???)

- alguna probabiidad de que existan partes en una hoja que no esten en la otra ?
(que se debe hacer en este caso ???)

- algun detalle adicional que pudiera quedar "en el tintero" ?

saludos,
hector.

__ OP __
En la hoja1 tengo Numero de parte, cantidad, descripcion.
En la hoja2 tengo Numero de parte, cantidad, descripcion.
Necesito... codigo... inserte una hoja... liste los numeros de parte que cambian de cantidad ...
La lista podria ser muy grande, por ejemplo:
SAA1402-60 1
01-0000-C1 1
01-1010-C1 20
01-4545-45 1
01-1030-C1 16
01-2200-C1 19
01-3310-C1 8
01-4750-C1 16
02-0022-B1 23
o mas. podria ser hasta 200...
Respuesta Responder a este mensaje
#2 Manny_90
05/08/2008 - 16:04 | Informe spam
Que tal..
Las respuestas estan abajo...









"Héctor Miguel" wrote:

hola, !

- "hoja1" y "hoja2" son los nombres reales de tus hojas ?
los titulos estan en la fila 1, los datos inician en la fila 2, y solo utilizas las columnas A, B y C ?-SI, ASI SE LLAMAN LAS HOJAS Y EN ESAS COLUMNAS Y FILAS ESTAN--

- alguna probabilidad de que existan partes repetidas en una o en ambas hojas ?
(que se debe hacer en este caso ???)--SI HAY PROBABILIDAD, EN ESE CASO PODRIAMOS HACER UNA HOJA NUEVA MOSTRANDO LAS PARTES QUE SE REPITEN DE LA HOJA1 YSI EXISTEN EN LA HOJA2 QUE TAMBIEN LAS AGREGUE... <<PODRIA SER>>




- alguna probabiidad de que existan partes en una hoja que no esten en la otra ?
(que se debe hacer en este caso ???)- DE ESE CASO YA ME OCUPE DE ESO, YA TENGO UN CODIGO QUE SEPARE LAS PARTES NUEVAS O LAS PARTES QUE SE ELIMINAN

- algun detalle adicional que pudiera quedar "en el tintero" ? "Tintero"???? me imagino que es la hoja donde saldran los resultados,,, en ese caso no hay ningun detalle adicional.

saludos,
hector.

__ OP __
> En la hoja1 tengo Numero de parte, cantidad, descripcion.
> En la hoja2 tengo Numero de parte, cantidad, descripcion.
> Necesito... codigo... inserte una hoja... liste los numeros de parte que cambian de cantidad ...
> La lista podria ser muy grande, por ejemplo:
> Num Parte qty
SAA1402-60 1


> 01-0000-C1 1
> 01-1010-C1 20
> 01-4545-45 1
> 01-1030-C1 16
> 01-2200-C1 19
> 01-3310-C1 8
> 01-4750-C1 16
> 02-0022-B1 23
> o mas. podria ser hasta 200...



Respuesta Responder a este mensaje
#3 Héctor Miguel
06/08/2008 - 06:55 | Informe spam
hola, !

segun tus comentarios (no se que tan acercado ande de tus apreciaciones) prueba con los sigientes codigos
los separo en tres procedimientos (privados) llamados desde una sola macro, por si quieres adaptar opciones

el unico requisito es que NO existan las hojas que se crean por codigo
revisa/analiza/modifica/... ANTES de ejecutar (y sobre una copia de tu archivo real)

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

Dim n As Byte
Sub Filtra_mis_opciones()
Filtra_cambios
Filtra_duplicados
Filtra_extraviados
End Sub
Private Sub Filtra_cambios()
With Worksheets.Add(After:=Worksheets(Worksheets.Count))
.Name = "Cambios"
.Range("a1") = "Cambios en hoja2 con respecto de hoja1"
End With
With Worksheets("hoja1"): .Range("d1") = "Cambio"
Range("a2:c2").Value = Array(.[a1].Value, .[b1].Value, .[d1].Value)
With .Range("a1").CurrentRegion
.Offset(1, 3).Resize(.Rows.Count - 1, 1).Formula = _
"=sumproduct(--(countif(a$1:a2,a2)=1),--(countif(hoja2!a:a,a2)>0),--(" & _
"index(hoja2!b:b,match(a2,hoja2!a:a,0))<>b2),index(hoja2!b:b,match(a2,hoja2!a:a,0)))"
.Parent.Range("f2").Formula = "Ò>0"
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("f1:f2"), CopyToRange:=Range("a2:c2")
End With
.Columns("d:f").ClearContents
Debug.Print .UsedRange.Address
End With
End Sub
Private Sub Filtra_duplicados()
With Worksheets.Add(After:=Worksheets(Worksheets.Count))
.Name = "Duplicados"
.Range("a1") = "Repetidos de la hoja1"
.Range("e1") = "Repetidos de la hoja2"
End With
For n = 1 To 2
With Worksheets("hoja" & n).Range("a1").CurrentRegion
.Parent.Range("e2").Formula = "=countif(a:a,a2)>1"
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("e1:e2"), _
CopyToRange:=IIf(n = 1, Range("a2:c2"), Range("e2:g2"))
.Parent.Range("e2").ClearContents: Debug.Print .Parent.UsedRange.Address
End With
Next
End Sub
Private Sub Filtra_extraviados()
With Worksheets.Add(After:=Worksheets(Worksheets.Count))
.Name = "Extraviados"
.Range("a1") = "De hoja1 que no existen en hoja2"
.Range("e1") = "De hoja2 que no existen en hoja1"
End With
For n = 1 To 2
With Worksheets("hoja" & n).Range("a1").CurrentRegion
.Parent.Range("e2").Formula = "=countif(hoja" & 1 - (n = 1) & "!$a:$a,a2)=0"
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("e1:e2"), _
CopyToRange:=IIf(n = 1, Range("a2:c2"), Range("e2:g2"))
.Parent.Range("e2").ClearContents: Debug.Print .Parent.UsedRange.Address
End With
Next
End Sub
Respuesta Responder a este mensaje
#4 Manny_90
06/08/2008 - 22:05 | Informe spam
EXELENTE!!!!


Solo queria pedirte que si me puedes explicar dos cosas,,, lo que hace la
funcion With> end with y la linea:
.Offset(1, 3).Resize(.Rows.Count - 1, 1).Formula = _



estoy hablando del codigo "Sub Filtra_cambios()"


MIL GRACIAS








"Héctor Miguel" wrote:

hola, !

segun tus comentarios (no se que tan acercado ande de tus apreciaciones) prueba con los sigientes codigos
los separo en tres procedimientos (privados) llamados desde una sola macro, por si quieres adaptar opciones

el unico requisito es que NO existan las hojas que se crean por codigo
revisa/analiza/modifica/... ANTES de ejecutar (y sobre una copia de tu archivo real)

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

Dim n As Byte
Sub Filtra_mis_opciones()
Filtra_cambios
Filtra_duplicados
Filtra_extraviados
End Sub
Private Sub Filtra_cambios()
With Worksheets.Add(After:=Worksheets(Worksheets.Count))
.Name = "Cambios"
.Range("a1") = "Cambios en hoja2 con respecto de hoja1"
End With
With Worksheets("hoja1"): .Range("d1") = "Cambio"
Range("a2:c2").Value = Array(.[a1].Value, .[b1].Value, .[d1].Value)
With .Range("a1").CurrentRegion
.Offset(1, 3).Resize(.Rows.Count - 1, 1).Formula = _
"=sumproduct(--(countif(a$1:a2,a2)=1),--(countif(hoja2!a:a,a2)>0),--(" & _
"index(hoja2!b:b,match(a2,hoja2!a:a,0))<>b2),index(hoja2!b:b,match(a2,hoja2!a:a,0)))"
.Parent.Range("f2").Formula = "Ò>0"
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("f1:f2"), CopyToRange:=Range("a2:c2")
End With
.Columns("d:f").ClearContents
Debug.Print .UsedRange.Address
End With
End Sub
Private Sub Filtra_duplicados()
With Worksheets.Add(After:=Worksheets(Worksheets.Count))
.Name = "Duplicados"
.Range("a1") = "Repetidos de la hoja1"
.Range("e1") = "Repetidos de la hoja2"
End With
For n = 1 To 2
With Worksheets("hoja" & n).Range("a1").CurrentRegion
.Parent.Range("e2").Formula = "=countif(a:a,a2)>1"
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("e1:e2"), _
CopyToRange:=IIf(n = 1, Range("a2:c2"), Range("e2:g2"))
.Parent.Range("e2").ClearContents: Debug.Print .Parent.UsedRange.Address
End With
Next
End Sub
Private Sub Filtra_extraviados()
With Worksheets.Add(After:=Worksheets(Worksheets.Count))
.Name = "Extraviados"
.Range("a1") = "De hoja1 que no existen en hoja2"
.Range("e1") = "De hoja2 que no existen en hoja1"
End With
For n = 1 To 2
With Worksheets("hoja" & n).Range("a1").CurrentRegion
.Parent.Range("e2").Formula = "=countif(hoja" & 1 - (n = 1) & "!$a:$a,a2)=0"
.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range("e1:e2"), _
CopyToRange:=IIf(n = 1, Range("a2:c2"), Range("e2:g2"))
.Parent.Range("e2").ClearContents: Debug.Print .Parent.UsedRange.Address
End With
Next
End Sub



Respuesta Responder a este mensaje
#5 Héctor Miguel
06/08/2008 - 23:14 | Informe spam
hola, !

... que hace la funcion With> end with y la linea:
.Offset(1, 3).Resize(.Rows.Count - 1, 1).Formula = _


estoy hablando del codigo "Sub Filtra_cambios()"



1) una instruccion With ... End With establece una referencia hacia un objeto con tratamiento de "prefijo"
(es decir) en las lineas siguientes solo tienes que iniciar con un punto para llamar a sus propiades, metodos, etc.
lo que te "ahorra" una repeticion de referencias a dicho objeto (p.e.)

-> SIN un bloque de instrucciones With ... End With, tendrias que establecer la referencia al objeto para cada propiedad
y de tener procedimiento +/- "ligero" (en escritura y lineas de codigo) pasarias a tener el (mismo) procedimiento +/- asi:
("cuenta" las veces que se repite "Worksheets("hoja1")" y "Worksheets("hoja1").Range("a1").CurrentRegion")

Private Sub Filtra_cambios()
Worksheets.Add(After:=Worksheets(Worksheets.Count))
ActiveSheet.Name = "Cambios"
Range("a1") = "Cambios en hoja2 con respecto de hoja1"
Worksheets("hoja1").Range("d1") = "Cambio"
Range("a2:c2").Value = Array(Worksheets("hoja1").[a1].Value, Worksheets("hoja1").[b1].Value, Worksheets("hoja1").[d1].Value)
Worksheets("hoja1").Range("a1").CurrentRegion.Offset(1, 3).Resize(Worksheets("hoja1").Range("a1").CurrentRegion.Rows.Count - 1, 1) _
.Formula = "=sumproduct(--(countif(a$1:a2,a2)=1),--(countif(hoja2!a:a,a2)>0),--(" & _
"index(hoja2!b:b,match(a2,hoja2!a:a,0))<>b2),index(hoja2!b:b,match(a2,hoja2!a:a,0)))"
Worksheets("hoja1").Range("f2").Formula = "Ò>0"
Worksheets("hoja1").Range("a1").CurrentRegion.AdvancedFilter _
Action:=xlFilterCopy, CriteriaRange:=.Range("f1:f2"), CopyToRange:=Range("a2:c2")
Worksheets("hoja1").Columns("d:f").ClearContents
Debug.Print Worksheets("hoja1").UsedRange.Address
End With
End Sub

2) en cuanto a que hace "la formula"... (simplemente) determina si para cada fila correspondiente a cada "numero de parte"...
a) es la primera vez que aparece
b) existe al menos una vez en la hoja2
c) la cantidad registrada en hoja2 es diferente de la registrada en hoja1
d) cual es la cantidad registrada en hoja2 (en caso de cumplirse las 3 condiciones anteriores)

-> el codigo utiliza de nuevo filtros avanzados para copiar cuales partes tienen cantidad diferente en hoja2 respecto de hoja1

saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida