Вы находитесь на странице: 1из 6

Funciones utiles de VBA en ACCESS

'*********************************************************************
**************
'* esta funcin se utiliza para emular el anidamiento de ifs simplificandolo mucho
'* es primordial resetear en la primera expresin, si no no funcionar
'* permite enviar mensajes cuando no se cumpla un conjunto de condiciones
'* uso: SeCumple x1 >= MIN, ,True
'* SeCumple x2 <= MAX
'* SeCumple x1 < x2
'* if SeCumple then ... si se cumplen todas las condiciones anteriores entonces...
'* ESH 10/10/01 13:00
'*********************************************************************
**************
Public Function SeCumple(Optional vntExpresion As Variant, Optional vntAvisa As
Variant = "", Optional vntResetea As Variant = False) As Boolean
Static bolResultado As Boolean
If vntResetea Then
bolResultado = True
End If ' vntResetea
If Not CBool(vntExpresion) And Len(vntAvisa) Then
MsgBox "ATENCION: " & vntAvisa, vbInformation
End If
' CBool(Expression) And Len(vntAvisa)
bolResultado = CBool(vntExpresion) And bolResultado
SeCumple = bolResultado
End Function
' SeCumple
'*********************************************************************
**********
'* TamaoTabla
'* Calcula el tamao de la tabla pasada como parmetro
'* Argumentos: strTabla => Nombre de la tabla
'* uso: TamaoTabla "Pedidos"
'* ESH 26/02/06 09:49
'*********************************************************************
**********
Public Function TamaoTabla(strTabla As String) As Long
Dim Campo As Object, _
rst As DAO.Recordset, _
strSQL As String, _
Matriz() As Variant, _
i As Long, _
lngCuenta As Long, _
lngTamao As Long
On Error GoTo TamaoTabla_TratamientoErrores
strSQL = "SELECT * FROM " & strTabla
Set rst = CurrentDb.OpenRecordset(strSQL, dbopendynaset)
rst.MoveLast

lngCuenta = rst.RecordCount
For Each Campo In rst.Fields
ReDim Preserve Matriz(2, i)
Matriz(0, i) = Campo.Name
Matriz(1, i) = Campo.Type
' segn el tipo de campo calculo el tamao ocupado como el producto
' del nmero de registros por su correspondiente tamao en bits
Select Case Campo.Type
Case dbBoolean
' 1 bit
Matriz(2, i) = lngCuenta * 1
Case dbByte
' 1 byte
Matriz(2, i) = lngCuenta * 8
Case dbCurrency, dbDate, dbDouble ' 8 bytes
Matriz(2, i) = lngCuenta * 64
Case dbSingle, dbLong
' 4 bytes
Matriz(2, i) = lngCuenta * 32
Case dbInteger
' 2 bytes
Matriz(2, i) = lngCuenta * 16
End Select
i=i+1
Next Campo
For i = 0 To UBound(Matriz, 2)
' acumulo el tamao de todos los campos, para el caso de los
' campos texto y memo, recorro registro por registro y acumulo
' su longitud multiplicada por 8 para convertirla a bits
If Matriz(1, i) = dbText Or Matriz(1, i) = dbMemo Then
rst.MoveFirst
Do While Not rst.EOF
lngTamao = lngTamao + Nz(Len(rst(Matriz(o, i))), 0) * 8
rst.MoveNext
Loop
Else
lngTamao = lngTamao + Matriz(2, i)
End If
Next i
' devuelvo el tamao convertido a bytes
TamaoTabla = lngTamao / 8
If Not rst Is Nothing Then
rst.Close
Set rst = Nothing
End If
TamaoTabla_Salir:
On Error GoTo 0
Exit Function
TamaoTabla_TratamientoErrores:

MsgBox "Error " & Err.Number & " en proc.: TamaoTabla de Documento VBA: Form_
frmTamao (" & Err.Description & ")"
Resume TamaoTabla_Salir
End Function

' TamaoTabla

'*********************************************************************
**********
'* RenombraControles
'* Renombra los controles del formulario indicado siguiendo la notacin Hungara
'* Argumentos: strObjeto => nombre del objeto (formulario o informe) cuyos
'*
controles vamos a renombrar
'* uso: RenombraControles frmClientes
'* ESH 10/11/05 13:19
'* ESH 27/03/06 18:10 modificado para editar las etiquetas
'*********************************************************************
**********
Public Sub RenombraControles(strObjeto As String)
Dim ctlControl As Control, _
strNombrePadre As String, _
strPrefijo As String, _
i As Long, _
intTipo As Integer, _
Objeto As Object
On Error GoTo RenombraControles_TratamientoErrores
' averiguo que tipo de objeto voy a renombrar
intTipo = Nz(DLookup("Type", "MSysObjects", "Name='" & strObjeto & "'"), 0)
If intTipo = -32768 Then
' formulario
' abro el objeto en modo diseo y oculto
DoCmd.OpenForm strObjeto, acDesign, , , , acHidden
Set Objeto = Forms(strObjeto)
ElseIf intTipo = -32764 Then
' informe
' abro el objeto en modo diseo y oculto
DoCmd.OpenReport strObjeto, acDesign, , , , acHidden
Set Objeto = Reports(strObjeto)
Else
MsgBox "El objeto " & strObjeto & " no es un formulario o informe de la base de dato
s", vbOKOnly + vbCritical, "Error"
Exit Sub
End If
For Each ctlControl In Objeto.Controls
' obtengo el prefijo para el tipo de control
Select Case ctlControl.ControlType
'
Case acBoundObjectFrame

Case acCheckBox
strPrefijo = "chk"
Case acComboBox
strPrefijo = "cbo"
Case acCommandButton
strPrefijo = "cmd"
'
Case acCustomControl
Case acImage
strPrefijo = "img"
Case acLabel
strPrefijo = "lbl"
' en el caso de las etiquetas elimino los dos puntos finales
ctlControl.Caption = Replace(ctlControl.Caption, ":", "")
For i = 2 To Len(ctlControl.Caption)
' "troceo" la etiqueta en las distintas palabras que contiene
' una mayscula precedida de una minscula
If Asc(Mid(ctlControl.Caption, i, 1)) >= 65 And Asc(Mid(ctlControl.Caption, i,
1)) <= 90 _
And Asc(Mid(ctlControl.Caption, i - 1, 1)) >= 97 And Asc(Mid(ctlControl.Ca
ption, i - 1, 1)) <= 122 Then
ctlControl.Caption = Left(ctlControl.Caption, i - 1) & " " & Mid(ctlControl.C
aption, i)
End If
Next i
Case acLine
strPrefijo = "lin"
Case acListBox
strPrefijo = "lst"
'
Case acObjectFrame
Case acOptionButton
strPrefijo = "opt"
Case acOptionGroup
strPrefijo = "grp"
'
Case acPage
'
Case acPageBreak
'
Case acRectangle
Case acSubform
strPrefijo = "sub"
Case acTabCtl
strPrefijo = "tab"
Case acTextBox
strPrefijo = "txt"
'
Case acToggleButton
End Select
' obtengo el nombre del control padre sin tildes
If ctlControl.Parent.Name <> strObjeto Then
strNombrePadre = SinTildes(ctlControl.Parent.Name)
Else
strNombrePadre = ctlControl.Name
End If
' si el nombre del padre ya incluye prefijo, lo quito
Select Case LCase(Left(strNombrePadre, 3))

Case "chk", "cbo", "cmd", "img,", "lbl", "lin", "opt", "grp", "sub", "tab", "txt"
strNombrePadre = Mid(strNombrePadre, 4)
End Select
' si todava no era "correcto" el nombre del control lo modifico
If Left(ctlControl.Name, 3) <> strPrefijo & strNombrePadre Then
ctlControl.Name = strPrefijo & strNombrePadre
End If
Next
RenombraControles_Salir:
On Error Resume Next
' cierro el objeto guardando los cambios
If intTipo = -32768 Then
DoCmd.Close acForm, strObjeto, acSaveYes
ElseIf intTipo = -32764 Then
DoCmd.Close acReport, strObjeto, acSaveYes
End If
Set Objeto = Nothing
On Error GoTo 0
Exit Sub
RenombraControles_TratamientoErrores:
MsgBox "Error " & Err.Number & " en proc.: RenombraControles de Mdulo: mdlUtilid
ades (" & Err.Description & ")"
Resume RenombraControles_Salir
End Sub

' RenombraControles

'*********************************************************************
**********
'* SinTildes
'* Devuelve sin tildes (acentos, dieresis) la palabra pasada como parmetro
'* Argumentos: strTexto => cadena de texto a convertir
'* uso: SinTildes strTexto
'* ESH 10/11/05 18:22
'*********************************************************************
**********
Function SinTildes(strTexto As String) As String
strTexto = Replace(strTexto, "", "a")
strTexto = Replace(strTexto, "", "e")
strTexto = Replace(strTexto, "", "i")
strTexto = Replace(strTexto, "", "o")
strTexto = Replace(strTexto, "", "u")
strTexto = Replace(strTexto, "", "u")
SinTildes = strTexto
End Function
' SinTildes

Вам также может понравиться