Mensajes recientes

Páginas: 1 ... 3 4 [5] 6 7 ... 10
41
FSO / Saber si un fichero existe
« Último mensaje por xavi en Abril 21, 2020, 04:05:29 pm »
Palabras clave: FSO, averiguar, saber, archivo, fichero
Autor: Xavi
Extraído de: Centro de desarrollo de Office


Objetivo
Averiguar si un fichero existe mediante FSO. Es la alternativa a Dir(strFileName, vbArchive) que puede dar errores cuando strFileName = ""

Código: [Seleccionar]
Public Function ExistsFile(strFileName As String) As Boolean
    Dim fso As Object
   
    Set fso = CreateObject("Scripting.FileSystemObject")
   
    On Error Resume Next
    If fso.FileExists(strFileName) = False Then
        ExistsFile = False
    Else
        ExistsFile = True
    End If
   
    If Err <> 0 Then
        ExistsFile = False
    End If
   
    Set fso = Nothing
       
End Function

42
Tablas / Revinculación de tablas (indolora)
« Último mensaje por xavi en Abril 21, 2020, 03:25:47 pm »
Palabras clave: vinculación, tablas
Autor: KALKALIN
Extraído de: MVP-ACCESS.com

Cita de: KALKALIN preguntó
Necesito poder revincular las tablas de una base de datos externa.

Y el mismo se respondió con algo parecido a esto (que yo he estandarizado a mi conveniencia)

Copiar en un módulo independiente. Antes de llamar, asignar los valores a la estructura uLinkTable

Código: [Seleccionar]
Option Compare Database
Option Explicit

Public Type udtLinkTable
    RemoteDatabase      As String
    RemoteTableName     As String
    LocalTableName      As String
End Type
Public uLinkTable       As udtLinkTable

Public Sub CrearTablaVinculada()
    Dim dbsActual       As DAO.Database
    Dim tdfTableLink    As DAO.TableDef
 
    Dim rstRemoto   As DAO.Recordset    ' para las pruebas (en producción borrar y eliminar las últimas líneas)
   
   'Ubicacion de la base de datos remota se toma de uLinkTable.RemoteDatabase
   'Ubicacion de la base de datos local se toma de CurrentProject.FullName

   ' Abre la base de datos a la que se le va a agregar la tabla vinculada.
   Set dbsActual = OpenDatabase(CurrentProject.FullName)
 
   ' Crea una tabla vinculada que se conecta a una base de datos Access
   ' uLinkTable.LocalTableName será el nombre de la nueva tabla vinculada (en la base local)
   Set tdfTableLink = dbsActual.CreateTableDef(uLinkTable.LocalTableName)

   'creamos la conexion
   tdfTableLink.Connect = ";DATABASE=" & uLinkTable.RemoteDatabase & ";"

   'Aqui uLinkTable.LocalTableName es el nombre de la tabla de origen (si no existe da error)
   tdfTableLink.SourceTableName = uLinkTable.RemoteTableName
   dbsActual.TableDefs.Append tdfTableLink
 
   Set rstRemoto = dbsActual.OpenRecordset(uLinkTable.LocalTableName)
 
   'muestro la cantidad de registros de la tabla vinculada (Algo sencillo para ver si todo ha salido bien)
   rstRemoto.MoveLast
   MsgBox rstRemoto.RecordCount
 
   rstRemoto.Close
 
End Sub


La ventaja de este método es que no "levanta" la ventana de objetos de la base de datos (interesante opción en clientes quisquillosos)
43
Consejos, técnicas, artículos / Asignación de funciones a eventos
« Último mensaje por xavi en Abril 20, 2020, 12:29:38 am »
Palabras clave: Funciones, procedimientos
Autor: Xavi
Extraído de: Experiencia propia

A menudo tenemos la tentación de asignar las funciones directamente a partir de la hoja de propiedades del control. Eso que parece una buena opción en aras de ahorrar líneas de código puede volverse en nuestra contra si, por el motivo que sea, la función que llamamos ha cambiado de nombre o, simplemente, desaparecido.

Cuando ello ocurre nos encontramos un un error no controlado en el momento de abrir el formulario que puede llevarnos un buen rato de trazar.

Para evitar encontrarnos en ese escenario mi consejo es NO utilizar la ventana de propiedades para asignar las funciones. En su lugar es más adecuado utilizar el procedimiento Form_Open o Form_Load (yo prefiero el Load) para realizar la asignación:

Código: [Seleccionar]
Me!UnControl.AfterUpdate = "=UnaFuncion()"
Recordar que la función puede estar en el mismo módulo o en un módulo independiente siempre que la función esté declarada como Public.

Si la paranoia anti-errores es similar a la mía, también es una buena práctica "desasignar" a la salida del formulario (evento Unload).

Código: [Seleccionar]
Me!UnControl.AfterUpdate = ""
Ver Vista presentación. Pros y contras para entender mi paranoia.



44
Consejos, técnicas, artículos / Vista presentación. Pros y contras
« Último mensaje por xavi en Abril 20, 2020, 12:28:44 am »
Palabras clave: Vistas, presentación
Autor: Xavi
Extraído de: Experiencia propia

Desde la versión 2010 (creo) tenemos disponible la vista presentación para formularios en informes. Es una vista que nos muestra datos pero que al mismo tiempo, nos permite cambiar las propiedades de los controles. Es sumamente práctico a la hora de dimensionar los controles, sobretodo en los informes.

En mi caso concreto, la utilización de la vista presentación en los formularios me resulta inoportuna por mi forma de trabajar. Yo parto de un formulario "base" al que le asigno en el Load una serie de propiedades.

Mi formulario tiene una etiqueta vacía esperando el título, una imagen de fondo pequeña en el encabezado y los botones de comando del menú superior desordenados. Además algunos formularios no tienen bordes (los simulo con unas lineas) .

El relleno del título y su dimensionado así como el tamaño de la imagen de fondo y la posición de los botones (y las líneas laterales si procede) se asignan en los eventos Load y Resize.

En el caso de cambiar de vista diseño a vista formulario y volver, mis controles "vacíos" y "desordenados" no se alteran.
En cambio, si alterno de vista diseño a vista presentación, al volver a la vista diseño, mis controles "vacíos" ya quedan rellenos y se han ordenado. Ya me he creado un procedimiento para "restaurar" formularios.

Por ese motivo es por el que desactivo en todos los formularios la vista presentación.

Añado: lo mejor es quitar la opción directamente sobre la base de datos. Archivo/Opciones/Base de datos actual. Desmarcar Habilitar la vista Presentación
Para deshabilitar esa vista por código:

Application.SetOption "DesignWithData", False
45
Excel / Esconder ventana Excel tras UserForm
« Último mensaje por xavi en Abril 01, 2020, 04:35:11 pm »
Palabras clave: Excel, UserForm, ventana, esconder, ocultar
Autor: Xavi
Extraído de: Experiencia propia

Por exigencia de un cliente, la ventana de Excel no habría de visualizarse dejando únicamente el UserForm. Un truco para ello es ajustar la ventana al tamaño del UserForm (bueno, un poquito menos) y controlar el movimiento del formulario para mover la ventana detrás

Al abrir el Libro de Excel, forzar el estado de la ventana de Excel a normal. Evento Workbook_Open, por ejemplo.

Código: [Seleccionar]
ActiveWindow.WindowState = xlNormal
Después, en cada UserForm, para el evento Layout, redimensionamos la ventana

Código: [Seleccionar]
Private Sub UserForm_Layout()
    With ActiveWindow
        .Top = Me.Top + 5
        .Left = Me.Left + 10
        .Height = Me.Height - 30
        .Width = Me.Width - 30
    End With
End Sub

46
Consultas / Re:MULTISELECT
« Último mensaje por xavi en Abril 01, 2020, 04:09:33 pm »
Hola,

Las dudas en www.mvp-access.com

Gracias
47
Base de datos / Re:¿Cómo ocultar la ventana de Access y el botón cerrar ventana?
« Último mensaje por xavi en Abril 01, 2020, 04:09:17 pm »
Hola,

Las dudas en www.mvp-access.com

Gracias
48
API / InputBox extendido
« Último mensaje por xavi en Marzo 30, 2020, 11:21:55 pm »
Palabras clave: inputbox, extendido, inputboxex, limitar, caracteres, API
Autor: Happy / Abril 2004
Extraído de: Access y VBA

Objetivo:
Rescato este módulo de Happy de abril de 2004 (suministrado por javier.mil ya que yo no lo encontraba) para añadir funcionalidad a un InputBox. El propio módulo incluye los comentarios del autor.

En un módulo independiente:
Código: [Seleccionar]
Option Compare Database
Option Explicit

'******************************************************
'
' InputBoxEx
'
' Función que amplía el InputBox de VBA, confiriéndole
' diferentes estilos (contenidos en la enumeración
' StyleInputBox). También, en su último argumento (MaxChar)
' podemos limitar el número de caracteres que se podrán
' introducir.
'
' Uso:
'
'   Function InputBoxEx( _
'            Prompt, _      véase en la ayuda InputBox
'            [Title], _             "       "
'            [Default], _           "       "
'            [XPos], _              "       "
'            [YPos], _              "       "
'            [HelpFile], _          "       "
'            [Context] _            "       "
'            [Style] _ ------> cualquiera de los valores de la enumeración StyleInputBox
'            [MaxChar])------> si su valor es diferente de 0 marca el límite de
'                              caracteres admitidos por el InputBox
'
' Ejemplo: (muestra un InputBox para introducir contraseñas, con el límite de
'           10 caracteres)
'
'  Contraseña = InputBoxEx("Mensaje", "Titulo", , , , , , SPassword, 10)'
' Autor: Juan M. Afan de Ribera
'        Abril 2004
'
' Saludos :-)
' happy
'*********************************************************************

' estilos del InputBoxEx
Public Enum StyleInputBox
    SNone       ' InputBox normal
    SPassword   ' máscara oculta
    SNumber     ' sólo números
    SLowerCase  ' sólo minúsculas
    SUpperCase  ' sólo mayúsculas
End Enum

Private Declare Function FindWindowEx Lib "user32" _
                Alias "FindWindowExA" _
                (ByVal hWnd1 As Long, _
                ByVal hWnd2 As Long, _
                ByVal lpsz1 As String, _
                ByVal lpsz2 As String) As Long
               
Private Declare Function SendMessage Lib "user32" _
                Alias "SendMessageA" _
                (ByVal hwnd As Long, _
                ByVal wMsg As Long, _
                ByVal wParam As Long, _
                lParam As Any) As Long

Private Declare Function GetForegroundWindow Lib "user32" () As Long

Private Declare Function GetWindowLong Lib "user32" _
                Alias "GetWindowLongA" _
                (ByVal hwnd As Long, _
                ByVal nIndex As Long) As Long
               
Private Declare Function SetWindowLong Lib "user32" _
                Alias "SetWindowLongA" _
                (ByVal hwnd As Long, _
                ByVal nIndex As Long, _
                ByVal dwNewLong As Long) As Long
               
Private Declare Function SetTimer Lib "user32" _
                (ByVal hwnd As Long, _
                ByVal nIDEvent As Long, _
                ByVal uElapse As Long, _
                ByVal lpTimerFunc As Long) As Long
               
Private Declare Function KillTimer Lib "user32" _
                (ByVal hwnd As Long, _
                ByVal nIDEvent As Long) As Long

Private Const GWL_STYLE = (-16)

' constantes con los estilos de
' controles 'EDIT'
Private Const ES_UPPERCASE = &H8
Private Const ES_LOWERCASE = &H10
Private Const ES_PASSWORD = &H20
Private Const ES_NUMBER = &H2000

' mensaje para establecer el caracter que se mostrará
' como máscara para el InputBoxEx tipo contraseña
Private Const EM_SETPASSWORDCHAR = &HCC
' constante que contiene el carácter que se mostrará
' (este valor puede ser cualquier otro, en este caso
' he escogido el típico asterisco)
Private Const KEY_MASK = 42& ' "*"
' mensaje para establecer el número máximo de
' caracteres permitidos
Private Const EM_LIMITTEXT = &HC5

Private SInputBox As StyleInputBox
Private hInputBox As Long
Private cChar As Long

Public Function InputBoxEx( _
                Prompt, _
                Optional Title, _
                Optional Default, _
                Optional XPos, _
                Optional YPos, _
                Optional HelpFile, _
                Optional Context, _
                Optional Style As StyleInputBox = SNone, _
                Optional MaxChar As Long) As String
             
    ' si no hay ningún otro InputBoxEx abierto...
    If hInputBox = 0 Then
       ' Creamos un timer que se ejecutará a la décima de segundo
       Call SetTimer(Access.hWndAccessApp, 0&, 100, AddressOf TimerProc)
   
       SInputBox = Style
       cChar = MaxChar
       ' llamamos al InputBox de manera normal
       On Error GoTo AnularTimer
       InputBoxEx = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
    End If
   
    Exit Function
   
AnularTimer:
    ' si ha habido algún error, se cancela la operación
    Call KillTimer(Access.hWndAccessApp, 0&)
    MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
   
End Function

Private Sub TimerProc( _
                     ByVal hwnd As Long, _
                     ByVal uMsg As Long, _
                     ByVal idEvent As Long, _
                     ByVal dwTime As Long)
Dim hEdit As Long
Dim CurStyle As Long
   
    ' localizamos el manipulador de la ventana activa
    ' (se supone que es la ventana del InputBox)
    hInputBox = GetForegroundWindow
    ' localizamos el manipulador de la caja de texto
    ' del InputBox
    hEdit = FindWindowEx(hInputBox, 0&, "EDIT", vbNullString)
   
    ' obtenemos los estilos de la caja de texto ...
    CurStyle = GetWindowLong(hEdit, GWL_STYLE)
   
    Select Case SInputBox
        Case SPassword ' tipo password
            ' le decimos a la caja de texto cuál será el carácter
            ' que aparecerá en vez de lo que teclee el usuario
            Call SendMessage(hEdit, EM_SETPASSWORDCHAR, KEY_MASK, 0&)
            ' y le añadimos el estilo de introducción de contraseñas
            CurStyle = CurStyle Or ES_PASSWORD
        Case SNumber ' tipo número
            CurStyle = CurStyle Or ES_NUMBER
        Case SLowerCase ' tipo minúsculas
            CurStyle = CurStyle Or ES_LOWERCASE
        Case SUpperCase ' tipo mayúsculas
            CurStyle = CurStyle Or ES_UPPERCASE
    End Select
   
    If cChar > 0 Then
        Call SendMessage(hEdit, EM_LIMITTEXT, cChar, 0&)
    End If
    ' cambiamos el estilo
    Call SetWindowLong(hEdit, GWL_STYLE, CurStyle)
    ' desactivamos el timer para que sólo se ejecute esta vez
    Call KillTimer(Access.hWndAccessApp, 0&)
    hInputBox = 0
   
End Sub

49
Base de datos / ¿Cómo ocultar la ventana de Access y el botón cerrar ventana?
« Último mensaje por cesar_c en Marzo 10, 2020, 02:49:52 am »
Hola,
vi en un post de este foro que indica que esta pregunta es recurrente, sin embargo no logro encontrar el hilo adecuado (disculpen por ello), por lo que formulo mis preguntas:

1. ¿Cómo ocultar la venta de Access para que el archivo funcione como un programa ejecutable de cara al usuario?
De este video (https://www.youtube.com/watch?v=FKx4ZYmDPIw)he cogido un código para ocultar la ventana de Access. 
El código funciona, sin embargo, no entiendo qué significan esas líneas de código, ni dónde aprender respecto a ellas.  Por tanto no puedo manipularlas ni adecuarlas a mis necesidades.
Te agradecería si puedes explicar estas líneas, o, en todo caso, indicar el código que sugieres para hacer ello (y explicarlos de ser posible). (O indicar los hilos donde se trate el tema o las palabras clave para buscarlos)
- ¿qué son esas constantes SW_HIDE, SW_NORMAL, etc.?
- ¿qué es y qué hace esa función ShowWindow Lib "user32" y sus parámetros?
- ¿cómo funciona ShowWindow y sus parámetros?
Entiendo el evento OPEN, pero no entiendo el evento UNLOAD
Lo único que entiendo es la sentencia DoCmd.OpenForm "MENU"   :(


2. ¿Cómo ocultar el botón "[X] (cerrar ventana)" en dicho código?
Sucede que, aunque el código indicado funciona, si por error cierro el formulario con el botón [X], el Access se queda colgado y se tiene que reiniciar la PC.  Agradecería saber cómo incrustar el código para eliminar ese botón (y la explicación del caso).

El código que estoy utilizando es el siguiente:

Option Explicit
Const SW_HIDE = 0
Const SW_NORMAL = 1
Const SW_MINIMIZED = 2
Const SW_MAXIMIZED = 3
Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

Private Sub Form_Open(Cancel As Integer)
Call ShowWindow(hWndAccessApp, SW_HIDE)
DoCmd.OpenForm "MENU", windowmode:=acDialog
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim lngRetCode As Long
lngRetCode = ShowWindow(hWndAccessApp, SW_MAXIMIZED)
End Sub


Desde ya muchas gracias por tu atención a estas dudas.
Gracias!

César C.

50
Varias / Abrir explorador en carpeta
« Último mensaje por xavi en Marzo 06, 2020, 01:18:45 am »
Palabras clave: explorador, ficheros, archivos
Autor: miguel
Extraído de: La web del programador

En ocasiones, después de generar más de un fichero por algún procedimiento, necesito mostrar el explorador con los ficheros generados.

Esta función, pasando como argumento la carpeta, la muestra.


Código: [Seleccionar]
Public Sub eRoot(rootpath As String)
    On Error Resume Next
    Dim EX, ARGU, path, X
    EX = "explorer.exe"
    ARGU = " /e,/root, "
    path = rootpath$
    X = Shell(EX & ARGU & path, 1)
End Sub

Páginas: 1 ... 3 4 [5] 6 7 ... 10