Utiliza el siguiente código EN EL MODULO DE LA HOJA APROPIADA !!!
===== ===== =====
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("b2").Address Then "EstaMacro"
End Sub
(sustituye "b2" por la celda real y "EstaMacro" por el nombre real de la macro)
Nota: La macro "a ejecutarse" DEBE SER "ACCESIBLE"
Es decir, en el mismo módulo de la hoja
ó en algún módulo "general" QUE NO SEA "Option Private Module"
Y NO DEBE SER Private Sub EstaMacro()
Saludos,
Héctor.
Private Sub Worksheet_Change(ByVal Target As Range)
If "introduzco dato y valido lo introducido en una celda" .Address =
Range("b2").Address Then "EstaMacro"
End Sub
Saludos
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
O2M0XU8mBHA.2236@tkmsftngp05...
Como pondrías : " si introduzco y valido lo introducido en una celda" then "
esta macro"
Es de cir: no si selecciono la celda, sino si introduzco un valor en una
celda del Rango B20:B70 .
Pero de forma tal que llame a una macro que está en otro libro y cuyas
acciones se han de ejecutar en este y en otros distintos de ambos.
Puedes ayudarme a completar
Private Sub Worksheet_Change(ByVal Target As Range)
If "introduzco dato y valido lo introducido en una celda" .Address =
Range("B20:B70").Address Then "EstaMacro"
End Sub
Saludos
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
O2M0XU8mBHA.2236@tkmsftngp05...
Prueba con el siguiente código:
===== ===== =====
Private Sub Worksheet_Change(ByVal Target As Range)
' Primero "validamos" el rango... o nos "brincamos" (por si tienes otras acciones) '
If Application.Intersect(Target, Range("b20:b70")) Is Nothing Then GoTo Siguiente
' Después "validamos" el dato inroducido. Si es "aprovado"... ejecutamos la macro EN OTRO LIBRO '
If Target > 15 Then Application.Run ("'C:\Mis documentos\Otro Libro.xls'!EstaMacro")
Siguiente:
' Otras líneas de código ... '
End Sub
Notas:
Applicatoin.Run(... ->ABRE (si no lo está) el libro que contiene la macro a ejecutar.
Si existen espacios en la "ruta" del libro, deberás usar apóstrofe (') al inicio y fin del nombre
Saludos,
Héctor.
Si tienes algo más de tiempo, y deseas utilizarlo, te planteo lo que
entiendo. ( para que me lo corrijas. )
1º) Con :
If Application.Intersect(Target, Range("b20:b70")) Is Nothing Then GoTo
Siguiente
Entiendo que dices:
Si, en la apertura del Libro-Hoja (El libro tendrá una sola hoja), o al
seleccionarla , no hay nada puesto en ese rango , Vete a Siguiente
2º) ¿ Si selecciono esta hoja con la Orden Select desde otra macro, lanza
también la Macro asociada a esta Hoja_Libro?
3º) Supongamos que guardo la Hoja con los valores introducidos ( No es lo
que se desea , pero puede ocurrir) .
Al abrir de nuevo la hoja ¿ se ejecuta tantas veces la macro como el
número de celdas que tengan datos en ese rango?
¿Como podría hacer para que borrara lo que tuviera en ese rango al
cerrar el libro?
Seleccionar
4º)-Para hacer algo con una celda con un Private Sub Worksheet_Change tienes
que referirte a ella como TARGET.
5º) Te había preguntado : " si introduzco y valido lo introducido en una
celda" ... contando con que una de las introducciones pueda ser un borrado
de la celda con la Tecla Delete-Suprimir, o incluso, porque después de
haber introducido algo, la macro que se pone en marcha nos de un resultado
indeseado , lo cual nos llevará a introducir otro dato distinto en la MISMA
celda .
En lugar de :
If Target > 15 Then Application.Run ("'C:\Mis documentos\Otro
Libro.xls'!EstaMacro")
¿ Tendría sentido la instrucción siguiente? ¿se podría poner con la
intención de que reaccione a cualquier cambio en la celda:
* Si se produce un cambio lance la macro
* Si el cambio consiste en que se borra la celda, borre la
línea
If Target.Change Then Application.Run ("'C:\Mis documentos\Otro
Libro.xls'!EstaMacro")
Elseif Target.Change=Target.ClearContents Then Row(target.row)
ClearContents
End If
Si ves "algo" demasiado gordo , ten cuidado no te rompas de risa la tapa el
pecho
Saludos
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
evNIx2LnBHA.1556@tkmsftngp02...
Algunas notas previas de "aplicación" general para facilitar las explicaciones
Incluso, intentaré responder a varias preguntas "a un tiempo" :-)
Acerca dell evento: Private Sub Worksheet_Change(ByVal Target As Range) :
1.- Ocurre SOLO cuando se cambia EL CONTENIDO de la(s) celda(s) DE LA HOJA
NO OCURRE con "solo" seleccionar la hoja en cuestión
NO OCURRE POR CADA CELDA del rango (a menos que tenga un bucle For...Next)
Tampoco "ocurre" CADA VEZ que se abre el libro
(Pare esto utiliza una macro Auto_Open ó el evento Worlbook_Open de "ThisWorkbook")
Existe un módulo para el código (de eventos) DE CADA HOJA del libro
Si deseas "afectar" A TODAS las hojas del libro... usa el módulo de "ThisWorkbool"
2.- Target es solamente un nombre para identificar a un objeto del tipo Range
De esta manera, al referirte a la(s) celda(s) que "cambie(n)", tendrá(n) las propiedades de un rango
"Target" significa "Objetivo" en español (Puedes nombrarlo diferente si lo deseas)
Con respecto de las preguntas restantes:
> 1º) If Application.Intersect(Target, Range("b20:b70")) Is Nothing Then GoTo Siguiente
R.- "Significa" que:
"Si la celda que cambió (Target), NO ES PARTE DEL RANGO (If.....Is Nothiing)...
Entonces..."Omite" las siguientes líneas (Then GoTo Siguiente)"
:
> ¿Como podría hacer para que borrara lo que tuviera en ese rango al cerrar el libro?
R.- Usa el evento BeforeClose del módulo de ThisWorkbook p.e.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next ' De otra manera... se causarán "errores" :-\´'
' Para evitar que se ejecuta la macro de "validación del rango" POR CADA CELDA '
Application.EnableEvents = False
Worksheets("Hoja1").Range("b20:b70").ClearContents
' Es necesario REGRESAR ESTA PROPIEDAD A TRUE '
Application.EnableEvents = True
ThisWorkbook.Close SaveChanges = True ' o False, según tu deseo de guardar (o no) los cambios '
End Sub
> 5º) Te había preguntado : " si introduzco y valido lo introducido en una celda"
R.- Quizás te convenga "hechar una mirada" a las opciones para validar "entradas" a las celdas...
Menú: Datos -> Validación (y selecciona de las diferentes opciones)
> ... contando con que una de las introducciones pueda ser un borrado de la celda con la Tecla Delete-Suprimir,
> o incluso, porque después de haber introducido algo, la macro que se pone en marcha nos de un resultado
> indeseado, lo cual nos llevará a introducir otro dato distinto en la MISMA celda ...
> En lugar de :
> If Target > 15 Then Application.Run ("'C:\Mis documentos\Otro Libro.xls'!EstaMacro")
> ¿Tendría sentido la instrucción siguiente?
> ¿se podría poner con la intención de que reaccione a cualquier cambio en la celda:
> * Si se produce un cambio lance la macro
> * Si el cambio consiste en que se borra la celda, borre la línea
R.- Cambia "ligeramente" el ejemplo propuesto en el mensaje anterior a: ...
Private Sub Worksheet_Change(ByVal Target As Range)
' Primero "validamos" el rango... o nos "brincamos" (por si tienes otras acciones) '
If Application.Intersect(Target, Range("b20:b70")) Is Nothing Then GoTo Siguiente
' Después "validamos" el dato inroducido. Si es "aprovado"... ejecutamos la macro EN OTRO LIBRO '
On Error Resume Next
If Target = 0 _
Then Target.EntireRow.ClearContents _
Else Application.Run ("'C:\Mis documentos\Otro Libro.xls'!EstaMacro")
Siguiente:
' Otras líneas de código ... '
End Sub
Saludos,
Héctor.
Gracias.
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
#7rTpTZnBHA.2440@tkmsftngp07...
Saludos, Tony.-
"José Luis" <josel...@andorra.ad> escribió en el mensaje
news:uX593BanBHA.2460@tkmsftngp04...
Tony <tp...@hotmail.com> escribió en el mensaje de noticias
OTCkrufnBHA.2460@tkmsftngp04...
en lugar de :
If Target > 15 Then Application.Run ("'C:\Mis documentos\Otro
Libro.xls'!EstaMacro")
puse
If Target <> "" Then Application.Run Macro3
porque la macro esta en el libro, pero tanto con ella como con
If Target > 15 Then Application.Run Macro3
DA IGUAL QUE PONGA ALGO FUERA DEL RANGO B20:B70 COMO DENTRO DE ÉL
me dice: "Se esperaba Función o una Variable"
y ME DEJA MIDIENDO ARENA.
Hay otra forma de decírselo?
Hago algo mal?
Saludos
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
evNIx2LnBHA.1556@tkmsftngp02...
> puse
> If Target <> "" Then Application.Run Macro3
> porque la macro esta en el libro, pero tanto con ella como con
> If Target > 15 Then Application.Run Macro3
> DA IGUAL QUE PONGA ALGO FUERA DEL RANGO B20:B70 COMO DENTRO DE ÉL
> me dice: "Se esperaba Función o una Variable"
R Cuando usas Application.Run, el parámetro requerido es una cadena de texto...
es decir... debes indicarlo entre comillas ("Macro3"). Cámbialo por...
If Target <> "" Then Application.Run "Macro3"
Aunque, si está en el mismo libro... no se necesita Application.Run (NI "comillas")
Cámbialo por...
If Target <> "" Then Macro3
Saludos,
Héctor.
Puedo hacerte una pregunta ( Si, por cualquier, razón no deseas responder,
sencillamente no lo hagas), ¿eres programador profesional?
La pregunta te la hago por que quizá condicione alguna pregunta en el
futuro, siempre y cuando puedas y desees responderlas, claro está.
Siguindo...
Estoy intentando crear una macro para hacer Albaranes, Creo que vosotros lo
llamáis Hojas de Remito
Lo que pretendo hacer es que cuando se modifique una celda de la columna B,
de rango B20:B70 , ( es un Código), una macro rellene esa fila con formulas
o datos obtenidos de otras hojas o Celdas de la misma hoja por el
lanzamiento de otra macro, en este caso Macro3.
y que ,por ejemplo, la celda que esta a la izquierda de la que modifico
por tanto en el Rango A20:A70) ponga el mismo valor que tiene la celda
D10 ( por ejemplo Fecha) o que en la celda que esta 10 celdas a la derecha
ponga, de momento, la formula siguiente, que lo que hace es seleccionar un
precio de entre varias tarifas de precios, según el cliente.
SI(Y($O$10<>"";B20<>"");SI($O$14=1;BUSCARV(B20;Articulos!A$3:$I$4967;3;"fals
o");SI($O$14=2;BUSCARV(B20;Articulos!A$3:$I$4967;4;"falso");SI($O$14=3;BUSCA
RV(B20;Articulos!A$3:$I$4967;5;"falso");SI($O$14=4;BUSCARV(B20;Articulos!A$3
:$I$4967;6;"falso");SI($O$14=5;BUSCARV(B20;Articulos!A$3:$I$4967;7;"falso");
SI($O$14=6;BUSCARV(B20;Articulos!A$3:$I$4967;8;"falso");BUSCARV(B20;Articulo
s!A$3:$I$4967;9;"falso")))))));"").
El problema es... que no se hacerlo con código.
Lo que pongo es
hoja1.Activecell.Offset(0,-1).Value= hoja1.range("D10")
Pero no me deja.
Me dice :
No se encontró el método o el dato miembro
En este caso, supongo que estoy señalando mal la celda "Focal" la que
modifico y a partir de ella señalar las demás de forma Relativa.
Este problema es el que vuelve a encontrar en la formulita de arriba, para
la obtención de datos. Que todos los datos son absolutos.
En lugar de : hoja1.Activecell.Offset(0,-1).Value= hoja1.range("D10")
¿ que debo poner?
***
Como te decía estoy queriendo desgajar un libro y poner mas código en lugar
de las formulas.
Alguna como que antes te mencionaba :
SI(Y($O$10<>"";B20<>"");SI($O$14=1;BUSCARV(B20;Articulos!A$3:$I$4967;3;"fals
o");SI($O$14=2;BUSCARV(B20;Articulos!A$3:$I$4967;4;"falso");SI($O$14=3;BUSCA
RV(B20;Articulos!A$3:$I$4967;5;"falso");SI($O$14=4;BUSCARV(B20;Articulos!A$3
:$I$4967;6;"falso");SI($O$14=5;BUSCARV(B20;Articulos!A$3:$I$4967;7;"falso");
SI($O$14=6;BUSCARV(B20;Articulos!A$3:$I$4967;8;"falso");BUSCARV(B20;Articulo
s!A$3:$I$4967;9;"falso")))))));"")
puesta unas cuantas veces, ralentiza el trabajo.
Pero si quiero que el ordenador la pase a código con el grabador de macros
es mas rápido que a dedo) ... Excel se me dice que no puede grabar la
macro.
Sabes porqué?
Saludos
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
e56TyNtnBHA.2564@tkmsftngp04...
Es halagador tu comentario :-))... y te lo agradezco, aunque...
estoy "algo lejos" de considerarme como tal, soy simplemente un usuario de Excel,
con cierta pasión por las macros como herramientas para facilitarme los trabajos "rutinarios".
Acerca de la lentitud con que "reacciona el sistema", de acuerdo con tu comentario...
> SI(Y($O$10<>"";B20<>"");
> SI($O$14=1;BUSCARV(B20;Articulos!A$3:$I$4967;3;"falso");
> SI($O$14=2;BUSCARV(B20;Articulos!A$3:$I$4967;4;"falso");
> SI($O$14=3;BUSCARV(B20;Articulos!A$3:$I$4967;5;"falso");
> SI($O$14=4;BUSCARV(B20;Articulos!A$3:$I$4967;6;"falso");
> SI($O$14=5;BUSCARV(B20;Articulos!A$3:$I$4967;7;"falso");
> SI($O$14=6;BUSCARV(B20;Articulos!A$3:$I$4967;8;"falso");
> BUSCARV(B20;Articulos!A$3:$I$4967;9;"falso")))))));"")
> Puesta unas cuantas veces, ralentiza el trabajo...
R.- Creo que son "demasiados SI(es) condicionales" (que "reservan" memoria en los cálculos).
"Deduzco" que tus condicionantes principales son:
$O$10<>"" Y B20<>"" Y $O$14>0 Y $O$14<=7
de donde, el valor de $O$14 (1 a 7) MAS 2, será la columna "devuelta" por BUSCARV (3 a 9).
De lo anterior, se puede "reducir" el número de SI(es) condicionales +/- así:
SI(Y($O$10<>"";B20<>"";$O$14>0;$O$14<=7);
BUSCARV(B20;Articulos!A$3:$I$4967;$O$14+2;FALSO);"")
Con respecto de...
> Lo que pretendo hacer es que en la celda que esta a la izquierda de la que modifico
> ponga el mismo valor que tiene la celda D10 (por ejemplo Fecha).
> El problema es... que no se hacerlo con código. Lo que pongo es
> hoja1.Activecell.Offset(0,-1).Value= hoja1.range("D10")
> Pero no me deja. Me dice :
> No se encontró el método o el dato miembro
> En lugar de : hoja1.Activecell.Offset(0,-1).Value= hoja1.range("D10") ¿que debo poner?
R.- El problema es que hoja1 "como tal", no está siendo reconocido como variable del tipo "Worksheet"
Sustituye hoja1 por: Worksheets("Hoja1")
Comentarios acerca de la "ruta" para referirse a "tipos de objetos" en Excel (p.e. un rango)
Libro.Hoja.Rango.Propiedad
Libro = Workbooks("NombreLibro.xls") Si se "omite"... se refiere el libro activo
Hoja = Worksheets("NombreHoja") Si se "omite"... se refiere a la hoja activa
Rango = Range("a1") -o- "a1:b567" Si se "omite"... se refiere a la celda activa
Propiedad = Value, Address, Row, etc. Si se "omite"... asume Value "por omisión".
Haz la prueba con lo siguiente: Activecell.Offset(0,-1) = Range("d10")
Se "asume" la propiedad Value (por omisión).
Con respecto de...
> o que en la celda que esta 10 celdas a la derecha ponga de momento, la formula,
R.- La forma de "introducir" fórmulas a través de VBA es "convirtiendo" la sintaxis A INGLES :-\
Haz la prueba con el siguiente "truco":
Selecciona una celda donde tengas alguna fórmula, de preferencia "complicada"
y EN BLANCO la celda de abajo y "ejecuta" la siguiente macro:
Sub TraducirFormula()
Temporal = ActiveCell.Formula
ActiveCell.Offset(1,0) = Mid(Temporal,2)
End Sub
"Verás" la fórmula traducida al inglés (sin el signo de igual), y podrás "sacar" tus conclusiones :-)
Nota IMPORTANTE. La "cadena vacía" (dos comillas dobles "") en funciones de hoja de cálculo,
NO PUEDE SER "procesada como tal" por macros, puesto que VBA "trunca" las cadenas de texto
"basándose" en que son "contenidas" por cada dos comillas dobles, por lo que es necesario...
sustituir dicha cadena vacía por la función String(Veces,Caracter), usando para la comilla doble
su "equivalente numérico" que es Chr(34).
Por lo tanto, String(2,Chr(34)) es igual a dos comillas dobles ó "cadena vacía ("").
O sea, la fórmula "necesita ser introcudida" de la siguiente manera:
ActiveCell.Offset(0,10).Formula = _
"=IF(AND($O$10<>" & String(2, Chr(34)) & ",B20<>" & String(2, Chr(34)) & ",$O$14>0,$O$14<=7), _
VLOOKUP(B20,Articulos!A$3:$I$4967,$O$14+2,FALSE)," & String(2, Chr(34)) & ")"
O "mejor aún"... puedes "evitarte" que la fórmula quede "impresa" en la celda y "reflejar" solo el resultado:
If Range("o10") <> "" And ActiveCell <> "" And Range("o14") > 0 And Range("o14") <= 7 Then
ActiveCell.Offset(0,10) = _
Application.WorksheetFunction.VLookup( _
ActiveCell, Sheets("Articulos").Range("a3:i4967"), Range("o14") + 2, False)
End If
Saludos,
Héctor.
Y contestando a tus respuestas:
La formula que me propones,
SI(Y($O$10<>"";B20<>"";$O$14>0;$O$14<=7);
BUSCARV(B20;Articulos!A$3:$I$4967;$O$14+2;FALSO);"")
no es correcta, aunque es bonita, Pero me acabas de dar una pista, la
parctico y vuelvo.
La practiqué y funciona (aunque la miraré mas despacio por si tuviera
consecuencias negativas.
La formula correcta es:
=SI(Y($O$10<>"";B20<>"");BUSCARV(B20;Articulos!A$3:$I$4967;2+O14;"falso");""
)
Creía que en la columna en la que hay que buscar era un valor absoluto, y
que no admitía un resultado de operaciones.
Vaya diferencia de formula.
Gracias de nuevo por tu idea.
Respecto a
hoja1.Activecell.Offset(0,-1).Value= hoja1.range("D10")
lo de Value, lo conocía, pero cundo falla todo, llamas hasta al diablo.
Hoja1 no es una variable. En realidad yo debiera haberte puesto
Albaran.Activecell.Offset(0,-1).Value= hoja1.range("D10")
Donde Albaran es
Dim Albaran As Worksheet
Set Albaran = ForAlbar
Donde a su vez ForAlbar es lo que ves cuando abres la ventana de
Propiedades, en la primera línea
(name)ForAlbar
y en el explorador de proyectos, para esta hoja ves:
ForAlbar(Ventas)
Por otro lado.
Si utilizo la notación que me propones
Activecell.Offset(0,-1) = Range("d10")
no me da resultado, pero sí si hago
Activecell.Offset(-1,-1) = Range("d10")
porque ActiveCell ( y no me gusta, me siento inseguro con este
funcionamiento, ) es la celda a la que ha ido el "foco" de Excel después del
Intro , por tanto , el valor lo pone relacionado con el método que utilices
para validar el dato, no con la celda en la que lo introduces.
No es la celda ActiveCell, al menos a mi no me pasa, en la que he
introducido la variación.
Para Excel, Activecell es la celda donde vas a parar cuando validas el dato,
y lo puedes hacer con:
Intro o Flecha abajo: lo hace bien
Flecha arriba, lo hace mal
Tabulador ( en mi caso,no pone nada)
Es decir es un método inseguro.
Estoy haciendo algo mal o mi ordenata falla?
Saludos
José Luis.
P.D.Salgo de Viaje y vuelvo el miercoles.Si para entonces supieras algo...
te lo agradecería.
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
uYJF2J$nBHA.2528@tkmsftngp04...
Algunas ideas... (y son solamente eso... ideas)
> SI(Y($O$10<>"";B20<>"";$O$14>0;$O$14<=7);
> BUSCARV(B20;Articulos!A$3:$I$4967;$O$14+2;FALSO);"")
> no es correcta... La formula correcta es:
> SI(Y($O$10<>"";B20<>"");
> BUSCARV(B20;Articulos!A$3:$I$4967;2+O14;"falso");"")
> La practiqué y funciona (aunque la miraré mas despacio por si tuviera consecuencias negativas.
Pregunta: ¿Que pasa si...? "O14" > 7 ...el resultado de "2+O14" sería > 9 ...para BuscarV
R.- Tendrías que "regresar" a... SI(Y($O$10<>"";B20<>"";$O$14>0;$O$14<=7);...
Nota: No importaría si en notación "absoluta" o "relativa", puesto que (si es lo qie pretendes hacer)...
al "introducir" la fórmula ("tal-cual-es") con macros... las erferencias serían...
"relativamente - absolutas" (siempre las mismas... en donde corresponde) :-))
> hoja1.Activecell.Offset(0,-1).Value= hoja1.range("D10")
> Hoja1 no es una variable. En realidad yo debiera haberte puesto
> Albaran.Activecell.Offset(0,-1).Value= hoja1.range("D10")
> Donde Albaran es
> Dim Albaran As Worksheet
> Set Albaran = ForAlbar
> Donde a su vez ForAlbar es lo que ves cuando abres la ventana de ropiedades,
> en la primera línea (name) ForAlbar en el explorador de proyectos, para esta hoja ves: ForAlbar(Ventas)
R.- "ForAlbar", como lo "ves" en el explorador de proyectos es (aunque un tanto "desconocido" ?)...
el "nombre código" (CodeName) para tu objeto Worksheets("Ventas") y...
se puede cambiar (en la ventana de propiedades) en el campo Name
> Si utilizo la notación que me propones: Activecell.Offset(0,-1) = Range("d10")
> no me da resultado, pero sí si hago: Activecell.Offset(-1,-1) = Range("d10")
> porque ActiveCell (y no me gusta, me siento inseguro con este funcionamiento)
> es la celda a la que ha ido el "foco" de Excel después del Intro, por tanto ...(etc.)
R.- Tienes razón. El uso de ActiveCell "dependerá" de...
1.- La forma, usos y costumbres del usuario en cuanto a "Mover la selección despues del intro..."
2.- La manera de "referenciar" desde una macro a la celda que "origina" o "recibe" una acción
3.- Muchas otras...
Saludos,
Héctor.
Algunas ideas... (y son solamente eso... ideas) **se agradecen**
La formula correcta es:
SI(Y($O$10<>"";B20<>"");
BUSCARV(B20;Articulos!A$3:$I$4967;2+O14;"falso");"")
Pregunta: ¿Que pasa si...? "O14" > 7 ...el resultado de
"2+O14" sería > 9 ...para BuscarV
R.- Tendrías que "regresar" a...
SI(Y($O$10<>"";B20<>"";$O$14>0;$O$14<=7);...
Es difícil que pase algo.
No es un numero introducido, sino algo obtenido de otro lugar y yo sé lo que
puede venir.
Pero tienes razón.
Por si un dia pasa algún despiste, de la manera que propones se evitan
riesgos innecesarios.
Lo cambiaré
Nota: No importaría si en notación "absoluta" o "relativa", puesto que (si
es lo qie pretendes hacer)...
al "introducir" la fórmula ("tal-cual-es") con macros... las
erferencias serían...
"relativamente - absolutas" (siempre las
mismas... en donde corresponde) :-))
> hoja1.Activecell.Offset(0,-1).Value= hoja1.range("D10")
> Hoja1 no es una variable. En realidad yo debiera haberte puesto
> Albaran.Activecell.Offset(0,-1).Value= hoja1.range("D10")
> Donde Albaran es
> Dim Albaran As Worksheet
> Set Albaran = ForAlbar
> Donde a su vez ForAlbar es lo que ves cuando abres la ventana de
ropiedades,
> en la primera línea (name) ForAlbar en el explorador de proyectos, para
esta hoja ves: ForAlbar(Ventas)
R.- "ForAlbar", como lo "ves" en el explorador de proyectos es (aunque un
tanto "desconocido" ?)...
el "nombre código" (CodeName) para tu objeto Worksheets("Ventas")
y...
se puede cambiar (en la ventana de propiedades) en el campo Name
Que diferencia hay entre el CodeName y el Name?
****Pues con todo ello, sigo sin poder solucionar lo que creí que casi
podia.
Te planteo, o replanteo, de nuevo la pregunta
¿ Cómo hago para que , en la misma línea que esta la celda en que se
introduce un dato, sea cual sea la tecla utilizada para validar ( intro,
Tab, Flechas ), se ponga una formula o un dato?
He mirado la ayuda y no me ayudo.
Hay algo parecido a :
Si alguna celda cambia ( no activecell), celda_cambiada.offset(-1,-1).Value
="Et Voila"
Saludos,
Héctor.
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
uPyvXtIoBHA.2564@tkmsftngp04...
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
uPyvXtIoBHA.2564@tkmsftngp04...
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
uPyvXtIoBHA.2564@tkmsftngp04...
> Te he intentado mandar un mensaje pero se ha debido marchar de vacaciones, porque no lo veo.
> Te preguntaba algo así como ...
> Dado que el resultado obtenido con la macro en la que se introducían datos dependía del método de validación,
> ¿hay alguna formula de decirle que en la misma fila en que está la celda que se ha modificado
> (por cambio de lo existente o por introducción de un dato nuevo), pero dos celdas mas a la derecha ponga "la
cambiaste" ?
R.- "Intento" seguir con tu mensaje de que la celda que cambie sea "dentro" de "b20:b70"
===== 15 de Enero =====
Cambia "ligeramente" el ejemplo propuesto en mensajes anteriores a: ...
Private Sub Worksheet_Change(ByVal Target As Range)
' Primero "validamos" el rango... o nos "brincamos" (por si tienes otras acciones) '
If Application.Intersect(Target, Range("b20:b70")) Is Nothing Then GoTo Siguiente
' Aquí avisas (dos celdas a la derecha) cual celda se ha modificaco / "borrado" '
Target.Offset(0, 2) = "Ha cambiado la celda " & Target.Address
' Nota: si el cambio fue la "eliminación" del dato que contenía {Supr}... "borrar" TODA la línea '
On Error Resume Next
If Target = 0 Then
Target.EntireRow.ClearContents
GoTo Siguiente
' Aquí puedes "validar" los datos introducidos y/o otras condicionantes ... '
ElseIf Range("o10") <> "" And Range("o14") > 0 And Range("o14") <= 7 Then
' Aquí las acciones si se "cumplen" otras condicionantes... '
End If
Siguiente:
' Otras líneas de código ... '
End Sub
Saludos,
Héctor.
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
#q#yV2CpBHA.2204@tkmsftngp02...
Esta macro que te pedí, es para hacer un albaran, eliminando tantas formulas
como pueda ( si puedo, todas las que pidan datos a una hoja diferente de la
activa[+ d 700], que en el futuro será un libro distinto).
Dentro de esa hoja van a ir al menos de 10 a 15 rangos, con cuya variación
se van a ejecutar algunas acciones o se lanzaran macros completas.
Algunas de ellas interactuaran con los otros rango y ... ya me han
comenzado a dar problemas.
Después de haber rellenado las celdas que necesito, del rango que
seleccionamos con:
Application.Intersect(Target, Range("B20:B70")) , por ejemplo B20:B25
tengo que lanzar otra macro que al final borrará las celdas , entre otras,
del rango B20:B25. O, cuando por error, ( este es el caso hasta ahora) he
puesto algo en el rango que luego no deseo, y por tanto borro.
Con tu macro, aplicada por mi de la siguiente forma,
Private Sub Worksheet_Change(ByVal Target As Range)
' "validamos" el rango... o nos "brincamos"
If Application.Intersect(Target, Range("B20:B70")) Is Nothing Then GoTo
FinDeCodigos
If Target <> "" Then ' ---------me da error en esta linea
Target.Offset(0, -1) = Range("L11")
Target.Offset(0, 9).Select
End If
If Target = "" Then
' Target.Offset(0, -1).ClearContents '--Este no da problemas
Target.EntireRow.ClearContents '--Este SI da problemas.
Target.Select
End If
FinDeCodigos:
If Application.Intersect(Target, Range("K20:K70")) Is Nothing Then GoTo
Siguiente
If Target <> "" Then
Target.Offset(1, -9).Select
End If
Siguiente:
' Otras líneas de código ... '
End Sub
Me da problemas el borrar celdas de B20:B70 y me manda a la primera linea
del primer IF:
If Target <> "" Then (cuando target esta entre B20:B70)
Puedes decirme donde me equivoco?
Saludos
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
#q#yV2CpBHA.2204@tkmsftngp02...
> La macro me funciona bien con una sola intersección
R.- Puedes "definir" más If Target.Address... Then ...etc.
> Esta macro es para hacer un albaran, eliminando tantas formulas como pueda
> (si puedo, todas las que pidan datos a una hoja diferente de la activa [+ d 700]
> que en el futuro será un libro distinto).
R.- Para "encontrar" celdas con fórmulas referenciadas a otras hojas...
tienes que "meterte" (a través de un "bucle") con las que tengan fórmulas
que contengan el signo final de admiración "!", p.e.
Sub ReferenciasAjenas()
For Each Celda In ActiveSheet.UsedRange
If Celda.HasFormula Then
If InStr(1, Celda.Formula, "!") > 0 Then
' ... aquí las acciones para la celda con referencias "extrañas" :-) ... '
End If
End If
Next
End Sub
> Dentro de esa hoja van a ir al menos de 10 a 15 rangos
R.- Define "varios rangos de acción" según la celda (Target) modificada... p.e.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Range("b20:b25")) Is Nothing Then
' ... acciones si Target es parte de este rango... '
ElseIf Not Application.Intersect(Target, Range("b26:b70")) Is Nothing Then
' ... acciones si Target es parte de este rango... '
ElseIf Not Application.Intersect(Target, Range("k20:k70")) Is Nothing Then
' ... acciones si Target es parte de este rango... '
ElseIf Not Application.Intersect... (los que necesites)
' ... acciones si Target es parte de este rango... '
End If
' ... otras líneas de tu código ... (CUALQUIER otro Target "fuera" de este If...End If) '
End Sub
> con cuya variación se van a ejecutar algunas acciones o se lanzaran macros completas.
> Algunas de ellas interactuaran con los otros rango y ... ya me han comenzado a dar problemas.
> tengo que lanzar otra macro que al final borrará las celdas , entre otras, del rango B20:B25.
R.- Si dentro del código necesitas modificar celdas "detectadas por eventos especiales" :-)...
será necesario que ANTES de tales modificaciones "deshabilites" sus eventos y que...
INMEDIATAMENTE DESPUES de modificarlas, los restablescas, p.e.
Application.EnableEvents = False ' para "inhabilitar" la detección '
' líneas que "modifican" celdas (Target) con "eventos especiales" ... '
Application.EnableEvents = True ' para restablecer los eventos '
> O cuando por error, (este es el caso hasta ahora) he puesto algo en el rango que luego no deseo, y por tanto borro.
R.- Creo que será difícil "detectar" si alguna celda se borra {Supr} para corregir...
o para "lanzar" eventos (en el case de; If Target = "" Then)
ya que su "valor final" será = "" (ó = 0) :-\
Si (por error ó "cambio de opinión") necesitas corregir celdas "detectables"... corrige en lugar de usar {Supr}
Una de las tareas más "quema-neuronas" en programación es...
"anticipar" (en la medida de lo posible) las acciones del usuario para poder
"evaluar" las consecuencias de las acciones que ejecutará el código y finalmente...
"diseñar" prevenciones o correcciones de "errores" :-))
Saludos,
Héctor.
Me has dejado un poco desorientado.Me explico.
Con las instrucciones
Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("B20:B70")) Is Nothing Then GoTo
FinDeCodigos
If Target <> "" Then
Target.Offset(0, 12).Select
Target.Offset(0, -1) = Range("L11")
End If
If Target = "" Then
Application.EnableEvents = False
Target.Offset(0, -1).ClearContents ' no da problemas
Target.EntireRow.ClearContents ' YA no da problemas.
Target.Select
Application.EnableEvents = True
End If
FinDeCodigos:
End Sub
no me da error ninguno y puedo borrar sin problemas aparentes y rehacer de
nuevo el rango B20:B70, pero como me dices:
R.- Creo que será difícil "detectar" si alguna celda se borra {Supr} para
corregir...
o para "lanzar" eventos (en el case de; If Target = "" Then)
ya que su "valor final" será = "" (ó = 0) :-\
Si (por error ó "cambio de opinión") necesitas corregir celdas
"detectables"... corrige en lugar de usar {Supr}
me lio.
La instrucción If Target = "" ¿ no es lo mismo que If Target = está borrado
?
donde me estoy perdiendo?
Por otro lado.Si la ultima introducción es un error, necesito borrar
necesariamente
Saludos
José Luis
P.D. Dices : Una de las tareas más "quema-neuronas" en programación es,
"anticipar" (en la medida de lo posible) las acciones del usuario ...
Pues imaginate cuando el que tiene que romperse las neuronas es el propio
ususario.
Ni te cuento.
Ahora me explico que me queden tan pocas.
Por otro lado puse un Private Sub Worksheet_Activate() en el libro que
abrí, con la intención de que al abrirse , por tener solo una hoja, se
activaría esta y se ejecutaría la macro. Pero no es así.
¿ No se activa automáticamente la única hoja de un libro al abrirse?
Saludos
José Luis
> ¿Se puede hacer que desde un libro A (el que contiene el código),
> se detecte el cambio efectuado en una celda de una hoja de otro libro (B)
> y que ese cambio cause la ejecución de una macro o una instrucción escrita en el libro (A)
> que afecta solo al otro libro (B), sin que haya código alguno escrito en el otro libro (B)?
Hace unos días, Henry Sánchez preguntaba acerca de la instrucción "WithEvents"...
En resumen, "sirve" para detectar eventos
EN CUALQUIER OBJETO Work(Book/Sheet), Window dentro de la aplicación.
En otras palabras, aquí "encaja" lo que quieres hacer...
Escribir código en un libro (A) que "maneje" los eventos en otro libro (B)
Estoy seguro de que te resultará fácil adecuar a tus necesidades lo siguiente:
===== ===== =====
Comentarios acerca de la instrucción "WithEvents"
Son eventos "aplicables " al objeto Application y deben estar en un "módulo de clase"
p.e.:
1.- Inserta un módulo de clase (VBEditor -> Insertar -> Módulo de clase)
2.- "Nombralo" como: AppEventClass (Name en ventana de propiedades)
3.- En el "área de declaraciones" (del nuevo módulo de clase), "declara":
Public WithEvents Appl As Application
4.- Para "activar" los nuevos eventos, agrega lo siguiente en el módulo de ThisWorkbook :
Dim ApplicationClass As New AppEventClass ' Es el "nombre dado" en el paso 2 '
Private Sub Workbook_Open()
Set ApplicationClass.Appl = Application ' Es la "variable declarada" en el paso 3 '
End Sub
5.- Ahora tendrás "nuevos" eventos disponibles (en el módulo de clase) como:
Private Sub Appl_NewWorkbook(ByVal Wb As Workbook)
Private Sub Appl_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
Private Sub Appl_WorkbookOpen(ByVal Wb As Workbook)
Private Sub Appl_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)
En resumen, tendrás acceso a los siguientes eventos "nuevos":
NewWorkbook, WorkbookOpen, WorkbookNewSheet
WorkbookActivate, WorkbookDeactivate
WorkbookAddinInstall, WorkbookAddinUninstall
WorkbookBeforePrint, WorkbookBeforeClose, WorkbookBeforeSave
SheetActivate, SheetDeactivate, SheetCalculate
SheetChange, SheetSelectionChange
SheetBeforeDoubleClick, SheetBeforeRightClick
WindowActivate, WindowDeactivate, WindowResize
> Por otro lado puse un Private Sub Worksheet_Activate() en el libro que abrí
> con la intención de que al abrirse, por tener solo una hoja, se activaría esta y se ejecutaría la macro
> Pero no es así. ¿No se activa automáticamente la única hoja de un libro al abrirse?
R.- El evento Worksheet_Activate() "ocurre" al cambiar de una hoja a otra :-\
Para correr una macro en la apertura del libro, coloca el código:
-o- en el evento Workbook_Open() -en el módulo de ThisWotkbook"-
-o- en una macro Auto_Open() -en un módulo "general"-
Saludos,
Héctor.
Saludos
José Luis
Héctor Miguel <oro...@cybercable.net.mx> escribió en el mensaje de noticias
OOuaocGrBHA.2324@tkmsftngp03...