Está en la página 1de 22

CURSO DE VB

CAPTULO 81

ndice de contenido
TRABAJEMOS CON FECHAS, FORMATOS Y CONVERSIONES DE DATOS............................3
COGER LA FECHA DEL SISTEMA (Date)..................................................................................3
APLICAR FORMATOS A LA FECHA..........................................................................................3
Formato Short Date.................................................................................................................3
Formato Long Date..................................................................................................................4
Formato personalizado ...............................................................................................................4
APLICAR FORMATOS A LA HORA (Time)................................................................................5
Obtener la hora del sistema.........................................................................................................5
Manipular la hora........................................................................................................................5
FECHA Y HORA A LA VEZ (Now)...............................................................................................6
FORMATO A CADENAS DE CARACTERES..............................................................................6
Valores a maysculas (UCase)....................................................................................................6
Propiedad InputMask..................................................................................................................6
Valores a minsculas (LCase).....................................................................................................7
La funcin StrConv.....................................................................................................................7
Inicio de palabras en maysculas (vbProperCase)......................................................................8
Eliminacin de espacios en blanco (Trim, LTrim, RTrim)..........................................................8
CONVERSIONES DE DATOS.......................................................................................................9
Funciones conversoras................................................................................................................9
Deteccin tipo de dato.................................................................................................................9
Unos cuantos ejemplos prcticos sobre funciones conversoras y tipos de datos........................9
Supuesto 1: aprendemos las funciones LEFT y RIGHT........................................................9
Supuesto 2: aprendemos la funcin MID.............................................................................10
Supuesto 3: aprendemos la funcin INSTR y la funcin LEN............................................11
Supuesto 4: aprendemos la funcin REPLACE...................................................................13
Supuesto 5: practicamos con IsNumeric()............................................................................14
SEGUIMOS MANIPULANDO FECHAS....................................................................................14
Analizar el da de una fecha: funcin Weekday().....................................................................14
Obtener los elementos de una fecha: funciones Day(), Month(), Year()...................................16
Ver el nombre del mes de una fecha: funcin MonthName()...................................................16
La funcin DatePart()................................................................................................................17
La funcin DateDiff()...............................................................................................................18
Sumar das a una fecha..............................................................................................................18
Pequeo ejercicio prctico........................................................................................................19
1

La BD donde estn los ejemplos de este captulo os la podis bajar aqu.

Vistame en http://siliconproject.com.ar/neckkito/

UN EJEMPLO FICTICIO... REAL COMO LA VIDA MISMA...................................................19


PARA ACABAR.................................................................................................................................22

Vistame en http://siliconproject.com.ar/neckkito/

TRABAJEMOS CON FECHAS, FORMATOS


Y CONVERSIONES DE DATOS
Una de las mayores dificultades de trabajar con fechas es,
precisamente, el formato regional, y las diferentes
versiones de Access (que si versin espaola, que si versin
inglesa, que si no-se-sabe-bien-qu-versin-porque-lo
mezcla-todo...)
Vamos a ver en este captulo cmo podemos transformar formatos
de fechas, lo cual puede sacarnos de un apuro en ms de una
ocasin.
Para desarrollar este captulo vamos a crearnos una BD en blanco. Creamos asimismo un
formulario en blanco, al que llamaremos FFechas. En ese formulario aadimos un cuadro de
texto, al que llamaremos txtFResultado (hagmoslo bien largo, pues lo vamos a necesitar).

COGER LA FECHA DEL SISTEMA (Date)


Para calentar motores vamos a realizar un proceso simple: vamos a coger la fecha del sistema.
Para ello tenemos la palabrita mgica Date.
As pues, para probarlo, en FFechas aadimos un botn de comando y le generamos el
siguiente cdigo:

Private Sub cmdFechaStma_Click()


Me.txtFResultado.Value = Date
End Sub

Como vemos, esto est chupao. Prosigamos.

APLICAR FORMATOS A LA FECHA


Vamos a ver que podemos dar diversos formatos a la fecha. En el fondo la mecnica es la
misma para todos los casos, pero yo desarrollar un cdigo para cada formato, por si queris ir
practicando.

Formato Short Date


El formato short date es el que nos da el da/mes/ao, y vendra a ser el formato por defecto
que nos coge Access. Es interesante saber que existe por si tenemos una fecha un poco
compleja y la queremos convertir rpidamente a una fecha corta.
Si tuviramos que programar un botn en nuestra BD de ejemplo, lo podramos programar as:

Private Sub cmdShortDate_Click()


Dim vFecha As Date
vFecha = Date
vFecha = Format(vFecha, "Short Date")
Me.txtFResultado.Value = vFecha
3

Vistame en http://siliconproject.com.ar/neckkito/

End Sub

Formato Long Date


El formato Long Date es el formato de fecha larga. El
cdigo para programar un botn sera idntico al caso
anterior, slo que indicndole Long Date por Short Date.
Lo nico que debemos tener en cuenta es que el resultado
no es un tipo Date, sino que es un tipo String. Es decir:

Private Sub cmdLongDate_Click()


Dim vFecha As String
vFecha = Date
vFecha = Format(vFecha, "Long Date")
Me.txtFResultado.Value = vFecha
End Sub

Formato personalizado
Podemos convertir el formato de fecha de un tipo de fecha espaol a un ingls, o viceversa.
Las abreviaturas que utilizaremos para cada uno de los elementos de la fecha sern:
d
m
y

para da
para mes
para ao

Vamos a convertir nuestra fecha espaola a una fecha inglesa. No podemos asignar el
resultado al textbox directamente como dato tipo Date porque Access detecta que nuestra
configuracin es espaola y lo muestra en formato espaol. Para poder ver el efecto debemos
tratar la fecha como si fuera un String, y el cdigo que deberamos utilizar es:

Private Sub cmdFechaInglesa_Click()


Dim vFecha As String
vFecha = Date
vFecha = Format(vFecha, "mm/dd/yy")
Me.txtFResultado.Value = vFecha
End Sub

Ni que decir tiene que si queremos el formato en sistema espaol la expresin sera:
vFecha = Format(vFecha, "dd/mm/yy")

Nota: es importante recordar este punto porque, en ocasiones, buscamos filtrar una fecha

en una tabla y, a pesar de que constatamos que la fecha buscada existe, nuestro filtro no nos
muestra ningn registro. En este caso deberemos probar el filtro por fecha dndole el formato
ingls, por si Access entendiera que, aunque vemos las fechas en espaol, el dato est
guardado en formato ingls (un lo, ya s, pero pasa).

Vistame en http://siliconproject.com.ar/neckkito/

APLICAR FORMATOS A LA HORA (Time)


De la misma manera que hemos visto el manejo de la fecha podemos obtener la hora. Vamos
a ver cmo

Obtener la hora del sistema


Para obtener la hora tenemos la palabra TIME. As, pues,
podramos programar un botn de la siguiente manera:

Private Sub cmdHoraStma_Click()


Me.txtFResultado.Value = Time
End Sub

Manipular la hora
Los componentes de la hora son:
hh
mm
ss

para la hora
para los minutos
para los segundos

La separacin entre estos parmetros es el carcter dos puntos (:)


Es decir, que escribiramos:
Format (Time, hh:mm:ss)
El resultado sera el mismo que hemos conseguido en el punto anterior. Es decir, que
podramos programar un botn de la siguiente manera:

Private Sub cmdHoraFormato_Click()


Dim vHora As Date
vHora = Time
vHora = Format(vHora, "hh:mm:ss")
Me.txtFResultado.Value = vHora
End Sub

Como otra posibilidad podramos indicar la hora en formato 12 horas. La expresin que
deberamos utilizar sera:
Format (Time, hh:mm:ss AMPM)
Es decir:

Private Sub cmdHora12_Click()


Dim vHora As Date
vHora = Time
vHora = Format(vHora, "hh:mm:ss AMPM")
Me.txtFResultado.Value = vHora
End Sub
5

Vistame en http://siliconproject.com.ar/neckkito/

FECHA Y HORA A LA VEZ (Now)


Si por casualidad necesitamos obtener la fecha y la hora a
la vez tenemos la palabra NOW, que nos da estos datos.
Por ejemplo, podramos obtener la fecha y la hora, y
presentarlas en nuestro TextBox, a travs del siguiente
cdigo:

Private Sub cmdFechaNow_Click()


Dim vFecha As Date, vHora As Date
vFecha = Now
vHora = Now
vFecha = Format(vFecha, "dd/mm/yy")
vHora = Format(vHora, "hh:mm:ss")
Me.txtFResultado.Value = vFecha & "-" & vHora
End Sub

FORMATO A CADENAS DE CARACTERES


Pensemos en el caso en que hay varios usuarios trabajando en nuestra BD, y cada uno da de
alta registros escribiendo los datos como le viene bien (por decirlo de alguna manera). Y eso,
a la hora de ver consultas o informes, queda un poco feo por la heterogeneidad de los datos.
Una primera solucin a lo anterior sera aplicar mscaras de entrada cuando confeccionamos la
tabla. Pero, como siempre pasa, en ese campo X en concreto se nos pas. Vamos a ver cmo
podemos enmendar un poco el asunto.
Para ello, vamos a insertar un cuadro de texto, que llamaremos txtCadena, y todos los cdigos
que aprendamos en este apartado sern asignados al evento Despus de actualizar (yo har
los supuestos sobre diferentes TextBox, en un nuevo formulario llamado FCaracteres).

Valores a maysculas (UCase)


Para conseguir que el texto introducido se convierta en maysculas debemos utilizar la funcin
UCASE
Veamos cmo podra ser un cdigo:

Private Sub txtCadena1_AfterUpdate()


Dim vText As String
vText = Me.txtCadena1.Value
vText = UCase(vText)
Me.txtCadena1.Value = vText
End Sub

Propiedad InputMask
Tenemos un segundo sistema, que es a travs de la funcin INPUTMASK. En realidad, lo que
6

Vistame en http://siliconproject.com.ar/neckkito/

hace esta funcin es aplicar una mscara 2 al TextBox. Slo explicar el ejemplo aplicado a
conseguir la conversin de minsculas a maysculas y no en los siguientes, dado que la
mecnica es siempre la misma (slo tenemos que definir la mscara que queramos).
El cdigo que nos podra hacer eso sera, por ejemplo:

Private Sub txtCadena2_AfterUpdate()


Me.txtCadena2.InputMask = ">????????????????????"
End Sub

Valores a minsculas (LCase)


La funcin que consigue pasar todos los caracteres a minsculas es LCASE.
Un ejemplo, en cdigo, sera:

Private Sub txtCadena3_AfterUpdate()


Dim vText As String
vText = Me.txtCadena3.Value
vText = LCase(vText)
Me.txtCadena3.Value = vText
End Sub

La funcin StrConv
Los dos ejemplos anteriores hubiramos podido aplicarlos a travs de la funcin StrConv. Esta
funcin consta de dos elementos:
Cadena a convertir / Tipo de conversin
Hay diversos tipos de conversin, que no se explicarn aqu (podis abrir, en VBE, buscar
StrConv en la ayuda). El tipo de conversin viene determinado por una constante de VB. De
esta manera, tendramos que:
vbUpperCase nos convertira la cadena a maysculas.
vbLowerCase nos convertra la cadena a minsculas.
La aplicacin de esta funcin, si seguimos nuestro ejemplo, sobre la variable vText sera:
vText = StrConv(vText, vbUpperCase)
o
vText = StrConv(vText, vbLowerCase)
Hay una constante interesante que explicamos en el siguiente apartado.

Os remito a la ayuda de Access sobre el tema de mscaras de entrada. Tambin podis consultar el anexo al
captulo 2 del Manual de Access, en el apartado correspondiente a mscaras de entrada.

Vistame en http://siliconproject.com.ar/neckkito/

Inicio de palabras en maysculas (vbProperCase)


Supongamos que tenemos un formulario donde se dan de alta los datos de un cliente, o de un
alumno. El usuario
que introduce los datos, para darse prisa, nos escribe lo
siguiente:
neckkito neckk ito
Es decir, nombre y apellidos en minsculas. Si despus
tenemos que enviar una carta a este cliente / alumno, o
remitirle un mail personalizado, la verdad es que eso queda
un poco feo.
Cmo podemos protegernos de lo anterior? Pues a travs de la constante vbPROPERCASE
Como habris intuido, lo que hace vbProperCase es poner en maysculas la primera letra de
cada palabra individual.
El cdigo para conseguir eso sera el siguiente:

Private Sub txtCadena4_AfterUpdate()


Dim vText As String
vText = Me.txtCadena4.Value
vText = StrConv(vText, vbProperCase)
Me.txtCadena4.Value = vText
End Sub

Eliminacin de espacios en blanco (Trim, LTrim, RTrim)


Puede ocurrir que nuestro querido usuario, en su afn de ser eficiente, escriba los valores
aadiendo espacios inadvertidamente antes del valor, o al final. Esos espacios, adems de
molestos visualmente, desvirtan el contenido del control.
Para solventar esta dificultad podemos utilizar la funcin TRIM. Esta funcin elimina estos
espacios en blanco.
El cdigo sera:

Private Sub txtCadena5_AfterUpdate()


Dim vText As String
vText = Me.txtCadena5.Value
vText = Trim(vText)
Me.txtCadena5.Value = vText
End Sub

Comentar tambin que si slo queremos quitar los espacios iniciales (los de la izquierda),
podemos utilizar la funcin LTRIM; si queremos quitar los espacios finales (los de la derecha),
podemos utilizar la funcin RTRIM.

Vistame en http://siliconproject.com.ar/neckkito/

CONVERSIONES DE DATOS

Funciones conversoras
En ocasiones tenemos un tipo de dato y necesitamos
cambiarlo de tipo. Para ello existen funciones que realizan
ese trabajo. Vamos a ver las que considero ms
interesantes:

Para
Para
Para
Para
Para
Para

pasar un dato a texto utilizamos CStr()


pasar un dato a fecha utilizamos CDate()
pasar un dato a booleano utilizamos CBool()
pasar un dato a variant utilizamos CVar()
pasar un dato a moneda utilizamos CCur()
pasar un dato a nmero utilizamos:
Si es un integer: CInt()
Si es un long: CLng()
Si es un double: Cdbl()

Deteccin tipo de dato


Aprovechemos este espacio para explicar que podemos actuar sobre un valor en funcin del
tipo de variable que sea. Y, para ello, podemos utilizar las siguientes funciones:
Para saber si un dato es numrico utilizamos IsNumeric()
Para saber si un dato es fecha utilizamos IsDate()
Para saber si un dato es una matriz utilizamos IsArray()
Si buscamos, en la ayuda de Access, funciones de inspeccin, encontraremos todas las
funciones disponibles dentro de esta categora.

Unos cuantos ejemplos prcticos sobre funciones conversoras y tipos


de datos
Vamos a desarrollar una serie de supuestos prcticos sobre lo que acabamos de explicar, para
ver qu utilidad le podemos dar. Aprovecharemos tambin para explicar algunas funciones que
nos sern tiles para nuestras programaciones.
En la BD de ejemplo podris encontrar estos supuestos en el formulario que he llamado
FConversion. Los resultados se mostrarn en un TextBox que llamaremos txtResultado.
Finalmente, los supuestos estn desarrollados paso a paso. Hay pasos que se pueden
simplificar o resumir, pero en aras a la pedagoga el ejemplo se desarrolla a lo largo.

Supuesto 1: aprendemos las funciones LEFT y RIGHT


Imaginemos que obtenemos, por una parte, un valor numrico de dos dgitos, y, por otra
parte, otro valor numrico de cuatro dgitos. Queremos convertir todo lo anterior a una fecha.
Para simplificar en el ejemplo los valores numricos que hemos comentado los definiremos en
el propio cdigo, pero ya deberamos saber que los podemos obtener del valor de un control, o

Vistame en http://siliconproject.com.ar/neckkito/

a travs de un InputBox.
Cmo lo hacemos?
Vamos a ver cmo sera el cdigo:

Private Sub cmdNum2Fecha_Click()


Dim grupo1 As Integer, grupo2 As Integer
Dim grupo3 As String, grupo4 As String
Dim vFinal As String
grupo1 = 24
grupo2 = 1012
'Convertimos el primer grupo a texto
grupo1 = CStr(grupo1)
'Convertimos el segundo grupo a texto
grupo2 = CStr(grupo2)
'Extraemos, del grupo2, los dos nmeros de la izquierda, y los asignamos a la variable
grupo3
grupo3 = Left(grupo2, 2)
'Extraemos, del grupo2, los dos nmeros de la derecha, y los asignamos a la variable
grupo4
grupo4 = Right(grupo2, 2)
'Componemos lo que sera la fecha
vFinal = grupo1 & "/" & grupo3 & "/" & grupo4
'Convertimos nuestra fecha (que es de tipo String) a tipo fecha
vFinal = CDate(vFinal)
'Mostramos el resultado
Me.txtResultado.Value = vFinal
End Sub

Como vemos, si queremos extraer caracteres de una cadena de caracteres, empezando por la
izquierda utilizamos la funcin Left. Su estructura es
Left(cadena, n de caracteres a extraer)
De la misma manera, si queremos extraer caracteres empezando por la derecha utilizamos la
funcin Right, con la misma estructura:
Right(cadena, n de caracteres a extraer)

Supuesto 2: aprendemos la funcin MID


Imaginemos que tenemos un campo de texto que nos recoge una informacin bajada de
Internet, o importada de un Excel. La estructura del valor en ese campo es siempre la misma,
y nos interesa capturar un valor numrico que est dentro de cada uno de los registros 3.
Por ejemplo, un registro sera: Expediente 1563: secuestro de Neckkito
Analicemos esa cadena de texto.
.- Vemos que desde la primera palabra hasta el nmero 1 (contando espacios) hay 12
caracteres.
.- Vemos que el valor numrico que queremos capturar consta de 4 caracteres.
3

En captulos posteriores veremos cmo recorrer registros de una tabla o consulta a travs de un recordset.
Paciencia!

10

Vistame en http://siliconproject.com.ar/neckkito/

Pues para extraer esos cuatro nmeros de la cadena, para convertirlos posteriormente a tipo
nmero, podemos utilizar la funcin Mid()
La estructura de dicha funcin es:
Mid(cadena de texto, posicin inicial de extraccin, n
caracteres a extraer)
Con todo lo anterior nuestro cdigo quedara de la siguiente
manera (para simplificar el texto lo tratar como constante,
pero ya sabemos que podemos obtenerlo de diversas
fuentes):

Private Sub cmdText2Num_Click()


Const vText As String = "Expediente 1563: secuestro de Neckkito"
Dim vNum As String
vNum = Mid(vText, 12, 4)
vNum = CInt(vNum)
Me.txtResultado.Value = vNum
End Sub

Para complementar lo anterior os propongo un ejercicio. Imaginaos que tenemos un registro


con el siguiente valor en un campo: Fecha: 24/01/12 Hora llegada: 14:25:00. Lo que
deberamos hacer es:
Conseguir extraer la fecha, como Date, y mostrarla en un TextBox
Conseguir extraer la hora de llegada, como Date, y mostrarla en un TextBox
Conseguir extraer slo fecha y hora de llegada, separadas por un guin, como texto, y
mostrar el resultado en un TextBox
Os animo a que lo pensis e intentis programarlo. De todas maneras, en la BD de ejemplo, en
el formulario FEjercicios, tenis un botn con el cdigo asignado, por si queris chequearlo.

Supuesto 3: aprendemos la funcin INSTR y la funcin LEN


Empezando por la segunda funcin, la funcin Len() nos da la longitud de la cadena de
caracteres. Es decir, que nos devuelve un tipo Long. Para ser ms claros, nos cuenta cuntos
caracteres tiene el texto o nmero que estamos analizando.
Su estructura es
Len(texto)
Respecto de la primera funcin, en ocasiones necesitamos comparar cadenas de caracteres. La
funcin InStr() nos permite comparar, precisamente, cadenas de caracteres, y nos muestra la
posicin donde se encuentra la primera coincidencia.
Su estructura es:
InStr(posicin de inicio, expresin que contiene la cadena a buscar, cadena a buscar, mtodo
de comparacin)
El primer argumento (posicin de inicio) es opcional, y si se omite se empieza por el principio
de la cadena; el ltimo argumento (mtodo de comparacin) tambin lo es. Para ver los
11

Vistame en http://siliconproject.com.ar/neckkito/

diferentes tipos de mtodos de comparacin os remito a la ayuda de Access.


Pues bien... todo lo anterior es muy bonito a nivel de terico pero... alguien se ha enterado
de algo?
Imaginemos que nuestra BD gestiona los artculos de un
almacn, los cuales tienen todos un cdigo de artculo.
Como somos muy ordenados el cdigo de artculo tiene la
siguiente estructura:
Cdigo numrico de artculo, con un mnimo de 4 dgitos y
un mximo de 6
Cdigo de dos letras correspondiente al proveedor
Cdigo de dos letras correspondiente a una referencia interna
Cdigo alfanumrico de cuatro caracteres mnimo y 6 mximo que corresponde a su
ubicacin dentro del almacn

Es decir, que, por ejemplo, un artculo tiene este cdigo: 3410ZNDE5A6J, y podemos tener
otro artculo con el siguiente cdigo 874532SNSP3R6H8K.
Entonces se acerca nuestro jefe con una sonrisa en la boca y nos dice: tendramos que
actualizar la informacin en la base de datos. Los 5.000 artculos y poco que tenemos con
referencia interna SP han cambiado, y ahora su referencia debera ser ST. Los cambiars para
maana? Por cierto, no podemos pagarte las horas extras...
Primer problema: no podemos utilizar la funcin Left() porque el cdigo del artculo es
variable: de 4 a 6 caracteres.
Segundo problema: no podemos utilizar la funcin Right() porque el cdigo de ubicacin es
variable: de 4 a 6 caracteres
Tercer problema: si no podemos utilizar Left() ni Right(), cmo utilizamos Mid()?
Un sudor fro recorre nuestro cuerpo... Ser verdad que tendremos que quedarnos toda la
noche cambiando cdigos... o no?
Vamos a hacer el razonamiento en trminos humanos, para despus aplicarlo a cdigo, a ver
cmo podemos solventar nuestro problema.
.- Sabemos que el nmero de caracteres mnimo de cdigo de artculo es 4. Luego la posicin 5
ser nuestro inicio de bsqueda (el primer argumento de InsStr())
.- Sabemos que la cadena que debemos buscar es SP
.- Sabemos que InStr() nos dar la posicin donde se encuentra la cadena
.- Con Len() sabemos la longitud total del cdigo entero del artculo
.- Con todo lo anterior sabemos:
.- a) Cuntos caracteres hay antes de SP
.- b) Cuntos caracteres hay despus de SP
Es decir, que si el cdigo del artculo es 3410ZNSP5A6J tenemos que:
.- InStr() nos dir que la posicin es la 7 Luego hay 6 caracteres antes de SP
.- Len() nos dir que la longitud de la cadena es 12.
.- Si la posicin anterior a SP es la 6, y sabemos que SP son 2 caracteres, eso nos sita en la
posicin 8. Entonces 12 8 = 4 Hay 4 caracteres de ubicacin de almacn.
Ya tenemos pues los elementos necesarios para destruir nuestro cdigo y volverlo a construir.

12

Vistame en http://siliconproject.com.ar/neckkito/

El cdigo que podramos aplicar sera, entonces:

Private Sub cmdFuncInStrg_Click()


Const codAntiguo As String = "3410ZNSP5A6J"
' Const codAntiguo As String = "874532SNSP3R6H8K"
Const refNueva As String = "ST"
Dim longCodigo As Integer, posicionSP As Integer
Dim antesSP As String, despuesSP As String
Dim codNuevo As String
'Cogemos la longitud del cdigo
longCodigo = Len(codAntiguo)
'Cogemos la posicin de "SP"
posicionSP = InStr(4, codAntiguo, "SP")
'Cogemos la cadena anterior a "SP"
antesSP = Left(codAntiguo, posicionSP - 1)
'Cogemos la cadena posterior a "SP"
despuesSP = Right(codAntiguo, longCodigo - (posicionSP - 1) - 2)
'Construimos el nuevo cdigo
codNuevo = antesSP & "ST" & despuesSP
'Mostramos el resultado
Me.txtResultado.Value = codNuevo
End Sub

Veris que, al inicio del cdigo, os he dejado una constante como comentario, por si queris
probar el cdigo con un segundo artculo con diferentes dgitos. Para probarlo slo tenis que
convertir en comentario la primera constante codAntiguo y eliminar el comentario de la
segunda (codAntiguo).
Por suerte para nosotros, el cdigo de proveedor no coincide nunca con el cdigo interno!!!
El cdigo VB anterior puede parecer complicado, y lo he puesto, primero, para poder
entender el funcionamiento de la funcin InStr(), y, segundo, para ver que con la combinacin
de las funciones Len(), Left(), Right() -y, si lo necesitamos, Mid() e InStr()- se pueden
conseguir muchsimas cosas sobre una cadena de texto. En tercer lugar lo he puesto tambin
para exprimir un poco esas preciosas neuronas que nos caracterizan... je, je...
Podramos haber utilizado otra funcin para conseguir el mismo efecto, y que vemos en el
supuesto siguiente:

Supuesto 4: aprendemos la funcin REPLACE


La funcin Replace() nos permite reemplazar una cadena de un texto por otra. Su estructura
es la siguiente:
Replace(texto a analizar, subcadena que se busca, subcadena por la que se reemplazar,
posicin del inicio de bsqueda, nmero de reemplazos a realizar, clase de comparacin).
Los tres ltimos argumentos son opcionales. Si no se indica nada los valores que cogen son:
<posicin inicio de bsqueda> = 1 (es decir, desde el principio)
<nmero de reemplazos a realizar> = -1 (es decir, todos los posibles)
<clase de comparacin> Os remito a la ayuda de la funcin para ms informacin
sobre este argumento.
Es decir, que nuestro sper-cdigo del apartado anterior nos podra haber quedado as:
13

Vistame en http://siliconproject.com.ar/neckkito/


Private Sub cmdReplace_Click()
Const codAntiguo As String = "3410ZNSP5A6J"
Me.txtResultado.Value = Replace(codAntiguo, "SP", "ST")
End Sub

Je, je...

Supuesto 5: practicamos con IsNumeric()


Vamos finalmente a practicar con la funcin IsNumeric(). El resto de funciones de inspeccin
que hemos comentado en un epgrafe anterior tienen un funcionamiento prcticamente
idntico, por lo que podemos decir que, vista una, vistas todas.
Vamos a imaginar que queremos realizar una operacin tan simple como pedir un valor a un
usuario y multiplicarlo por 5. Para pedir el valor al usuario utilizamos un InputBox. Lo que
queremos es asegurarnos de que el valor que introduce el usuario es, precisamente, numrico,
y no escribe, por ejemplo, una cadena de texto (lo cual, evidentemente, nos causar un error
de cdigo).
El cdigo que podramos escribir sera el siguiente:

Private Sub cmdIsNumeric_Click()


Dim vNum As Variant
vNum = InputBox("Introduzca un nmero para ser multiplicado por 5", "MULTIPLICO x5")
'Comprobamos que el valor introducido es numrico y mostramos el resultado.
If IsNumeric(vNum) Then
Me.txtResultado.Value = vNum * 5
Else
'Si no ha introducido un valor numrico avisamos y salimos
MsgBox "El valor que ha introducido no es vlido", vbCritical, "NO CORRECTO"
End If
End Sub

SEGUIMOS MANIPULANDO FECHAS


Todava podemos realizar algunas operaciones ms con las fechas o, mejor dicho, con aspectos
relacionados con las fechas.
Los ejemplos de este apartado los encontraris en el formulario FFechas2 de la BD de ejemplo.

Analizar el da de una fecha: funcin Weekday()


Para analizar el nombre del da de una fecha podemos recurrir a la funcin Weekday. Dicha
funcin nos devuelve el nmero del da de la semana de la fecha que estamos analizando. Su
estructura es:
Weekday(fecha a analizar, primer da de la semana)
El argumento <primer da de la semana> es opcional, y por defecto es el valor 1-Domingo. Si

14

Vistame en http://siliconproject.com.ar/neckkito/

queremos que el primer da de la semana sea el lunes deberamos especificar un 2.


Podemos obviar este argumento si nos auxiliamos con unas constantes de VB. Dichas
constantes son:
vbMonday
vbTuesday
vbWednesday
vbThursday
vbFriday
vbSaturday
vbSunday
Si sabemos un poco de ingls veremos que no hace falta explicar qu significan cada una de
las anteriores constantes de VB.
Veamos pues cmo podra ser el cdigo para saber el nombre del da de una fecha:

Private Sub cmdNomDia_Click()


Dim vFecha As Variant
vFecha = InputBox("Introduzca una fecha -Formato dd/mm/aa-", "FECHA")
If Not IsDate(vFecha) Then Exit Sub
vFecha = CDate(vFecha)
'Analizamos la fecha introducida
Select Case Weekday(vFecha)
Case vbMonday
Me.txtFResultado.Value = "Lunes"
Case vbTuesday
Me.txtFResultado.Value = "Martes"
Case vbWednesday
Me.txtFResultado.Value = "Mircoles"
Case vbThursday
Me.txtFResultado.Value = "Jueves"
Case vbFriday
Me.txtFResultado.Value = "Viernes"
Case vbSaturday
Me.txtFResultado.Value = "Sbado"
Case vbSunday
Me.txtFResultado.Value = "Domingo"
End Select
End Sub

Simplemente haceros notar que para controlar la introduccin del valor por parte del usuario, y
que realmente introduzca una fecha, hemos aadido la lnea:
If Not IsDate(vFecha) Then Exit Sub
Otra manera de aplicar la funcin anterior, por ejemplo, sera para realizar una accin en
funcin del da que se seleccione. Por ejemplo, supongamos que nos proponen un da para ir a
realizar un trabajo. Lo introducimos en nuestra BD para podernos planificar y... vaya! El
cdigo sera el siguiente:

Private Sub cmdDiaDomingo_Click()


Dim vDia As Date
15

Vistame en http://siliconproject.com.ar/neckkito/

'El da seleccionado es domingo


vDia = "29/01/12"
'Analizamos el da

If Weekday(vDia) = vbSunday Then


MsgBox "El da propuesto es domingo. No trabajamos
en domingo!", vbExclamation, "NO HBIL"
Else
MsgBox "A trabajar!", vbExclamation, "HBIL"
End If
End Sub

Obtener los elementos de una fecha: funciones Day(), Month(), Year()


Podemos extraer los distintos elementos de una fecha a travs de las funciones:

Day()
Month()
Year()

Extrae el nmero de da
Extrae el nmero de mes
Extrae el nmero de ao

Lo anterior nos permite una manipulacin prcticamente completa sobre la fecha introducida.
Vamos a ver un cdigo que nos desglosa una fecha y nos indica qu es cada elemento.

Private Sub cmdDesgloseFecha_Click()


Dim vDia As String, vMes As String, vAno As String
Dim vFecha As Variant
vFecha = InputBox("Introduzca una fecha -formato dd/mm/aa-", "FECHA")
If Not IsDate(vFecha) Then Exit Sub
vDia = Day(vFecha)
vMes = Month(vFecha)
vAno = Year(vFecha)
Me.txtFResultado.Value = "Da: " & vDia & " - Mes: " & vMes & " - Ao: " & vAno
End Sub

Ver el nombre del mes de una fecha: funcin MonthName()


Podemos obtener el mes de una fecha a travs de la funcin MonthName(). Su estructura es la
siguiente:
MonthName(nmero de mes, abreviatura)
El argumento <nmero de mes> est claro, verdad?
Podemos conseguir el nombre de mes entero o podemos mostrar el nombre de mes abreviado.
Eso lo conseguimos a travs del argumento <abreviatura>. Si no indicamos nada es como si
ese argumento tomara el valor FALSE, lo cual nos devuelve el nombre entero; si podemos
TRUE obtendremos el nombre del mes abreviado.
Por ejemplo, un cdigo podra ser el siguiente:

Private Sub cmdMesFecha_Click()


16

Vistame en http://siliconproject.com.ar/neckkito/

Dim vFecha As Variant


Dim nomMes As String
vFecha = InputBox("Introduzca una fecha -Formato dd/mm/aa-", "FECHA")
If Not IsDate(vFecha) Then Exit Sub
nomMes = MonthName(Month(vFecha))
Me.txtFResultado.Value = nomMes
End Sub

La funcin DatePart()
Para complementar las anteriores explicaciones echaremos un vistazo a la funcin de este
epgrafe y a la del siguiente. As tendremos, creo yo, una visin bastante amplia de todo lo que
se intentaba explicar en este captulo.
La funcin DatePart() nos permite obtener una serie de informaciones sobre elementos
relacionados con la fecha. Para ser ms claros, por ejemplo, nos indica el nmero de trimestre,
el nmero de semana del ao, adems de permitirnos obtener, con otro sistema, datos que
acabamos de explicar en apartados anteriores.
La estructura de esta funcin es:
DatePart(elemento a obtener, fecha, primer da de la semana, primera semana del ao).
Los dos ltimos argumentos son opcionales, y os remito a la ayuda de VB para ver su utilidad.
El primer argumento, <elemento a obtener>, lo deberemos definir a travs de un valor. Esos
valores son los siguientes:
yyyy
q
m
y
d
w
ww
h
n
s

Para
Para
Para
Para
Para
Para
Para
Para
Para
Para

obtener
obtener
obtener
obtener
obtener
obtener
obtener
obtener
obtener
obtener

el ao
el trimestre
el mes
el da del ao
el da
el da de la semana
el nmero de semana del ao
la hora
los minutos
los segundos.

Si quisiramos obtener a qu trimestre corresponde 01/03/12, el cdigo que programaramos


sera:

Private Sub cmdObtTrimestre_Click()


Const miFecha As Date = "01/03/12"
Dim vTrim As Integer
vTrim = DatePart("q", miFecha)
Me.txtFResultado.Value = vTrim
End Sub

Como podemos ver, la utilizacin de esta funcin es muy sencilla. No olvidemos que la
podemos utilizar tambin, por ejemplo, para filtrar datos, cuando utilicemos un recordset.

17

Vistame en http://siliconproject.com.ar/neckkito/

La funcin DateDiff()
Si queremos calcular un periodo que hay entre dos fechas tenemos la funcin DateDiff(). Su
estructura es:
DateDiff(elemento a obtener, fechaInferior, fechaSuperior,
primer da de la semana, primera semana del ao).
Los dos ltimos argumentos son opcionales, y os remito a
la ayuda de VB para ver su utilidad.
El primer argumento, <elemento a obtener>, corresponde al
mismo conjunto de elementos que explicbamos en el epgrafe
anterior, y a l os remito.
Por ejemplo, si queremos calcular el nmero de semanas que hay entre una fecha introducida
por el usuario y la fecha actual utilizaramos el siguiente cdigo:

Private Sub cmdDateDiff_Click()


Dim vFecha As Date
Dim vSem As Long
vFecha = InputBox("Introduzca una fecha -formato dd/mm/aa-" _
& " inferior a la fecha actual", "FECHA")
If Not IsDate(vFecha) Then Exit Sub
vSem = DateDiff("ww", vFecha, Date)
Me.txtFResultado.Value = vSem
End Sub

Sumar das a una fecha


Aunque parezca una obviedad, sumar das a una fecha es tan simple como realizar una
operacin matemtica de adicin, donde el primer sumando sera la propia fecha y el segundo
sumando sera el nmero de das a aadir (o al revs). Es decir,
vFechaFin = vFechaIni + vDias
Un simple cdigo, para que quede ms claro, sera:

Private Sub cmdSumaDias_Click()


Dim vFechaIni As Variant
Dim vFechaFin As Variant
vFechaIni = InputBox("Introduzca una fecha -Formato dd/mm/aa-", "FECHA")
If Not IsDate(vFechaIni) Then Exit Sub
vFechaIni = CDate(vFechaIni)
vFechaFin = vFechaIni + 5
Me.txtFResultado.Value = vFechaFin
End Sub

18

Vistame en http://siliconproject.com.ar/neckkito/

Pequeo ejercicio prctico


Os propongo un ejercicio: solicitamos al usuario que
introduzca una fecha del mes de julio, y sumamos 40 das a
esa fecha, teniendo en cuenta que no debemos incluir el
mes de agosto en los clculos (y no es lcito utilizar
directamente el nmero de das de agosto, sino que hay
que detectar que el mes es agosto).
Es decir, que si se introduce el 1 de julio nos debera devolver el 10
de septiembre.
Debis tener en cuenta lo siguiente (con alguna pista incluida):

Debemos comprobar que el usuario introduzca un valor que sea una fecha
Debemos comprobar que el mes introducido corresponda a julio
Debemos saltarnos todos los das de agosto. Esto es un bucle, y os recuerdo que en
un captulo anterior vimos estructuras de bucle.
Debemos acordarnos de convertir los valores de las diferentes variables para evitar
errores de cdigo.

En el formulario FEjercicios encontraris dos botones con cdigos con la solucin. Ambos
cdigos son muy similares, pero la mecnica del bucle es distinta.
Suerte!

UN EJEMPLO FICTICIO... REAL COMO LA VIDA MISMA


Vamos a desarrollar un ejemplo que est basado en una consulta que recib de un usuario y,
dado que maneja fechas y cadenas de caracteres, nos servir para recordar y refrescar
conceptos que se han visto durante esta leccin.
Este ejemplo lo encontraris desarrollado en el formulario FEjemploFicticio de la BD de
ejemplo.
El supuesto original se desarrollaba sobre un campo existente en una tabla, a travs de un
formulario. Para simplificar estableceremos la entrada de datos en un cuadro de texto, y la
salida de datos en otro cuadro de texto. Al primero le llamar txtFNotificacion, y al segundo
txtFVto.
Enunciado:
En Espaa (no s en otros pases), cuando Hacienda enva una notificacin, te da un plazo
mximo para responder a la notificacin. Los periodos son los siguientes:

Notificacin recibida entre el 1 y el 15 del mes: vencimiento el da 20 del mes siguiente.


Notificacin recibida entre el 16 y el ltimo da del mes: vencimiento el da 5 del mes
posterior al mes siguiente.

La idea es que, al dar de alta una fecha de notificacin en txtFNotificacion, automticamente


se nos rellene el control txtFVto con la fecha de vencimiento correspondiente.

19

Vistame en http://siliconproject.com.ar/neckkito/

Anlisis del supuesto y casos posibles:


Un anlisis inicial nos muestra lo siguiente:
Si el da de la notificacin es entre el 1 y 15:
El da de vencimiento es el 20
El mes de vencimiento es +1 respecto del mes de
notificacin.
Si el da de la notificacin es entre el 16 y el ltimo da
del mes:
El da de vencimiento es el 5
El mes de vencimiento es +2 respecto del mes de
notificacin.
Hasta aqu todo correcto. Sin embargo, hemos analizado slo dos de los tres elementos de la
fecha (da y mes), pero nos hemos dejado el tercer elemento: el ao.
Sigamos nuestro anlisis:
Si el periodo mximo de ms es +2 respecto de la fecha de notificacin, y el ao tiene 12
meses, podemos entender que 12 2 = 10. Ello implica que, al menos hasta octubre, el ao
de notificacin ser coincidente con el ao de vencimiento.
Qu pasa en noviembre? El propio enunciado nos determina que:
Si la notificacin es recibida dentro de los primeros quince das del mes el
comportamiento es el mismo que para el caso general que plantebamos al principio.
Si la notificacin es recibida dentro de los segundos quince das del mes hay dos
elementos que son afectados: el mes y el ao.
Respecto del mes no podemos aplicar la frmula general, dado que si a 11 le aadimos +2 nos
da el mes 13, que evidentemente no existe. Ello nos obliga a establecer un valor fijo para el
mes, que ser el 1
Respecto del ao nos sita en el ao posterior. Es decir, debemos adicionarle una unidad al
ao.
Qu pasa en diciembre? Que tambin nos afecta a dos elementos: mes y ao.
Respecto del ao, en cualquier caso se deber aadir una unidad al ao de la notificacin.
Respecto del mes, no podemos aplicar la frmula general de adicionar +1 +2 al mes, puesto
que nos dara los meses 13 y 14, que no existen. Luego nos obliga a establecer valores fijos
para el mes, que sern 1 2, dependiendo de la quincena en que recibamos la notificacin.
Con todos estos elementos y anlisis en mente ya podemos programar un cdigo que nos
automatice el proceso.
Programacin del cdigo
El cdigo lo vamos a programar en el evento Despus de actualizar del control
txtFNotificacion, y, para ahondar ms en la cuestin, vamos a aadir elementos de control para
asegurarnos que el usuario no se equivoca en la introduccin del valor (evidentemente, que
no se equivoca en cuestin de formatos). El cdigo sera el siguiente (est completamente
comentado, por lo que entiendo que no deberais tener problemas en asimilarlo).

Private Sub txtFNotificacion_AfterUpdate()


'Declaramos las variables
Dim vFNot As String, vFVto As String
Dim vDia As String, vMes As String, vAno As String
'Cogemos el valor introducido

20

Vistame en http://siliconproject.com.ar/neckkito/

vFNot = Nz(Me.txtFNotificacion.Value, "")


'CONTROL -> Si no hay valor en el textbox salimos del proceso
If vFNot = "" Then Exit Sub
'CONTROL -> Verificamos que se haya introducido una fecha
If Not IsDate(vFNot) Then Exit Sub
'Convertimos el string vFNot en Date
vFNot = CDate(vFNot)
'Obtenemos el da, el mes y el ao de la notificacion
vDia = Day(vFNot)
vMes = Month(vFNot)
vAno = Year(vFNot)
'Como el elemento que nos determina si aplicamos la frmula
general
'es el mes, analizamos el mes de la fecha. Lo estudiamos a travs del
'bloque SELECT CASE
Select Case vMes
'El mes va de enero a octubre. Fijaos que no tocamos el ao
Case Is <= 10
'Ahora podemos analizar el da
If vDia <= 15 Then
'Aprovechamos la misma variable vDia para fijar el da de vencimiento
vDia = 20
'Le aadimos una unidad al mes (y aprovechamos la misma variable)
vMes = vMes + 1
Else
'En caso contrario es que se ha recibido en la segunda quincena
vDia = 5
vMes = vMes + 2
End If
'El mes es noviembre
Case Is = 11
'Analizamos el da
'Primera quincena
If vDia <= 15 Then
'Como en el caso anterior, aplicamos la formulacin general
vDia = 20
vMes = vMes + 1
Else
'Segunda quincena. Ya no podemos aplicar la formulacin general. Debemos
'fijar el mes y adicionar una unidad al ao
vDia = 5
vMes = 1
vAno = vAno + 1
End If
'El mes es diciembre
Case Is = 12
'Analizamos el da
'Primera quincena
If vDia <= 15 Then
vDia = 20
'Debemos fijar el mes
vMes = 1
'Adicionamos un ao
vAno = vAno + 1
Else
'Segunda quincena. Seguimos la operativa

21

Vistame en http://siliconproject.com.ar/neckkito/

vDia = 5
vMes = 2
vAno = vAno + 1
End If
End Select

'Creamos la fecha de vencimiento como un String


vFVto = vDia & "/" & vMes & "/" & vAno
'Convertimos la fecha de vencimiento a Date
vFVto = CDate(vFVto)
'Mostramos su valor en el textbox
Me.txtFVto.Value = vFVto
End Sub

Fcil, no? ;)

PARA ACABAR...
Creo que, tras el estudio de este captulo, ya podremos decir que somos unos profesionales
en el manejo de fechas y de cadenas de caracteres... je, je...
Como siempre, espero que alguna cosa de las aqu explicadas os pueda ser til para vuestras
aplicaciones (ntese que ya no hablo de BD's... ;)
Suerte!

22

Vistame en http://siliconproject.com.ar/neckkito/