Obligar que el nombre de un campo termine por una extensión

Necesito un código que antes de actualizar me mande un msgbox y me obligue a que el nombre de un campo termine por por una de los siguientes extensiones; por ejemplo "curso1.pdf", "Formacion.pptx", "Archivo.docx" "tabla.xlsx". Entiendo que será con Like ".pdf" &"*", pero no se como hacerlo

3 respuestas

Respuesta
2

Estas 2 funciones le sirven, cópielas en un módulo

Public Function busca_palabra(ByVal strPalabras As String, strCadena As Variant) As Boolean
' Función para buscar palabra de una frase
' Sintaxis:
'               busca_palabra(<<texto>>,[palabra a buscar])
' Ejemplo de llamada:
'                      busca_palabar("soy de honda","honda") ---> Retorna True
'                      busca_palabar("soy hondano","honda")  ---> Retorna False
' Elaborada por:
'
'   Eduardo Pérez Fernández
'   Fecha: 29/09/2022
Dim palabras As Variant
Dim contador As Integer
palabras = Split(strPalabras, ".")
For contador = LBound(palabras) To UBound(palabras)
    strPalabras = palabras(contador)
    If strPalabras = strCadena Then
       busca_palabra = True
       Exit For
    End If
Next contador
End Function
Public Function busca_cadena(strFrase As String, Optional intForma As Byte) As Boolean
' Función para buscar una cadena de texto en una frase
' Parámetros:
' strFrase ---> Cadena a buscar
 '          intFroma ---> 1= Palabra completa 2= Operador LIKE
' Si omite la forma se asigna por defecto 1(palabra completa)
' Requiere de la función:
 '                          busca_palabra()
' Ejemplos de llamada:
'
 '      busca_cadena("mi cali es lingo",1)  --> Retorna True
 '      busca_cadena("mi calisto es lingo",2)  --> Retorna True porque está cali
 '      busca_cadena("mi calisto es lingo",1)  --> Retorna False. Sin LIKE
'
' Elaborada por:
' Eduardo Pérez Fernández
 ' Fecha 29/09/2022
 Dim strColeccion As New Collection
 Dim mivar As Variant
 If intForma = 0 Then
   intForma = 1
 End If
'Aquí se colocan las extensiones permitidas
 'puede adicionar las que necesite
 strColeccion. Add "pdf"
StrColeccion. Add "doc"
StrColeccion. Add "docx"
StrColeccion. Add "xls"
StrColeccion. Add "xlsx"
StrColeccion. Add "ppt"
 For Each mivar In strColeccion
   If intForma = 1 Then ' palabra completa
     If busca_palabra(strFrase, mivar) Then
      busca_cadena = True
      Exit For
     End If
   Else
      If strFrase Like "*" & mivar & "*" Then
         MsgBox "No esta permitida la palabra " & vbCrLf & vbCrLf & mivar, vbInformation, "Le informo"
         busca_cadena = True
        Exit For
      End If
   End If
 Next
End Function

Ejemplo de llamada en la ventana de inmediato.

¿
?busca_cadena("documento.pptx", 1)
Falso

Retorna Falso porque la extensión pptx no está en la colección.

¿
?busca_cadena("documento.xlsx", 1)
Verdadero

Retorna verdadero porque la extensión xlsx está en la colección.

Un código que no tenga control de errores lógicamente puede ser más corto, pero se corren riesgos. Le dejo un ejemplo algo más sencillo y legible. Puede obviar la función si utiliza un cuadro combinado para tomar la extensión del archivo.

Esta imagen es para la forma 1, llamando una función sencilla. Observe que anoté como extensión DOCE lo cual no está en la lista de extensión de la función.

En esta imagen tomé la forma 2, utilizo un cuadro combinado con la lista de extensiones y lo condiciono a Limitar a la lista en SI. Como la extensión es correcta me indica como se llamará el archivo.

FUNCIÓN PARA VALIDAR LA EXTENSIÓN (solo aplica a la forma 1)

Public Function valida_extension(ByVal strTexto As String) As Boolean
'Función para buscar extensión en nombre pasado como argumento
'Elaboró:
' EDUARDO PÉREZ FERNÁNDEZ
 'Fecha: 13/12/2022
On Error GoTo hay_error
   Dim strExtension As String
   strExtension = Right(strTexto, Len(strTexto) - InStrRev(strTexto, "."))
   If InStrRev("txt,doc,docx,xls,xlsx,mdb,ppt", strExtension) > 0 Then
      valida_extension = True
    Else
      valida_extension = False
   End If
hay_error_Exit:
    On Error Resume Next
    Exit Function
hay_error:
    MsgBox "Ocurrió el siguiente error." & vbCrLf & vbCrLf & _
            "Error Número: " & Err.Number & vbCrLf & _
            "Origen del error: valida_extension" & vbCrLf & _
            "Descripción: " & Err.Description, _
            vbCritical, "Ocurrió un error!"
    Resume hay_error_Exit
End Function

Si quiere el ejemplo lo puede solicitar a [email protected] 

Respuesta
1

¿El nombre de un campo de una tabla?

Si te refieres al valor que hay en un cuadro de texto, puedes ver que he escrito Archivo y el cursor aún está en el cuadro de texto Texto0

Al pulsar Enter

En este caso en particular el código del evento Antes de actualizar del cuadro de texto Texto0 es

Private Sub Texto0_BeforeUpdate(Cancel As Integer)
If Texto0.Text <> "*.*" Then
MsgBox "Nenico, te falta la extensión", vbOKOnly, "Señor, dame paciencia"
Cancel = True
End If
End Sub

Corrijo, olvida lo anterior

Respuesta
1

Primero habrá que verificar si tiene extensión (que acostumbra a estar separada por un punto), de tenerla se verifica si esta entre las permitidas y a partir de ese punto: en función del resultado se decide la solución.

La función InStr devuelve la posición de una cadena de texto contenida en otra cadena de texto y un cero si no la localiza, para hacer la búsqueda comenzando por el final se utiliza InStrRev.

Tenemos un nombre a verificar:

Texto= "Archivo.xls"

Tenemos una cadena con los admitidos (el guion es indispensable para evitar falsos positivos): 

Validos = "txt-doc-docx-xls-xlsx-mdb-ppt-"

Se utilizaran un par de variables temporalmente:
X_Posicion (numérica para obtener la terminación)
X_Terminacion (texto, para poder compararla con las admitidas)

Obtenemos la posición:

Posicion = InStrrev(Texto, ".")

Si encuentra el punto decimal, obtenemos la terminacion y le añadimos el marcador:

IF Posicion <> 0 Then Terminacion = Mid(Texto,posicion +1) & "-"

Tras ello solo queda verificar si es admitida y de no serlo ... lo delatamos (esto es una demo):

IF instr(Validos,Terminacion) = 0 Then MsgBox "No aceptada"

Verificado en la ventana de inmediato (y en una sola línea):

Texto= "Archivo.xl" : Validos ="txt-doc-docx-xls-xlsx-mdb-ppt-":Posicion= InStrrev(texto,"."):If Posicion <> 0 Then Terminacion = Mid(Texto,posicion +1) & "-":IF instr(Validos,Terminacion)= 0 then debug.print "No aceptada"

Nota:

El guion (puede ser otra marca) se utiliza para evitar falsos positivos si la terminación fuera 'XLS' admitiría X o XL como validas, el guion fuerza una comparación sencilla y correcta (aunque mejorable).

Para aquellos que prefieren lo sencillo, dos versiones en formato función y que ocupan poco espacio:

Public Function Verifica_Tipo(X_Texto) As String
Dim X_Validos$, X_Posicion&
Verifica_Tipo = "Extension incorrecta"
X_Posicion = InStrRev(X_Texto, ".")
If X_Posicion = 0 Then Exit Function
X_Validos = "txt-doc-docx-xls-xlsx-mdb-ppt-"
If InStr(X_Validos, Mid(X_Texto, X_Posicion + 1) & "-") <> 0 Then Verifica_Tipo = "Extension aceptada"
End Function
'Sin variables (menor consumo de recursos)
Public Function Verifica2_Tipo(X_Texto) As String
Verifica2_Tipo = "Extension incorrecta"
If InStrRev(X_Texto, ".") = 0 Then Exit Function
If InStr("-txt-doc-docx-xls-xlsx-mdb-ppt-", "-" & Mid(X_Texto, InStrRev(X_Texto, ".") + 1) & "-") <> 0 Then Verifica2_Tipo = "Extension aceptada"
End Function
'Sin variables y retorna un booleano (True/False) normalmente mas útil que un mensaje
Public Function Verifica3_Tipo(X_Texto) As Boolean
If InStrRev(X_Texto, ".") = 0 Then Exit Function
If InStr("-txt-doc-docx-xls-xlsx-mdb-ppt-", "-" & Mid(X_Texto, InStrRev(X_Texto, ".") + 1) & "-") <> 0 Then Verifica3_Tipo = -1
End Function

Como todas las funciones:
El nombre de la función y como argumento un/el texto o el objeto con el dato a verificar

Separadas que el editor hace lo que le place

Public Function Verifica_Tipo(X_Texto) As String
Dim X_Validos$, X_Posicion&
Verifica_Tipo = "Extension incorrecta"
X_Posicion = InStrRev(X_Texto, ".")
If X_Posicion = 0 Then Exit Function
X_Validos = "txt-doc-docx-xls-xlsx-mdb-ppt-"
If InStr(X_Validos, Mid(X_Texto, X_Posicion + 1) & "-") <> 0 Then Verifica_Tipo = "Extension aceptada"
End Function
'Sin variables (menor consumo de recursos)
Public Function Verifica2_Tipo(X_Texto) As String
Verifica2_Tipo = "Extension incorrecta"
If InStrRev(X_Texto, ".") = 0 Then Exit Function
If InStr("-txt-doc-docx-xls-xlsx-mdb-ppt-", "-" & Mid(X_Texto, InStrRev(X_Texto, ".") + 1) & "-") <> 0 Then Verifica2_Tipo = "Extension aceptada"
End Function
'Sin variables y retorna un booleano (True/False) normalmente mas útil que un mensaje
Public Function Verifica3_Tipo(X_Texto) As Boolean
If InStrRev(X_Texto, ".") = 0 Then Exit Function
If InStr("-txt-doc-docx-xls-xlsx-mdb-ppt-", "-" & Mid(X_Texto, InStrRev(X_Texto, ".") + 1) & "-") <> 0 Then Verifica3_Tipo = -1
End Function

Eduardo:

Para poder dar una opinión creíble tendrías que demostrar que con el código expuesto (el segundo y tercero) se pueden introducir datos que no estén en la lista de admitidos.

Aprovecha para (una vez más) aprender algo sobre Access.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas