Restar, pero no sumar

18/01/2004 - 03:40 por Jesus | Informe spam
Hola a todos

Desearía saber si hay una formula para hacer lo siguiente:
Tengo en las columnas B, C, D, E y F una serie de números ( aunque algunas
pueden estar vacías), y en la columna G la suma. En la siguiente columna (
H ) tengo que poder introducir un número, pero que si cualquier valor de las
5 columnas disminuye, también lo haga este número (solo hasta cero, no
negativo) pero que si aumenta cualquiera de estas 5 columnas, no lo haga el
de la H.
Si no existe fórmula, no importa que sea en VBA.

Mis agradecimientos de antemano, un saludo
Jesús

Preguntas similare

Leer las respuestas

#6 Héctor Miguel
20/01/2004 - 03:48 | Informe spam
hola, Jesus !

... me he vuelto a precipitar.
... probe en una hoja (de las 4 en las que quiero ponerlo), quitandole la proteccion, y no 'funcionaba'.
... con solo una hoja que este protegida, o me 'da' algún error, o simplemente no 'funciona'.
Pero deben estar protegidas.



haciendo una pequeña 're-capitulacion' de los comentarios expuestos [hasta ahora] ...
¿podrias confirmar [o modificar] lo siguiente?...
- las columnas 'afectables' son 'B', 'C', 'D', 'E' y 'F'
- la columna a 'monitorear' es la columna 'H'
- son 'varias' hojas en el libro... =>¿TODAS? o... si 'solo algunas'... ¿CUALES?<- en todas 'esas' hojas, los datos... ¿empiezan en la misma fila?
- los datos se introducen por codigo... ¿por 'bloques' de celdas? o... una celda 'a la vez' [???]
- ¿algun otro 'dato importante'???

saludos,
hector.

p.d. con respecto de la necesidad de que la/s hoja/s tenga/n proteccion 'NO hay problema'
podrias usar en el evento '_Open' del libro algo +-/ como lo siguiente: ;)

Private Sub Workbook_Open()
Worksheets("Hoja1").Protect UserInterfaceOnly:=True
End Sub

si se trata de 'varias' hojas, puedes modificar a lo siguiente:
Private Sub Workbook_Open()
Dim Hoja As Worksheet
For Each Hoja In Worksheets(Array("Hoja1", "Hoja3"))
Hoja.Protect UserInterfaceOnly:=True
Next
End Sub

[SIEMPRE Y CUANDO 'otros' codigo NO 'se pongan a manosear' la proteccion de 'esa/s' hoja/s'] <=
Respuesta Responder a este mensaje
#7 Jesus
20/01/2004 - 23:39 | Informe spam
Hola de nuevo Héctor.
En respuesta a tu anterior mensaje, te comento,
- las columnas del 'ejemplo' son esas, pero 'casi con seguridad' que sean de
8 a 9.
- en este caso es la columna H , pero en el caso de haber mas columnas
'afectadas', sería la segunda hacia la derecha, después de las afectadas.
- las hojas 'afectadas' son todas, menos la primera y la última del 'libro'
(de 8 a 10)
- en todas las hojas empiezan en la misma fila
- las celdas no se modifican por 'bloques', sino una cada vez.

En cuanto a usar 'ese' código en el evento '_Open' del libro, es una de las
cosas que había 'probado' (soy seguidor del foro desde hace algún tiempo, y
ha 'salido' en varias ocasiones), y probablemente sea otro 'código' el que
lo 'estropea'.

Un saludo
Jesús
Respuesta Responder a este mensaje
#8 Héctor Miguel
21/01/2004 - 06:21 | Informe spam
hola, Jesus !

- las columnas ... 'casi con seguridad' que sean de 8 a 9.
- ... en el caso de haber mas columnas ... seria la segunda hacia la derecha, despues de las afectadas.
- las hojas 'afectadas' son todas, menos la primera y la última del 'libro' (de 8 a 10)
- en todas las hojas empiezan en la misma fila
- las celdas no se modifican por 'bloques', sino una cada vez.



1.- estoy 'tomando' como base los siguientes 'supuestos' [modifica donde que 'corresponda'] :))
=> el rango de datos es 'variable' :\\ 'pero...' con las siguientes 'constantes':
a) empieza desde 'A1'
b) la primer fila y la primer columna son [o pudieran ser] 'titulos'
c) la penultima columna es la sumatoria de las 'afectables'
d) la siguiente columna [ultima] es donde 'va' el dato a 'corregirse'
e) 'determino' el rango 'afectable' usando la propiedad 'CurrentRegion' [y el metodo 'Resize']
[en 'resumen'... hay 3 columnas y 1 fila que NO son 'afectables']
=> si tienes 'otras' columnas [fuera de la 'base de datos], ASEGURATE de 'separarlas' [al menos] 'por' 1 columna <2.- estoy 'usando' los eventos 'de hojas' [pero] del modulo de codigo del libro [ThisWorkbook]
[como se requiere de algunas 'trampitas' :(( dejo 'libres' los modulos de eventos de las hojas 'individuales']
3.- los nombres de 'esas' primera y ultima hojas [obviamente] los 'invente' :))
4.- el proceso 'necesita' que le 'ayudes' en ['indicarle'] dos 'cosillas':
1) que el proceso 'en si' [modificar celdas por codigo] se va a iniciar [una variable de tipo 'booleana' =>Monitorear<=]
2) que le 'pases' el valor 'anterior' de cada ceda 'afectable' que se modifique por el codigo ['desde' la macro que
'modifica'].
[al final te 'expongo' una 'estructura' del codigo que use para 'avisarle' ANTES de cambiarlo, el valor 'anterior' de
c/celda]

¿comentas que fallas 'aparecen' en 'tiempo real'? :((
saludos,
hector.

en un modulo de codigo 'normal' ==Public DatoAnterior As Double, Cambio As Double, _
ColCambio As Integer, RangoDatos As String, _
Monitorear As Boolean

en el modulo de codigo del libro [ThisWorkbook] ==Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Monitorear Then Exit Sub
If Sh.Name = "Primer Hoja" Or Sh.Name = "Ultima Hoja" Then Exit Sub
With Sh.Range("a1").CurrentRegion
ColCambio = .Column + .Columns.Count - 1
RangoDatos = .Offset(1, 1).Resize(.Rows.Count - 1, .Columns.Count - 3).Address
End With
If Intersect(Target, Sh.Range(RangoDatos)) Is Nothing Then Exit Sub
Cambio = Target - DatoAnterior
If Cambio >= 0 Then Exit Sub
With Sh.Cells(Target.Row, ColCambio)
Application.EnableEvents = False
If .Value + Cambio <= 0 Then .ClearContents Else .Value = .Value + Cambio
Application.EnableEvents = True
End With
End Sub

la forma de 'pasarle' las ayudas al evento ==Sub ModificarPorCodigo()
Dim Sig As Integer
Monitorear = True ' <= aqui le 'avisamos' que se va a iniciar 'el proceso' '
For Sig = 2 To 7
With Worksheets("Hoja2").Range("e" & Sig)
DatoAnterior = .Value ' <= aqui le 'pasamos' el valor que 'tenia' cada celda que se esta modificando '
.Value = .Value - 5
End With
Next
Monitorear = False ' <= aqui 'cancelamos' el aviso del proceso_en_marcha '
End Sub
Respuesta Responder a este mensaje
#9 Jesus
22/01/2004 - 23:42 | Informe spam
Hola Héctor, te comento:

Has acertado 'de lleno' en todos los 'puntos', y en cuanto a 'fallas' no
aparece ninguna, pero no consigo que 'funcione'.
Te cuento lo que he hecho:
- Primero he 'borrado' el anterior código
- Después he copiado lo que va en un módulo 'normal'
- En el módulo del libro he copiado el resto del código.
- He cambiado en la siguiente línea el nombre de la primer y última Hoja (no
la primera y última hoja del Libro, sino de las 'afectables' ) -- If Sh.Name
= "Primer Hoja" Or Sh.Name = "Ultima Hoja" Then Exit Sub --
- Por último, en la siguiente linea de codigo he sustituido "Hoja2", por el
nombre de la primera hoja 'afectable' -- With Worksheets("Hoja2").Range("e"
& Sig) -- Lo demás no lo he 'tocado'.

Después de hacer varias 'pruebas', no consigo hacerle funcionar (en la
última columna no sucede nada). O 'he hecho' algo que no debía, o 'no he
hecho' algo que debía hacer (soy algo mas torpe de lo que creía)
Agradecerte una vez mas tu ayuda y tu tiempo.

Un saludo
Jesús
Respuesta Responder a este mensaje
#10 Héctor Miguel
23/01/2004 - 03:47 | Informe spam
hola, Jesus !

... no consigo que 'funcione'.
- ... he 'borrado' el anterior codigo
- ... he copiado lo que va en un modulo 'normal'



==> en el modulo 'normal' van SOLO las variables <= [opcionalmente, el codigo que expuse al final con el ejemplo de 'como' hice yo para ...
1.- ... 'habilitar' la variable que 'le avisa' al evento que 'haga el monitoreo'
2.- ... 'pasarle' al evento el 'dato anterior' de la celda QUE VOY A MODIFICAR
=> 'aqui' las lineas que modifican las celdas < 3.- ... 'des-habilitar' [finalmente] la variable del 'monitoreo'

- En el modulo del libro he copiado el resto del codigo.



==> en el modulo del libro va SOLO el codigo del evento Private Sub Workbook_SheetChange... <=
- ... en la siguiente linea de codigo he sustituido "Hoja2", por el nombre de la primera hoja 'afectable'
- ... -- With Worksheets("Hoja2").Range("e" & Sig) -- Lo demas no lo he 'tocado'.
... varias 'pruebas', no consigo hacerle funcionar (en la ultima columna no sucede nada).
O 'he hecho' algo que no debia, o 'no he hecho' algo que debia hacer [...]



==> [una disculpa... creo que no fui lo 'suficiente claro'] 'esas' lineas son del 'ejemplo' :(
'tendrias que' incluir [donde corresponda] los 3 puntos [que menciono al inicio]
EN TU PROPIO codigo [segun la forma que empleas para modificar las celdas 'afectables']

si quedan dudas... ¿transcribes el codigo que 'uas' para modificar las celdas?

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