Saltar al contenido

Ejecutar macro si la celda de inicio de lamisma está vacía


rgonzalo

Recommended Posts

publicado

Buenas tardes. soy nuevo en este magnífico foro que he encontrado. Mi consulta es la siguiente: tengo una hoja excel donde en la columna "A" hay nombres de clientes aunque alguna celda está vacía correspondiendose con el nombre de cliente de la inmediata anterior según fichero adjunto

Tengo ya una macro creada con el grabador de macro que me suma los valores de la columna "C" cuando me posiciono sobre la celda "A" que está vacía. el problema es que también (obviamente) se ejecuta la macro si el cursor está en una celda que no está vacía. ¿Me podéis decir qué tendría que insertar en la macro ya realizada)

Muchas gracias

demo.xls

publicado

Perdona, tienes toda la razón, con la emoción me olvidé de adjuntar la macro, Como no sé como adjuntar el fichero, te he hecho un copy-paste... Gracias

Sub Macro2()

'

' Macro2 Macro

' AGRUPA CLIENTES EN MANUAL

'

'

ActiveCell.Offset(0, 3).Range("A1").Select

ActiveCell.FormulaR1C1 = "=RC[-1]+R[-1]C[-1]"

ActiveCell.Select

Selection.Copy

ActiveCell.Offset(-1, -1).Range("A1").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

ActiveCell.Offset(1, 0).Rows("1:1").EntireRow.Select

Application.CutCopyMode = False

Selection.Delete Shift:=xlUp

End Sub

publicado

Vamos por partes, esta macro tal como está no se ejecuta de forma automática, es decir debes ejecutarla de forma manual.

Para que se ejecute automáticamente necesita estar asociada a un evento de hoja "Sheet1" que no adjuntas.

publicado

Podrías hojear esto.

En la ayuda de VB Excel aparece esto

Referencia del programador de Excel

WorkSheet.Change (evento)

Se produce cuando alguna celda de la hoja de cálculo es modificada por el usuario o por un vínculo externo.

Sintaxis

expresión.Change(Target)

expresión Variable que representa un objeto WorkSheet.

Parámetros

Nombre Obligatorio/Opcional Tipo de datos Descripción

Target Obligatorio Range Rango modificado. Puede ser más de una celda.

Valor devuelto

Nothing

Comentarios

Este evento no se produce si las celdas se modifican al realizar una actualización. Use el evento Calculate para detectar si se ha actualizado una hoja.

Ejemplo

En este ejemplo se cambia a azul el color de las celdas modificadas.

Visual Basic para aplicaciones

Private Sub Worksheet_Change(ByVal Target as Range)
Target.Font.ColorIndex = 5
End Sub [/CODE]

Con esto, lo que interpreto que necesitas

[CODE]Private Sub Worksheet_Change(ByVal Target As Excel.Range)
If Target.Address = "$A$1" And Target.Value <> "" Then 'Cambia A1 por la celda/rango que necesites
'y el operador <;>;=;<>; por el que necesites
MsgBox "El valor de A1 ha cambiado" 'Aqui tu macro
End If
End Sub[/CODE]

publicado

Gracias a todos por los comentarios. Macro Antonio, no quiero que la macro se ejecute de forma automática, al menos de momento; lo que sí necesitaría es que, al poner el cursor sobre una celda de la columna "A", si esa celda está vacía, al ejecutar la macro haga la función que ahora mismo hace, pero que, si esa celda "Ax" tiene algún valor, que la macro, a pesar de darle la orden de ejecutar no haga nada. Muchas gracias.

PD.- No soy experto en macros, ésa que envié, la hice con el grabador de macros que incorpora excel

publicado

Creo que yo lo he "pillao"

[COLOR=#333333]Sub Macro2()[/COLOR]
[COLOR=#333333]'[/COLOR]
[COLOR=#333333]' Macro2 Macro[/COLOR]
[COLOR=#333333]' AGRUPA CLIENTES EN MANUAL[/COLOR]
[COLOR=#333333]'[/COLOR]
[COLOR=#333333]'
[/COLOR]
[B]if Trim([COLOR=#333333]ActiveCell) <> "" Then Exit Sub 'Si la celda contiene información fin[/COLOR][/B]

[COLOR=#333333]ActiveCell.Offset(0, 3).Range("A1").Select[/COLOR]
[COLOR=#333333]ActiveCell.FormulaR1C1 = "=RC[-1]+R[-1]C[-1]"[/COLOR]
[COLOR=#333333]ActiveCell.Select[/COLOR]
[COLOR=#333333]Selection.Copy[/COLOR]
[COLOR=#333333]ActiveCell.Offset(-1, -1).Range("A1").Select[/COLOR]
[COLOR=#333333]Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _[/COLOR]
[COLOR=#333333]:=False, Transpose:=False[/COLOR]
[COLOR=#333333]ActiveCell.Offset(1, 0).Rows("1:1").EntireRow.Select[/COLOR]
[COLOR=#333333]Application.CutCopyMode = False[/COLOR]
[COLOR=#333333]Selection.Delete Shift:=xlUp[/COLOR]
[COLOR=#333333]End Sub[/COLOR][/CODE]

publicado
Creo que yo lo he "pillao"

[COLOR=#333333]Sub Macro2()[/COLOR]
[COLOR=#333333]'[/COLOR]
[COLOR=#333333]' Macro2 Macro[/COLOR]
[COLOR=#333333]' AGRUPA CLIENTES EN MANUAL[/COLOR]
[COLOR=#333333]'[/COLOR]
[COLOR=#333333]'
[/COLOR]
[B]if Trim([COLOR=#333333]ActiveCell) <> "" Then Exit Sub 'Si la celda contiene información fin[/COLOR][/B]

[COLOR=#333333]ActiveCell.Offset(0, 3).Range("A1").Select[/COLOR]
[COLOR=#333333]ActiveCell.FormulaR1C1 = "=RC[-1]+R[-1]C[-1]"[/COLOR]
[COLOR=#333333]ActiveCell.Select[/COLOR]
[COLOR=#333333]Selection.Copy[/COLOR]
[COLOR=#333333]ActiveCell.Offset(-1, -1).Range("A1").Select[/COLOR]
[COLOR=#333333]Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _[/COLOR]
[COLOR=#333333]:=False, Transpose:=False[/COLOR]
[COLOR=#333333]ActiveCell.Offset(1, 0).Rows("1:1").EntireRow.Select[/COLOR]
[COLOR=#333333]Application.CutCopyMode = False[/COLOR]
[COLOR=#333333]Selection.Delete Shift:=xlUp[/COLOR]
[COLOR=#333333]End Sub[/COLOR][/CODE]

Muchas, muchas gracias, en un rato lo pruebo y te comento...

Saludos

[color=blue]- - - - - Mensaje combinado - - - - -[/color]

¡¡ Muchisimas gracias !! Parece que, en principio funciona.

Una "cosita" más. ¿ que tendria que añadir a la ejecucuón si quisiera que la macro se ejecutase de forma automática para todo el rango de la columna "A" que tuviera algún valor?, es decir, podría haber celdas vacías entre medias de otras con valores y eso habría que detectarlo para no detener la macro al ver la primera celda vacia.

Muchísimas gracias por tu valiosa ayuda.

publicado

Gracias en primer lugar Macro antonio por tu paciencia... No es eso. Lo que ahora necesitaría sería una macro que se ejecutase de forma automática partiendo de las siguientes premisas:

1.- Cursor posicionado sobre A1

2.- Búsqueda automatica en la columna "A" hasta encontrar una celda vacía, supongamos que es A20

3.- Sumar c20+c19

4.- Convertir esa suma en valor numérico ( no con fórmula) y colocarlo en C19

5.- Borrar la fila A20

6.- Buscar la siguiente celda en columna "A" que cumpla la condición de vacía y volver a ejecutar.

Detener la macro cuando encuentre una celda en la columna A que contenga Grand Total

Muchas gracias por tu valiosa ayuda

  • 5 weeks later...
publicado

Muchas gracias a todos por las ayudas recibidas. Finalmente he conseguido " a pedal" hacer funcionar la macro de forma automática. Podéis dar el tema por SOLUCIONADO

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.