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 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]
- 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 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
- 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