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
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 FunctionEjemplo de llamada en la ventana de inmediato.
¿?busca_cadena("documento.pptx", 1)
FalsoRetorna Falso porque la extensión pptx no está en la colección.
¿?busca_cadena("documento.xlsx", 1)
VerdaderoRetorna 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 FunctionSi quiere el ejemplo lo puede solicitar a [email protected]
- Compartir respuesta
¿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
- Compartir respuesta
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 FunctionComo 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
- Compartir respuesta
No discuta y aprenda otras alternativas personalmente las suyas están aceptables solo falta la captura errores. Entonces aprendamos. - Eduardo Pérez Fernández
Pues captura un error para demostrar que no es correcta y publícalo, seguro que tiene solución, y siempre será más compacta y efectiva que el absurdo que has publicado en un intento desesperado de hacerte presente y al final solo 'haces bulto'. - Enrique Feijóo
Es seguir los buenos hábitos de programación, pero se me olvidaba usted no es programador. - Eduardo Pérez Fernández
En todos los grupos hay individuos que solo sirven para hacer el payaso (y casi siempre lo hacen muy bien), los foros no son una excepción.. ¿Qué no se programar? careces de la formación indispensable para poder enjuiciar, solo logras aplausos de los 'estómagos agradecidos' (pero esos se conforman con muy poco) .Continuas en la senda que no lleva a ninguna parte si eso te hace feliz ... tu mismo. - Enrique Feijóo
Si quiere le dicto un curso avanzado de VBA y le adiciono el de PostgreSQL, usted es un proyecto de programador, lamento que no haya aprovechado sus pocos años en Access, demuestra en sus respuestas la falta de conocimiento. - Eduardo Pérez Fernández
Sigues en el camino a ninguna parte, es curioso ver como gritas y te desesperas porque no me conoces de nada y si supieran los que te envían algo para que quieres sus direcciones ... en fin. ... Por cierto el potgreSQL no consigues vendérselo a nadie, no existes en sus foros y solo aparece en el foro con tus fantasmas . - Enrique Feijóo
Demuestra su ignorancia gracias a TodoExpertos y mis videos tengo alumnos que están aprendiendo Access VS PostgreSQL, algunos con nivel alto en Access. Aprecio bastante Access pero con este solo no podemos hacer algunas consultas avanzadas y menos manipular datos en la nube desde Access. Le repito usted está en la mitad del camino del conocimiento avanzado de Access y por su arrogancia no mira más allá. Quédese en solo Access y la tecnología lo va a atropellar - Eduardo Pérez Fernández