Programación General > VBA
Macros Mareantes En Excel
(1/1)
mikelvba1:
Hola a todos, a ver si me podeis ayudar.
Con mis cutres-macros que me monto en excel tengo un problema.
Hace lo que le digo pero me gustaria que lo hiciera sin moverse por todas las celdas a toda velocidad como si lo estuviera haciendo superman.
Sabeis si hay alguna forma que actualice las celdas sin que se vea el proceso que realiza en pantalla?
Es algo relacionado con active en vez de select? (cambio active por select y no me va igual)
Gracias!!!!
:)
Ivanart:
hola Mikel,
un par de posibilidades:
a) por un lado puedes incluir, al principio de la macro esta instruccion=>
Application.ScreenUpdating = False
para detener la actualizacion de pantalla. Esto seguramente evitara el bile 'visual', pero...
B) para evitar el 'baile real' (aunque no lo veas gracias a application.screenupdating el baile sigue ahi), decirte que en el ¿¿99%?? de los casos no es necesario andar seleccionando
ni activando celdas,rangos, hojas, libros ni objetos en general para trabajar con ellos.
basta hacer referencia a ellos.
pej. para poner en negrita la fuente de la celda A1 de la hoja1, la tendencia seleccionando y/o activando seria algo asi:
with worksheets("Hoja1")
.Activate
.Range("a1").Select
.Selection.Font.Bold = True
end with
pero [en mi opinion] esto otro hace lo mismo de una manera mucho mas rapida (aqui no se notaria apenas, pero si fueran muchas celdas....), clara y eficaz:
worksheets("Hoja1").Range("a1").Font.Bold = True
como te digo es aplicable en casi todas las situaciones y al no seleccionar/activar nada, adems corres menos riesgos de recalculos innecesarios, pej.
espero te ayude, y si quieres comentas
un saludo
Ivan
mikelvba1:
Gracias Ivanart, la verdad es que te agradezco muchisimo tus respuestas.
El problema es que haciendo eso me funciona pero en cuanto le meto una celda variable me da error.
Me explico, con lo siguiente me lo coge bien:
Range("a2").Select
Pero si estoy en algun rango que varia con un puntero o algo, por ej las variables fila y columna, no se como ponerlo. Me da error con todas estas pruebas:
Range("fila,columna").Select
Range(fila,columna).Select
Range(Cells (fila,columna)).Select
No se como hacerlo, me esta volviedo loco!! :blink:
A ver si Ivanart o alguien con conocimientos puede ayudarme.
Gracias a todos
Ivanart:
hola Mikel,
no acabo de entender lo que quieres hacer [quizas convendria que expusieras el codigo (o al menos parte) que estes usando y que es lo que realmente quieres hacer.
de todas formas te comento algunas cosas por si te ayudan:
1º) que quieres hacer exactamente con esto:
--- Citar ---Range("fila,columna").Select
Range(fila,columna).Select
Range(Cells (fila,columna)).Select
--- Fin de la cita ---
de donde se deberian tomar los valores de fila y columna??
aparte de este dato,
.->en el 1er uso que Haces (Range("fila,columna").Select)
en realidad le estarias pasando un nombre de rango (al ir entre comillas, y aunque no estoy seguro, posiblemente no admitido por el uso de una coma en el)
el uso de fila,columna tendria sentido tal y como lo planteas en el 2º y 3er uso, es decir como variables, pero para que excel no te genere un error , previamente deberas haberle asignado un valor a esas variables [ que ademas este dentro de los limites admitidos por excel <pej. minimo 1 y, hasta el 2003, 256 para columnas y 65536 para filas>]
si quieres haz esta [muy sencilla] prueba:
en un libro nuevo, abre el editor de vba (Alt+F11), ve al menu insertar => Modulo (a secas) => en la ventana que se te abre copia/pega el codigo que te pongo a continuacion => vuelve a excel (Alt+F11 o cerrando el editor, pej.) => desde el cuadro de dilogo 'Macros' (Alt+F8 o menu herramientas -> macros -> ver macros) selecciona el nombre de la macro(PruebasFilaColumna) y ejecuta, observa el resultado y contrastalo con el codigo. Con las dudas comentas.
--- Código: Text --- Sub PruebasFilaColumna() Dim Fila As Long, Columna As Byte With Worksheets("Hoja1") .Activate .Range("a:l").Clear For Fila = 1 To 10 For Columna = 1 To 10 .Cells(Fila, Columna) = .Cells(Fila, Columna).Address(0, 0) Next Next .Range("a" & Fila).Interior.Color = vbRed .Cells(1, Columna).Interior.Color = vbYellow .Cells(Fila, Columna).Interior.Color = vbGreen .Range(.Cells(Fila + 2, 1), .Cells(Fila + 2, Columna)).Interior.Color = vbBlue With .Cells(Fila - 1, Columna - 1) With .Font .Color = vbRed .Bold = True .Size = 14 End With .Select End With End With With ActiveCell MsgBox "La celda seleccionada actualmente es " & .Address(0, 0) & "," & vbCr & _ "su nº de fila es " & .Row & " y el de la columna es el " & .Column & "." End WithEnd Sub
nota: las variables fila y columna se podrian llamar [casi] de cualquier otra forma (pej: f y c, o Coche y Casa, por poner un ej. tonto)
si te animas a exponer lo que realmente estas haciend o quieres hacer, asi como el codigo que +/- estas usando, sera mas facil darte una respuesta concreta
un saludo
Ivan
NOTA:
el 'activar' la hoja no es porque sea necesario para la mayor parte de la macro, tan solo para seleccionar la celda es necesario activar la correspondiente hoja previamente (por si acaso no fuese ya la activa),
tambien para que puedas visualizar el resultado, si por lo que fuera cuando llamaras a la macro estubieras en otra hoja
fakeswato:
wenas, para referirte asi a una celda tomando tu mensaje "filas, culumnas"
--- Citar ---Range("A1").Select
--- Fin de la cita ---
por ejemplo, tendrias que hacerlo de la siguiente manera
--- Citar ---Range(columna & fila).Select
--- Fin de la cita ---
me estoy iniciando en la programacion, espero sirva la ayuda
Navegación
Ir a la versión completa