Una macro - error

31/01/2006 - 17:57 por Marta | Informe spam
Buenas tardes!

Estoy usando (o intentando usar) una macro que me está dando error. No salta
mensaje, simplemente no hace lo que tendría que hacer.
En momentos sí me ha funcionado bien y no he cambiado nada.

Lo que tendría que hacer es lo siguiente: abres el archivo y te encuentras
la columna A y la columna C para que metas en cada una de ellas un listado de
palabras. (la columna B no se usa para nada).
Pulsando un botón que ejecuta la macro, lo que esta hace es comparar ambos
listados (columna A y C) y escribir en la columna H las palabras que están en
la lista 2 (columna C) pero no están en la lista 1 (columna A).

Resumiendo los pasos la macro tendría que hacer esto:
Una vez entras en el fichero y escribes las listas de palabras en ambas
columnas, ejecutas la macro, y entonces:
- Toma de la columna A el rango escrito y lo llama "primecel".
- Toma de la columna C el rango escrito y lo llama "secocel".
- En la columna D escribe la función de buscarv: busca la palabra en C y
mira si está en A, para escribir la palabra en su caso, o el error si no está.
- Copia la fórmula hacia abajo.
- Crea un filtro personalizado en D1 y selecciona los errores.
- Las que están en C pero no en A aparecen entonces. Se copia el contenido
de C.
- Se crea una nueva hoja (Tempo) y se pega la selección (palabras que están
en C y no en A).
- Vuelve a la hoja de antes, deshace el filtro.
- Elimina la hoja Tempo y copia en H las palabras que están en C pero no en A.

¿Podríais decirme por qué en la realidad lo que hace es simplemente pegar en
H todo lo que hay en C, independientemente de si la palabra está o no en A?


Sub Macro4()

Application.ScreenUpdating = False

Application.DisplayAlerts = False

Dim primecel, secocel
Range("a2").Select
Selection.End(xlDown).Select
secocel = ActiveWindow.RangeSelection.Row
Range("c2").Select
Selection.End(xlDown).Select
primecel = ActiveWindow.RangeSelection.Row
Range("D2").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(RC[-1],R2C1:R" & secocel & "C1,1,FALSE)"
Range("D2").Select
Range(Cells(2, 4), Cells(primecel, 4)).Select
Selection.FillDown
Range("D1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Selection.AutoFilter Field:=1, Criteria1:="#N/A"
Range("C2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets.Add after:=Sheets(2)
ActiveSheet.Name = "Tempo"
Range("A1").Select
ActiveSheet.Paste
Sheets("outils pour extraction des mots").Select
Selection.AutoFilter Field:=1
Range("H2").Select
Sheets("Tempo").Select
Selection.Copy
Sheets("outils pour extraction des mots").Select
ActiveSheet.Paste
Range("D2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Sheets("Tempo").Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Range("H2").Activate

End Sub


Muchas gracias!!!

Preguntas similare

Leer las respuestas

#1 KL
01/02/2006 - 00:14 | Informe spam
Hola Marta,

A ver que tal esto:

Sub Macro5()
Dim c As Range, miLista As Variant
Application.ScreenUpdating = False
With ActiveSheet
ReDim miLista(0)
For Each c In .Range(.Range("C2"), .Range("C65536").End(xlUp))
If Application.CountIf(.Range("A:A"), c) = 0 Then
miLista(UBound(miLista)) = c
ReDim Preserve miLista(UBound(miLista) + 1)
End If
Next c
.Range("H2").Resize(UBound(miLista) + 1) = _
Application.Transpose(miLista)
End With
Application.ScreenUpdating = True
End Sub

Saludos,
KL


"Marta" wrote in message news:
Buenas tardes!

Estoy usando (o intentando usar) una macro que me está dando error. No salta
mensaje, simplemente no hace lo que tendría que hacer.
En momentos sí me ha funcionado bien y no he cambiado nada.

Lo que tendría que hacer es lo siguiente: abres el archivo y te encuentras
la columna A y la columna C para que metas en cada una de ellas un listado de
palabras. (la columna B no se usa para nada).
Pulsando un botón que ejecuta la macro, lo que esta hace es comparar ambos
listados (columna A y C) y escribir en la columna H las palabras que están en
la lista 2 (columna C) pero no están en la lista 1 (columna A).

Resumiendo los pasos la macro tendría que hacer esto:
Una vez entras en el fichero y escribes las listas de palabras en ambas
columnas, ejecutas la macro, y entonces:
- Toma de la columna A el rango escrito y lo llama "primecel".
- Toma de la columna C el rango escrito y lo llama "secocel".
- En la columna D escribe la función de buscarv: busca la palabra en C y
mira si está en A, para escribir la palabra en su caso, o el error si no está.
- Copia la fórmula hacia abajo.
- Crea un filtro personalizado en D1 y selecciona los errores.
- Las que están en C pero no en A aparecen entonces. Se copia el contenido
de C.
- Se crea una nueva hoja (Tempo) y se pega la selección (palabras que están
en C y no en A).
- Vuelve a la hoja de antes, deshace el filtro.
- Elimina la hoja Tempo y copia en H las palabras que están en C pero no en A.

¿Podríais decirme por qué en la realidad lo que hace es simplemente pegar en
H todo lo que hay en C, independientemente de si la palabra está o no en A?


Sub Macro4()

Application.ScreenUpdating = False

Application.DisplayAlerts = False

Dim primecel, secocel
Range("a2").Select
Selection.End(xlDown).Select
secocel = ActiveWindow.RangeSelection.Row
Range("c2").Select
Selection.End(xlDown).Select
primecel = ActiveWindow.RangeSelection.Row
Range("D2").Select
ActiveCell.FormulaR1C1 = _
"=VLOOKUP(RC[-1],R2C1:R" & secocel & "C1,1,FALSE)"
Range("D2").Select
Range(Cells(2, 4), Cells(primecel, 4)).Select
Selection.FillDown
Range("D1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Selection.AutoFilter Field:=1, Criteria1:="#N/A"
Range("C2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets.Add after:=Sheets(2)
ActiveSheet.Name = "Tempo"
Range("A1").Select
ActiveSheet.Paste
Sheets("outils pour extraction des mots").Select
Selection.AutoFilter Field:=1
Range("H2").Select
Sheets("Tempo").Select
Selection.Copy
Sheets("outils pour extraction des mots").Select
ActiveSheet.Paste
Range("D2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Sheets("Tempo").Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Range("H2").Activate

End Sub


Muchas gracias!!!

Respuesta Responder a este mensaje
#2 Marta
01/02/2006 - 12:09 | Informe spam
Muchas gracias, KL, funciona muy bien y por lo que veo el código parece menos
engorroso.
Estoy usando tu solución y por ahora genial.

Sin embargo, ¿tendríais alguna idea de por qué no funciona bien la otra? Así
por aprender y también por salir de dudas... ¿sugerencias?

Muchas gracias por todo!

Marta


"KL" escribió:

Hola Marta,

A ver que tal esto:

Sub Macro5()
Dim c As Range, miLista As Variant
Application.ScreenUpdating = False
With ActiveSheet
ReDim miLista(0)
For Each c In .Range(.Range("C2"), .Range("C65536").End(xlUp))
If Application.CountIf(.Range("A:A"), c) = 0 Then
miLista(UBound(miLista)) = c
ReDim Preserve miLista(UBound(miLista) + 1)
End If
Next c
.Range("H2").Resize(UBound(miLista) + 1) = _
Application.Transpose(miLista)
End With
Application.ScreenUpdating = True
End Sub

Saludos,
KL


"Marta" wrote in message news:
> Buenas tardes!
>
> Estoy usando (o intentando usar) una macro que me está dando error. No salta
> mensaje, simplemente no hace lo que tendría que hacer.
> En momentos sí me ha funcionado bien y no he cambiado nada.
>
> Lo que tendría que hacer es lo siguiente: abres el archivo y te encuentras
> la columna A y la columna C para que metas en cada una de ellas un listado de
> palabras. (la columna B no se usa para nada).
> Pulsando un botón que ejecuta la macro, lo que esta hace es comparar ambos
> listados (columna A y C) y escribir en la columna H las palabras que están en
> la lista 2 (columna C) pero no están en la lista 1 (columna A).
>
> Resumiendo los pasos la macro tendría que hacer esto:
> Una vez entras en el fichero y escribes las listas de palabras en ambas
> columnas, ejecutas la macro, y entonces:
> - Toma de la columna A el rango escrito y lo llama "primecel".
> - Toma de la columna C el rango escrito y lo llama "secocel".
> - En la columna D escribe la función de buscarv: busca la palabra en C y
> mira si está en A, para escribir la palabra en su caso, o el error si no está.
> - Copia la fórmula hacia abajo.
> - Crea un filtro personalizado en D1 y selecciona los errores.
> - Las que están en C pero no en A aparecen entonces. Se copia el contenido
> de C.
> - Se crea una nueva hoja (Tempo) y se pega la selección (palabras que están
> en C y no en A).
> - Vuelve a la hoja de antes, deshace el filtro.
> - Elimina la hoja Tempo y copia en H las palabras que están en C pero no en A.
>
> ¿Podríais decirme por qué en la realidad lo que hace es simplemente pegar en
> H todo lo que hay en C, independientemente de si la palabra está o no en A?
>
>
> Sub Macro4()
>
> Application.ScreenUpdating = False
>
> Application.DisplayAlerts = False
>
> Dim primecel, secocel
> Range("a2").Select
> Selection.End(xlDown).Select
> secocel = ActiveWindow.RangeSelection.Row
> Range("c2").Select
> Selection.End(xlDown).Select
> primecel = ActiveWindow.RangeSelection.Row
> Range("D2").Select
> ActiveCell.FormulaR1C1 = _
> "=VLOOKUP(RC[-1],R2C1:R" & secocel & "C1,1,FALSE)"
> Range("D2").Select
> Range(Cells(2, 4), Cells(primecel, 4)).Select
> Selection.FillDown
> Range("D1").Select
> Range(Selection, Selection.End(xlDown)).Select
> Selection.Copy
> Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
> False, Transpose:=False
> Selection.AutoFilter Field:=1, Criteria1:="#N/A"
> Range("C2").Select
> Range(Selection, Selection.End(xlDown)).Select
> Selection.Copy
> Sheets.Add after:=Sheets(2)
> ActiveSheet.Name = "Tempo"
> Range("A1").Select
> ActiveSheet.Paste
> Sheets("outils pour extraction des mots").Select
> Selection.AutoFilter Field:=1
> Range("H2").Select
> Sheets("Tempo").Select
> Selection.Copy
> Sheets("outils pour extraction des mots").Select
> ActiveSheet.Paste
> Range("D2").Select
> Range(Selection, Selection.End(xlDown)).Select
> Selection.ClearContents
> Sheets("Tempo").Delete
> Application.DisplayAlerts = True
> Application.ScreenUpdating = True
> Range("H2").Activate
>
> End Sub
>
>
> Muchas gracias!!!
>


Respuesta Responder a este mensaje
#3 KL
01/02/2006 - 14:21 | Informe spam
Marta,

El codigo que has expuesto contiene varios agugeros/riesgos de fallo (segun la situacion concreta) y oportunidades de optimizacion .
El riesgo mas evidente [a mi ver] es el uso del comando .End(xlDown) que tal como lo usas te daria una celda incorrecta si hay
alguna celda vacia dentro del rango que evaluas. Desgraciadamente, esta semana no dispongo de tiempo suficiente para hacer un
analisis linea por linea de tu codigo, pero te diria que si comparas mi codigo con el tuyo veras mas o menos que es lo que no hago
en mi codigo de lo que haces tu, p.ej. seleccionar hojas, celdas/rangos, crear objetos y formulas de hoja de calculo intermedios,
usar referencias a rangos sin especificar la hoja (a no ser que se trate de un rango que esta en la hoja activa o en la hoja en cuyo
modulo esta el codigo), etc.

Saludos,
KL


"Marta" wrote in message news:
Muchas gracias, KL, funciona muy bien y por lo que veo el código parece menos
engorroso.
Estoy usando tu solución y por ahora genial.

Sin embargo, ¿tendríais alguna idea de por qué no funciona bien la otra? Así
por aprender y también por salir de dudas... ¿sugerencias?

Muchas gracias por todo!

Marta


"KL" escribió:

Hola Marta,

A ver que tal esto:

Sub Macro5()
Dim c As Range, miLista As Variant
Application.ScreenUpdating = False
With ActiveSheet
ReDim miLista(0)
For Each c In .Range(.Range("C2"), .Range("C65536").End(xlUp))
If Application.CountIf(.Range("A:A"), c) = 0 Then
miLista(UBound(miLista)) = c
ReDim Preserve miLista(UBound(miLista) + 1)
End If
Next c
.Range("H2").Resize(UBound(miLista) + 1) = _
Application.Transpose(miLista)
End With
Application.ScreenUpdating = True
End Sub

Saludos,
KL


"Marta" wrote in message news:
> Buenas tardes!
>
> Estoy usando (o intentando usar) una macro que me está dando error. No salta
> mensaje, simplemente no hace lo que tendría que hacer.
> En momentos sí me ha funcionado bien y no he cambiado nada.
>
> Lo que tendría que hacer es lo siguiente: abres el archivo y te encuentras
> la columna A y la columna C para que metas en cada una de ellas un listado de
> palabras. (la columna B no se usa para nada).
> Pulsando un botón que ejecuta la macro, lo que esta hace es comparar ambos
> listados (columna A y C) y escribir en la columna H las palabras que están en
> la lista 2 (columna C) pero no están en la lista 1 (columna A).
>
> Resumiendo los pasos la macro tendría que hacer esto:
> Una vez entras en el fichero y escribes las listas de palabras en ambas
> columnas, ejecutas la macro, y entonces:
> - Toma de la columna A el rango escrito y lo llama "primecel".
> - Toma de la columna C el rango escrito y lo llama "secocel".
> - En la columna D escribe la función de buscarv: busca la palabra en C y
> mira si está en A, para escribir la palabra en su caso, o el error si no está.
> - Copia la fórmula hacia abajo.
> - Crea un filtro personalizado en D1 y selecciona los errores.
> - Las que están en C pero no en A aparecen entonces. Se copia el contenido
> de C.
> - Se crea una nueva hoja (Tempo) y se pega la selección (palabras que están
> en C y no en A).
> - Vuelve a la hoja de antes, deshace el filtro.
> - Elimina la hoja Tempo y copia en H las palabras que están en C pero no en A.
>
> ¿Podríais decirme por qué en la realidad lo que hace es simplemente pegar en
> H todo lo que hay en C, independientemente de si la palabra está o no en A?
>
>
> Sub Macro4()
>
> Application.ScreenUpdating = False
>
> Application.DisplayAlerts = False
>
> Dim primecel, secocel
> Range("a2").Select
> Selection.End(xlDown).Select
> secocel = ActiveWindow.RangeSelection.Row
> Range("c2").Select
> Selection.End(xlDown).Select
> primecel = ActiveWindow.RangeSelection.Row
> Range("D2").Select
> ActiveCell.FormulaR1C1 = _
> "=VLOOKUP(RC[-1],R2C1:R" & secocel & "C1,1,FALSE)"
> Range("D2").Select
> Range(Cells(2, 4), Cells(primecel, 4)).Select
> Selection.FillDown
> Range("D1").Select
> Range(Selection, Selection.End(xlDown)).Select
> Selection.Copy
> Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
> False, Transpose:=False
> Selection.AutoFilter Field:=1, Criteria1:="#N/A"
> Range("C2").Select
> Range(Selection, Selection.End(xlDown)).Select
> Selection.Copy
> Sheets.Add after:=Sheets(2)
> ActiveSheet.Name = "Tempo"
> Range("A1").Select
> ActiveSheet.Paste
> Sheets("outils pour extraction des mots").Select
> Selection.AutoFilter Field:=1
> Range("H2").Select
> Sheets("Tempo").Select
> Selection.Copy
> Sheets("outils pour extraction des mots").Select
> ActiveSheet.Paste
> Range("D2").Select
> Range(Selection, Selection.End(xlDown)).Select
> Selection.ClearContents
> Sheets("Tempo").Delete
> Application.DisplayAlerts = True
> Application.ScreenUpdating = True
> Range("H2").Activate
>
> End Sub
>
>
> Muchas gracias!!!
>


Respuesta Responder a este mensaje
#4 Marta
02/02/2006 - 12:03 | Informe spam
Muchísimas gracias por la explicación, me queda así mucho más claro todo.

Cualquier duda no dudes que la preguntaré :)

Saludos,

Marta

"KL" escribió:

Marta,

El codigo que has expuesto contiene varios agugeros/riesgos de fallo (segun la situacion concreta) y oportunidades de optimizacion .
El riesgo mas evidente [a mi ver] es el uso del comando .End(xlDown) que tal como lo usas te daria una celda incorrecta si hay
alguna celda vacia dentro del rango que evaluas. Desgraciadamente, esta semana no dispongo de tiempo suficiente para hacer un
analisis linea por linea de tu codigo, pero te diria que si comparas mi codigo con el tuyo veras mas o menos que es lo que no hago
en mi codigo de lo que haces tu, p.ej. seleccionar hojas, celdas/rangos, crear objetos y formulas de hoja de calculo intermedios,
usar referencias a rangos sin especificar la hoja (a no ser que se trate de un rango que esta en la hoja activa o en la hoja en cuyo
modulo esta el codigo), etc.

Saludos,
KL


"Marta" wrote in message news:
> Muchas gracias, KL, funciona muy bien y por lo que veo el código parece menos
> engorroso.
> Estoy usando tu solución y por ahora genial.
>
> Sin embargo, ¿tendríais alguna idea de por qué no funciona bien la otra? Así
> por aprender y también por salir de dudas... ¿sugerencias?
>
> Muchas gracias por todo!
>
> Marta
>
>
> "KL" escribió:
>
>> Hola Marta,
>>
>> A ver que tal esto:
>>
>> Sub Macro5()
>> Dim c As Range, miLista As Variant
>> Application.ScreenUpdating = False
>> With ActiveSheet
>> ReDim miLista(0)
>> For Each c In .Range(.Range("C2"), .Range("C65536").End(xlUp))
>> If Application.CountIf(.Range("A:A"), c) = 0 Then
>> miLista(UBound(miLista)) = c
>> ReDim Preserve miLista(UBound(miLista) + 1)
>> End If
>> Next c
>> .Range("H2").Resize(UBound(miLista) + 1) = _
>> Application.Transpose(miLista)
>> End With
>> Application.ScreenUpdating = True
>> End Sub
>>
>> Saludos,
>> KL
>>
>>
>> "Marta" wrote in message news:
>> > Buenas tardes!
>> >
>> > Estoy usando (o intentando usar) una macro que me está dando error. No salta
>> > mensaje, simplemente no hace lo que tendría que hacer.
>> > En momentos sí me ha funcionado bien y no he cambiado nada.
>> >
>> > Lo que tendría que hacer es lo siguiente: abres el archivo y te encuentras
>> > la columna A y la columna C para que metas en cada una de ellas un listado de
>> > palabras. (la columna B no se usa para nada).
>> > Pulsando un botón que ejecuta la macro, lo que esta hace es comparar ambos
>> > listados (columna A y C) y escribir en la columna H las palabras que están en
>> > la lista 2 (columna C) pero no están en la lista 1 (columna A).
>> >
>> > Resumiendo los pasos la macro tendría que hacer esto:
>> > Una vez entras en el fichero y escribes las listas de palabras en ambas
>> > columnas, ejecutas la macro, y entonces:
>> > - Toma de la columna A el rango escrito y lo llama "primecel".
>> > - Toma de la columna C el rango escrito y lo llama "secocel".
>> > - En la columna D escribe la función de buscarv: busca la palabra en C y
>> > mira si está en A, para escribir la palabra en su caso, o el error si no está.
>> > - Copia la fórmula hacia abajo.
>> > - Crea un filtro personalizado en D1 y selecciona los errores.
>> > - Las que están en C pero no en A aparecen entonces. Se copia el contenido
>> > de C.
>> > - Se crea una nueva hoja (Tempo) y se pega la selección (palabras que están
>> > en C y no en A).
>> > - Vuelve a la hoja de antes, deshace el filtro.
>> > - Elimina la hoja Tempo y copia en H las palabras que están en C pero no en A.
>> >
>> > ¿Podríais decirme por qué en la realidad lo que hace es simplemente pegar en
>> > H todo lo que hay en C, independientemente de si la palabra está o no en A?
>> >
>> >
>> > Sub Macro4()
>> >
>> > Application.ScreenUpdating = False
>> >
>> > Application.DisplayAlerts = False
>> >
>> > Dim primecel, secocel
>> > Range("a2").Select
>> > Selection.End(xlDown).Select
>> > secocel = ActiveWindow.RangeSelection.Row
>> > Range("c2").Select
>> > Selection.End(xlDown).Select
>> > primecel = ActiveWindow.RangeSelection.Row
>> > Range("D2").Select
>> > ActiveCell.FormulaR1C1 = _
>> > "=VLOOKUP(RC[-1],R2C1:R" & secocel & "C1,1,FALSE)"
>> > Range("D2").Select
>> > Range(Cells(2, 4), Cells(primecel, 4)).Select
>> > Selection.FillDown
>> > Range("D1").Select
>> > Range(Selection, Selection.End(xlDown)).Select
>> > Selection.Copy
>> > Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
>> > False, Transpose:=False
>> > Selection.AutoFilter Field:=1, Criteria1:="#N/A"
>> > Range("C2").Select
>> > Range(Selection, Selection.End(xlDown)).Select
>> > Selection.Copy
>> > Sheets.Add after:=Sheets(2)
>> > ActiveSheet.Name = "Tempo"
>> > Range("A1").Select
>> > ActiveSheet.Paste
>> > Sheets("outils pour extraction des mots").Select
>> > Selection.AutoFilter Field:=1
>> > Range("H2").Select
>> > Sheets("Tempo").Select
>> > Selection.Copy
>> > Sheets("outils pour extraction des mots").Select
>> > ActiveSheet.Paste
>> > Range("D2").Select
>> > Range(Selection, Selection.End(xlDown)).Select
>> > Selection.ClearContents
>> > Sheets("Tempo").Delete
>> > Application.DisplayAlerts = True
>> > Application.ScreenUpdating = True
>> > Range("H2").Activate
>> >
>> > End Sub
>> >
>> >
>> > Muchas gracias!!!
>> >
>>
>>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida