Valor de variables.

15/07/2005 - 22:59 por Desastres | Informe spam
Buenas tardes.
Tengo unas variables levantiscas. Recogen datos del tipo Código de documento, fecha y valor del documento.
Quería declararlas como Single, pero si lo hago, con las instrucciones siguientes:

If variable = "" then msgbox " Toca la trompeta"
If variable <>"" then msgbox " Toca la trompeta"

resulta que la trompeta no se calla.

Para conseguir que se calle la trompeta la mitad de las veces, tengo que declar las variables como Variant y utrilizar :

If IsEmpty(Variable) then MsgBox " Toca la trompeta"
If Not IsEmpty(Variable) then MsgBox " Toca la trompeta"

Pero no es lo que deseaba hacer. ¿Como puedo tener la seguridad de que una variable tiene algún valor y obtenerlo? y
¿como anular ese valor ( no cero que es un valor posible ) ?

Saludos
Des

Preguntas similare

Leer las respuestas

#6 Desastres
16/07/2005 - 10:34 | Informe spam
Gracias Kl.

No hay ningún problema. Yo mismo te lo decía.
> cero. Si pido el valor de la variable en este momento, no sabré si se ha
> inicializado o no, salvo que ponga un contador
> paralelo a ella que me recoja todas las veces que no ha sido cero, con lo



En ocasiones lo utilizo , generalmente con un bucle for next, pero me hubiera gustado ahorrar alguna línea

La mayor parte del tiempo de desarrollo lo dedico ( además de modificar mis conocimientos) a prevenir todo los errores
que se pudieran producir, tanto voluntariamente (caracteres inadecuados, etc) como involuntariamente, ( salir de un
proceso inicializado por errores de programación, por ejemplo).

A la primera parte pertenece la consulta, saber si a una variable ( no variant ) estaba inicializada, con lo cual me
ahorraba algunas líneas ( siempre procuro el código mas corto para hacer un trabajo).

En cualquiera de los casos me has dado la respuesta.
Como casi siempre hay alternativa a un código, lo modificaré

Saludos
Des






"KL" escribió en el mensaje news:%
Hola Desastres,

Y cual es el problema de basar tu contador en el valor de la celda y no en
el de la variable entonces? P.ej.:

For Each c In rng
If Not IsBlank(c) Then
Contador=Contador+1
'El resto de tu codigo
End If
Next c

Saludos,
KL


"Desastres" wrote in message
news:
> Hola KL, Gracias.
>
> No tengo el código a mano (esta en otro Pc sin conexión) pero el
> planteamiento es muy sencillo.( la solución, para mi,
> es otra cosa).
> En un proceso comercial se pueden definir tres tipos de documentos:
> Pedido, Factura pro forma y Factura comercial (
> entre otros ).
> Supón el numero/ código del pedido en la columna 6, el de la factura pro
> forma en la 8 y la Factura comercial en la 10.
> Como el proceso, en este caso, comienza por el pedido, cada una de las
> líneas tiene código de pedido y fecha de pedido,
> pero no es obligatorio( al menos en mi planteamiento) que se pase una
> Factura pro forma de todas las líneas del pedido
> ( por tanto alguna línea en Factura Pro forma no tendrá valor , o lo que
> es lo mismo la variable que la recoja valdrá
> cero. Si pido el valor de la variable en este momento, no sabré si se ha
> inicializado o no, salvo que ponga un contador
> paralelo a ella que me recoja todas las veces que no ha sido cero, con lo
> cual sabría que ha sido inicializada si el
> contador es al menos 1..
> La misma proporción entre Pedido y pro forma se puede establecer entre Pro
> forma y Factura comercial definitiva. ( en
> este caso columna 10 )
> Se trataba tan solo de intentar sacar el máximo partido con los menos
> pasos posibles.
> Saludos
> Des
>
>
>
> "KL" escribió en el mensaje
> news:
>> Hola Desastres,
>>
>> Pues con los tipos numericos va a ser dificil si no imposible, dado que
>> el
>> valor inicial (por defecto) es tambien uno de los valores permitidos por
>> tu
>> macro. De todas formas, por que no expones tu codigo y pensamos juntos en
>> alguna solucion radicalmente distinta?
>>
>> Saludos,
>> KL
>>
>>
>> "Desastres" wrote in message
>> news:%
>> > Hola KL, Gracias.
>> >
>> > Si la variable ( utilicé Single) toma valores distintos en un proceso y
>> > coincide que el ultimo o una secuencia al final
>> > , tiene por valor cero( el mismo valor que por defecto ) , no podré
>> > discernir si ha sido inicializada o no.
>> >
>> > Aún así me has ayudado, pero quisiera encontrar una forma de obtener
>> > como
>> > respuesta la seguridad de que la variable se
>> > ha "llenado" o no.
>> > Es decir, obtener algo similar al IsEmty de una Variant o el Is nothing
>> > de
>> > un rango no encontrado con un Find.
>> >
>> > Saludos
>> > José Luis
>> >
>> > "KL" escribió en el mensaje
>> > news:%
>> >> Hola Desastres,
>> >>
>> >> No estoy seguro de entender lo que intentas hacer. En todo caso
>> >> decirte
>> >> que
>> >> al declarar una variable como:
>> >>
>> >> Single, Double, Long, Integer, etc. - el valor de la variable por
>> >> defecto
>> >> es
>> >> 0 y no puede ser "" a no ser que fuerces la conversion redeclarandola
>> >> o
>> >> mediante alguna de las funciones de conversion tipo CStr, etc.
>> >>
>> >> String - el valor de la variable por defecto es "", y aunque le
>> >> asignes
>> >> numeros seran cadenas de texto, p.ej. "0", "1", "333", etc. Tambien se
>> >> puede
>> >> forzar la conversion p.ej. mediante CDbl, CLng, etc.
>> >>
>> >> Boolean - el valor de la variable por defecto es False, etc. etc.
>> >>
>> >> Variant - adoptara el tipo segun el valor que le asignes (por cierto
>> >> es
>> >> el
>> >> tipo por defecto si no se ha declarado la variable expresamente) y
>> >> puede
>> >> variar facilmente en teimpo de ejecucion.
>> >>
>> >> Comentas mas detalles?
>> >>
>> >> Saludos,
>> >> KL
>> >>
>> >>
>> >>
>> >> "Desastres" wrote in message
>> >> news:
>> >> > Buenas tardes.
>> >> > Tengo unas variables levantiscas. Recogen datos del tipo Código de
>> >> > documento, fecha y valor del documento.
>> >> > Quería declararlas como Single, pero si lo hago, con las
>> >> > instrucciones
>> >> > siguientes:
>> >> >
>> >> > If variable = "" then msgbox " Toca la trompeta"
>> >> > If variable <>"" then msgbox " Toca la trompeta"
>> >> >
>> >> > resulta que la trompeta no se calla.
>> >> >
>> >> > Para conseguir que se calle la trompeta la mitad de las veces, tengo
>> >> > que
>> >> > declar las variables como Variant y utrilizar :
>> >> >
>> >> > If IsEmpty(Variable) then MsgBox " Toca la trompeta"
>> >> > If Not IsEmpty(Variable) then MsgBox " Toca la trompeta"
>> >> >
>> >> > Pero no es lo que deseaba hacer. ¿Como puedo tener la seguridad de
>> >> > que
>> >> > una variable tiene algún valor y obtenerlo? y
>> >> > ¿como anular ese valor ( no cero que es un valor posible ) ?
>> >> >
>> >> > Saludos
>> >> > Des
>> >> >
>> >> >
>> >>
>> >>
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#7 Héctor Miguel
17/07/2005 - 00:40 | Informe spam
hola, chicos !

Desastres escribio en el mensaje ...
... saber si a una variable (no variant) estaba inicializada, con lo cual me ahorraba algunas lineas [...]



segun lo comentado en este hilo [y segun lo entiendo]... si 'solo' necesitas...
-> consultar el estado que guardan 3 procesos [Pedido, Factura pro forma y Factura comercial] ->entre otros<-
-> que se encuentran en las columnas 6, 8 y 10 [F, H y J] ->entre otras<-
-> segun 'cierta' fila [p.e. la celda activa de la hoja 'apropiada'... que es la que uso en los ejemplos] ->o varias<- -?-
y 'asumiendo' que NO 'te escaparias' de alguno que otro bucles for...next :((
[que vienen a ser 'el corazon' de las propuestas siguientes]
-> una alternativa podria ser consultar si 'IsEmpty' [directamente] ->la/s celda/s<-
o... 'pasar' el contenido de las celdas por variables ->de tipo variant<- :(( [entre otras] :))
el [posible] 'ahorro' de lineas [probablemente] dependera de...
-> la forma, momento y veces en que vayas a necesitar 'hacer las consultas' :D
[quizas habra una 'cierta' rapidez si utilizas lineas que llamen a funciones 'ex-profeso'] -?-

en fin... analiza, modifica, [o lo que sea necesario] los ejemplos que siguen ;)
si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.
=' una macro para llamar a las funciones '
Sub Mis_Variables()
MsgBox DirectoDeLasCeldas(ActiveCell.Row)
MsgBox PasandoPorVariables(ActiveCell.Row)
End Sub
' funcion 'en directo' '
Function DirectoDeLasCeldas(ByVal Fila As Long) As String
Dim Msj As String, Col As Byte, Proc As Byte, Proceso
Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr & String(15, "=")
Proceso = Array("Pedido", "F. Prof", "F. Com")
For Col = 6 To 10 Step 2
Msj = Msj & vbCr & Proceso(Proc) & vbTab & _
IIf(IsEmpty(Cells(Fila, Col)), "NO", "SI") & vbTab & ">" & Cells(Fila, Col) & "<"
Proc = Proc + 1
Next
DirectoDeLasCeldas = Msj
End Function
' funcion por variabes '
Function PasandoPorVariables(ByVal Fila As Long) As String
Dim Msj As String, Sig As Byte, Proceso, Estado(3)
Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr & String(15, "=")
Proceso = Array("Pedido", "F. Prof", "F. Com")
Estado(0) = Range("f" & Fila)
Estado(1) = Range("h" & Fila)
Estado(2) = Range("j" & Fila)
For Sig = 0 To 2
Msj = Msj & vbCr & Proceso(Sig) & vbTab & _
IIf(IsEmpty(Estado(Sig)), "NO", "SI") & vbTab & ">" & Estado(Sig) & "<"
Next
Erase Estado
PasandoPorVariables = Msj
End Function
Respuesta Responder a este mensaje
#8 KL
17/07/2005 - 12:31 | Informe spam
Hola chicos,

Se me ocurre otra idea. Si lo que se busca es solo saber si una variable se
ha inicializado o sea si hay al menos una celda no vacia en el rango
examinado, en vez de usar bucles se podria usar algo como:

1. Application.CountA(rng)
2. rng.Find "*"
3. rng.SpecialCells(xlCellTypeConstants ) y/o
rng.SpecialCells(xlCellTypeFormulas) y comprobando si es Nothing.

Saludos,
KL


"Héctor Miguel" wrote in message
news:
hola, chicos !

Desastres escribio en el mensaje ...
... saber si a una variable (no variant) estaba inicializada, con lo cual
me ahorraba algunas lineas [...]



segun lo comentado en este hilo [y segun lo entiendo]... si 'solo'
necesitas...
-> consultar el estado que guardan 3 procesos [Pedido, Factura pro forma y
Factura comercial] ->entre otros<-
-> que se encuentran en las columnas 6, 8 y 10 [F, H y J] ->entre otras<-
-> segun 'cierta' fila [p.e. la celda activa de la hoja 'apropiada'... que
es la que uso en los ejemplos] ->o varias<- -?-
y 'asumiendo' que NO 'te escaparias' de alguno que otro bucles for...next
:((
[que vienen a ser 'el corazon' de las propuestas siguientes]
-> una alternativa podria ser consultar si 'IsEmpty' [directamente] ->la/s
celda/s<-
o... 'pasar' el contenido de las celdas por variables ->de tipo
variant<- :(( [entre otras] :))
el [posible] 'ahorro' de lineas [probablemente] dependera de...
-> la forma, momento y veces en que vayas a necesitar 'hacer las
consultas' :D
[quizas habra una 'cierta' rapidez si utilizas lineas que llamen a
funciones 'ex-profeso'] -?-

en fin... analiza, modifica, [o lo que sea necesario] los ejemplos que
siguen ;)
si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.
=> ' una macro para llamar a las funciones '
Sub Mis_Variables()
MsgBox DirectoDeLasCeldas(ActiveCell.Row)
MsgBox PasandoPorVariables(ActiveCell.Row)
End Sub
' funcion 'en directo' '
Function DirectoDeLasCeldas(ByVal Fila As Long) As String
Dim Msj As String, Col As Byte, Proc As Byte, Proceso
Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr &
String(15, "=")
Proceso = Array("Pedido", "F. Prof", "F. Com")
For Col = 6 To 10 Step 2
Msj = Msj & vbCr & Proceso(Proc) & vbTab & _
IIf(IsEmpty(Cells(Fila, Col)), "NO", "SI") & vbTab & ">" &
Cells(Fila, Col) & "<"
Proc = Proc + 1
Next
DirectoDeLasCeldas = Msj
End Function
' funcion por variabes '
Function PasandoPorVariables(ByVal Fila As Long) As String
Dim Msj As String, Sig As Byte, Proceso, Estado(3)
Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr &
String(15, "=")
Proceso = Array("Pedido", "F. Prof", "F. Com")
Estado(0) = Range("f" & Fila)
Estado(1) = Range("h" & Fila)
Estado(2) = Range("j" & Fila)
For Sig = 0 To 2
Msj = Msj & vbCr & Proceso(Sig) & vbTab & _
IIf(IsEmpty(Estado(Sig)), "NO", "SI") & vbTab & ">" &
Estado(Sig) & "<"
Next
Erase Estado
PasandoPorVariables = Msj
End Function

Respuesta Responder a este mensaje
#9 Desastres
18/07/2005 - 16:50 | Informe spam
Hola Kl Gracias.

Aunque en este caso no la pueda utilizar,es buena cosa lo que propone. Aún "meto demasiadas veces las manos" en las
bases de datos y no siempre están, y otras veces no pueden estar, ordenadas más que por uno solo de los campos que te
indicaba, y ese campo es el que siempre está lleno.
Aún así es otra buena idea.

Saludos
Des


"KL" escribió en el mensaje news:
Hola chicos,

Se me ocurre otra idea. Si lo que se busca es solo saber si una variable se
ha inicializado o sea si hay al menos una celda no vacia en el rango
examinado, en vez de usar bucles se podria usar algo como:

1. Application.CountA(rng)
2. rng.Find "*"
3. rng.SpecialCells(xlCellTypeConstants ) y/o
rng.SpecialCells(xlCellTypeFormulas) y comprobando si es Nothing.

Saludos,
KL


"Héctor Miguel" wrote in message
news:
> hola, chicos !
>
>> Desastres escribio en el mensaje ...
>> ... saber si a una variable (no variant) estaba inicializada, con lo cual
>> me ahorraba algunas lineas [...]
>
> segun lo comentado en este hilo [y segun lo entiendo]... si 'solo'
> necesitas...
> -> consultar el estado que guardan 3 procesos [Pedido, Factura pro forma y
> Factura comercial] ->entre otros<-
> -> que se encuentran en las columnas 6, 8 y 10 [F, H y J] ->entre otras<-
> -> segun 'cierta' fila [p.e. la celda activa de la hoja 'apropiada'... que
> es la que uso en los ejemplos] ->o varias<- -?-
> y 'asumiendo' que NO 'te escaparias' de alguno que otro bucles for...next
> :((
> [que vienen a ser 'el corazon' de las propuestas siguientes]
> -> una alternativa podria ser consultar si 'IsEmpty' [directamente] ->la/s
> celda/s<-
> o... 'pasar' el contenido de las celdas por variables ->de tipo
> variant<- :(( [entre otras] :))
> el [posible] 'ahorro' de lineas [probablemente] dependera de...
> -> la forma, momento y veces en que vayas a necesitar 'hacer las
> consultas' :D
> [quizas habra una 'cierta' rapidez si utilizas lineas que llamen a
> funciones 'ex-profeso'] -?-
>
> en fin... analiza, modifica, [o lo que sea necesario] los ejemplos que
> siguen ;)
> si cualquier duda [o informacion adicional]... comentas?
> saludos,
> hector.
> => > ' una macro para llamar a las funciones '
> Sub Mis_Variables()
> MsgBox DirectoDeLasCeldas(ActiveCell.Row)
> MsgBox PasandoPorVariables(ActiveCell.Row)
> End Sub
> ' funcion 'en directo' '
> Function DirectoDeLasCeldas(ByVal Fila As Long) As String
> Dim Msj As String, Col As Byte, Proc As Byte, Proceso
> Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr &
> String(15, "=")
> Proceso = Array("Pedido", "F. Prof", "F. Com")
> For Col = 6 To 10 Step 2
> Msj = Msj & vbCr & Proceso(Proc) & vbTab & _
> IIf(IsEmpty(Cells(Fila, Col)), "NO", "SI") & vbTab & ">" &
> Cells(Fila, Col) & "<"
> Proc = Proc + 1
> Next
> DirectoDeLasCeldas = Msj
> End Function
> ' funcion por variabes '
> Function PasandoPorVariables(ByVal Fila As Long) As String
> Dim Msj As String, Sig As Byte, Proceso, Estado(3)
> Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr &
> String(15, "=")
> Proceso = Array("Pedido", "F. Prof", "F. Com")
> Estado(0) = Range("f" & Fila)
> Estado(1) = Range("h" & Fila)
> Estado(2) = Range("j" & Fila)
> For Sig = 0 To 2
> Msj = Msj & vbCr & Proceso(Sig) & vbTab & _
> IIf(IsEmpty(Estado(Sig)), "NO", "SI") & vbTab & ">" &
> Estado(Sig) & "<"
> Next
> Erase Estado
> PasandoPorVariables = Msj
> End Function
>


Respuesta Responder a este mensaje
#10 Desastres
18/07/2005 - 17:22 | Informe spam
Hola Hector.
Gracias.

Siento, en este caso no poder aplicar lo que me propones. Aún así lo guardo para cuando sepa hacerlo.

El p5roblema es entender lo que pasa y como obrendo los elementos de la matrid.
Estoy intentando ver algo sobre matrices, y no encontrando documentacion , no me salgo.

Estoy queriendo hacer algo que en castellano es muy sencillo pero no consigo hacerlo con matrices.
Lo he hecho por un preceso normal y funciona, pero queria aprender algo sobre matrices no encuentro la forma de utilizar
lo que he "metido" en la matriz.
Me explico
Estoy intentando reescribir lo que ya me funciona, y que comencé a hacer heces 4 años, sistematizando los nombres de las
variables. En lugar de WorkbookArticulos,wbArticulos, libroArticulos, lArticulos, lArt quiero uniformar y utilizar
lArt para libro, hArt para hoja, cArt para cabecera en Art, hasta aqui es cuestion de reparas macro a macro y cambiar.
l-libro, h-hoja,etc
Pero ademas queria hacerlo en algunos casos con matrices y es donde me pierdo.
Hoy concretamente pretendia algo asi como:
Option base =1
Dim GrupoAlbaranes()
GupoAlbaranes=array(Art,Cli,Ban,Est,Com,Fam)
y luego decir
Por cada elemento de la matriz
on error resume next
Set "l"&Art(((un elemento de la matriz))) = workbooks("l"& "elemento de la matrz" &".xls")
if error <>0 then set "l"&Art(((un elemento de la matriz))) = Workbooks.Open(PATH & workbooks("l"& "elemento de la
matrz" &".xls"))

Pero me sigue dando calabazas.
Seguiré estudiándolo un poco.

Saludos
Des



"Héctor Miguel" escribió en el mensaje news:
hola, chicos !

> Desastres escribio en el mensaje ...
> ... saber si a una variable (no variant) estaba inicializada, con lo cual me ahorraba algunas lineas [...]

segun lo comentado en este hilo [y segun lo entiendo]... si 'solo' necesitas...
-> consultar el estado que guardan 3 procesos [Pedido, Factura pro forma y Factura comercial] ->entre otros<-
-> que se encuentran en las columnas 6, 8 y 10 [F, H y J] ->entre otras<-
-> segun 'cierta' fila [p.e. la celda activa de la hoja 'apropiada'... que es la que uso en los ejemplos] ->o


varias<- -?-
y 'asumiendo' que NO 'te escaparias' de alguno que otro bucles for...next :((
[que vienen a ser 'el corazon' de las propuestas siguientes]
-> una alternativa podria ser consultar si 'IsEmpty' [directamente] ->la/s celda/s<-
o... 'pasar' el contenido de las celdas por variables ->de tipo variant<- :(( [entre otras] :))
el [posible] 'ahorro' de lineas [probablemente] dependera de...
-> la forma, momento y veces en que vayas a necesitar 'hacer las consultas' :D
[quizas habra una 'cierta' rapidez si utilizas lineas que llamen a funciones 'ex-profeso'] -?-

en fin... analiza, modifica, [o lo que sea necesario] los ejemplos que siguen ;)
si cualquier duda [o informacion adicional]... comentas?
saludos,
hector.
=> ' una macro para llamar a las funciones '
Sub Mis_Variables()
MsgBox DirectoDeLasCeldas(ActiveCell.Row)
MsgBox PasandoPorVariables(ActiveCell.Row)
End Sub
' funcion 'en directo' '
Function DirectoDeLasCeldas(ByVal Fila As Long) As String
Dim Msj As String, Col As Byte, Proc As Byte, Proceso
Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr & String(15, "=")
Proceso = Array("Pedido", "F. Prof", "F. Com")
For Col = 6 To 10 Step 2
Msj = Msj & vbCr & Proceso(Proc) & vbTab & _
IIf(IsEmpty(Cells(Fila, Col)), "NO", "SI") & vbTab & ">" & Cells(Fila, Col) & "<"
Proc = Proc + 1
Next
DirectoDeLasCeldas = Msj
End Function
' funcion por variabes '
Function PasandoPorVariables(ByVal Fila As Long) As String
Dim Msj As String, Sig As Byte, Proceso, Estado(3)
Msj = "Variable" & vbTab & "Inicializ." & vbTab & "Valor" & vbCr & String(15, "=")
Proceso = Array("Pedido", "F. Prof", "F. Com")
Estado(0) = Range("f" & Fila)
Estado(1) = Range("h" & Fila)
Estado(2) = Range("j" & Fila)
For Sig = 0 To 2
Msj = Msj & vbCr & Proceso(Sig) & vbTab & _
IIf(IsEmpty(Estado(Sig)), "NO", "SI") & vbTab & ">" & Estado(Sig) & "<"
Next
Erase Estado
PasandoPorVariables = Msj
End Function


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