Developpez.com

Plus de 14 000 cours et tutoriels en informatique professionnelle à consulter, à télécharger ou à visionner en vidéo.

FAQ MS-AccessConsultez toutes les FAQ

Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireVBAAPI utiles

Dans un module et juste après Option Explicit, coller la déclaration de ces variables :

 
Sélectionnez
Const MAX_IP = 5   ' --Créer un buffer ... je ne pense pas que vous en ayez plus de cinq
Type IPINFO
     dwAddr As Long   ' -- adresse IP
    dwIndex As Long 
    dwMask As Long 
    dwBCastAddr As Long 
    dwReasmSize  As Long 
    unused1 As Integer 
    unused2 As Integer 
End Type
Type MIB_IPADDRTABLE
    dEntrys As Long   
    mIPInfo(MAX_IP) As IPINFO 
End Type
Type IP_Array
    mBuffer As MIB_IPADDRTABLE
    BufferLen As Long
End Type
Public Declare Sub CopyMemory Lib "kernel32" Alias _
     "RtlMoveMemory" (destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function GetIpAddrTable Lib "IPHlpApi"  _
     (pIPAdrTable As Byte, pdwSize As Long, ByVal Sort As Long) As Long
 
Sélectionnez
  ' --conversion d'un Long vers un string
Public Function ConvertAddressToString(longAddr As Long) As String
    Dim myByte(3) As Byte
    Dim Cnt As Long
    CopyMemory myByte(0), longAddr, 4
    For Cnt = 0 To 3
        ConvertAddressToString = ConvertAddressToString + CStr(myByte(Cnt)) + "."
    Next Cnt
    ConvertAddressToString = Left$(ConvertAddressToString, Len(ConvertAddressToString) - 1)
End Function

Maintenant, sur l'événement Sur clic du bouton IP :

 
Sélectionnez
' --Déterminer l'adresse IP
Public Function Get_IP_Click() As String
Dim Ret As Long, Tel As Long
Dim bBytes() As Byte
Dim TempList() As String
Dim TempIP As String
Dim Tempi As Long
Dim Listing As MIB_IPADDRTABLE
Dim L3 As String
On Error GoTo END1
    GetIpAddrTable ByVal 0&, Ret, True
    If Ret <= 0 Then Exit Function
    ReDim bBytes(0 To Ret - 1) As Byte
    ReDim TempList(0 To Ret - 1) As String
    GetIpAddrTable bBytes(0), Ret, False
    CopyMemory Listing.dEntrys, bBytes(0), 4
    For Tel = 0 To Listing.dEntrys - 1
        CopyMemory Listing.mIPInfo(Tel), bBytes(4 + (Tel * Len(Listing.mIPInfo(0)))),  _
                Len(Listing.mIPInfo(Tel))
        TempList(Tel) = ConvertAddressToString(Listing.mIPInfo(Tel).dwAddr)
    Next Tel
        TempIP = TempList(0)
        For Tempi = 0 To Listing.dEntrys - 1
            L3 = Left(TempList(Tempi), 3)
            If L3 <> "169" And L3 <> "127" And L3 <> "192" Then
                TempIP = TempList(Tempi)
            End If
        Next Tempi
        GetWanIP = TempIP 'Return The TempIP
Exit Function
END1:
GetWanIP = ""
End Function
Créé le 18 novembre 2003  par Morsi

Ajouter ce code juste après Option Explicit dans un nouveau module :

 
Sélectionnez
Private Type MEMORYSTATUS
    dwLength As Long
    dwMemoryLoad As Long
    dwTotalPhys As Long
    dwAvailPhys As Long
    dwTotalPageFile As Long
    dwAvailPageFile As Long
    dwTotalVirtual As Long
    dwAvailVirtual As Long
End Type
Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)

Faites appel maintenant à memoireinfo() pour avoir les informations sur la RAM :

 
Sélectionnez
Sub memoireinfo()
    Dim MemStat As MEMORYSTATUS
    GlobalMemoryStatus MemStat
    MsgBox "Vous avez " & (MemStat.dwTotalPhys / 1024) / 1024 & " Mo de RAM"
    MsgBox "Vous avez "  & (MemStat.dwAvailPhys / 1024) / 1024 & " Mo de RAM disponible"
End Sub
Créé le 18 novembre 2003  par Morsi

Parfois, nous aurons besoin des noms de machine pour les fichiers log par exemple ou pour tracer un traitement.

Coller ce code après Option Explicit.

 
Sélectionnez
Private Const MAX_COMPUTERNAME_LENGTH As Long = 31
Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _
(ByVal lpBuffer As String, nSize As Long) As Long
Private Declare Function GetUserName Lib "advapi32.dll" Alias _
         "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
 
Sélectionnez
  '--Déterminer le nom de la machine
Private Function recherche_name() As String
Dim dwLen As Long
Dim strString As String
Dim strUserName As String
    dwLen = MAX_COMPUTERNAME_LENGTH + 1
    strString = String(dwLen, "X")
    strUserName = String(100, Chr$(0))
    GetComputerName strString, dwLen
    GetUserName strUserName, 100
    strUserName = Left$(strUserName, InStr(strUserName, Chr$(0)) - 1)
txt_ip.Value = strUserName
    strString = Left(strString, dwLen)
    recherche_name = strString
End Function

Une autre méthode proposée par Thierry AIM :

 
Sélectionnez
Dim strComputerName As String 
Dim strUserName As String 
strComputerName = Environ("COMPUTERNAME") 
strUserName  = Environ("USERNAME") 
Créé le 18 novembre 2003  par Morsi

Ajouter ce code après Option Explicit :

 
Sélectionnez
Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
Private Type SYSTEM_INFO
    dwOemID As Long
    dwPageSize As Long
    lpMinimumApplicationAddress As Long
    lpMaximumApplicationAddress As Long
    dwActiveProcessorMask As Long
    dwNumberOrfProcessors As Long
    dwProcessorType As Long
    dwAllocationGranularity As Long
    dwReserved As Long
End Type

Ensuite faites appel à getsysinfo() :

 
Sélectionnez
Private Sub getsysinfo()
    Dim SInfo As SYSTEM_INFO
    GetSystemInfo SInfo
    MsgBox "Processeur de type " & str$(SInfo.dwProcessorType)
End Sub
Créé le 18 novembre 2003  par Morsi


Pour faire cela il faut simuler la touche Shift à l'aide de l'API keybd_event.
Pensez à mettre la référence => Microsoft DAO 3.x Object Lirary.


Code à mettre dans un nouveau module :

 
Sélectionnez
Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
 
Sub OpenDB()

Dim db As Database
Dim appAccess As Access.Application
Const csts = "D:\Mes documents\BaseTests.mdb"
 
 
    keybd_event vbKeyShift, 0, 0, 0 'Enfonce la touche SHift
    Set appAccess = New Access.Application
    appAccess.Visible = True
    appAccess.OpenCurrentDatabase csts
    appAccess.DoCmd.OpenForm "MonForm"
    keybd_event vbKeyShift, 0, 2, 0 'libère la touche SHift

End Sub
Créé le 14 octobre 2007  par mout1234


Voici un module pour récupérer une adresse MAC distante :

 
Sélectionnez
Option Explicit
 
' Déclarations pour GetRemoteMACAddress


Private Declare Function inet_addr Lib "WSOCK32.DLL" _
  (ByVal s As String) As Long
Private Declare Function SendARP Lib "iphlpapi.dll" _
  (ByVal DestIP As Long, _
   ByVal SrcIP As Long, _
   pMacAddr As Long, _
   PhyAddrLen As Long) As Long
Private Declare Sub CopyMemory Lib "KERNEL32" _
   Alias "RtlMoveMemory" _
  (dst As Any, _
   src As Any, _
   ByVal bcount As Long)
' Déclarations pour LetterToUNC
Private Const RESOURCETYPE_ANY = &H0
Private Const RESOURCE_CONNECTED = &H1
 
Private Type NETRESOURCE
   dwScope As Long
   dwType As Long
   dwDisplayType As Long
   dwUsage As Long
   lpLocalName As Long
   lpRemoteName As Long
   lpComment As Long
   lpProvider As Long
End Type
Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias _
   "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long, _
   ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) _
   As Long
Private Declare Function WNetEnumResource Lib "mpr.dll" Alias _
   "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, _
   lpBuffer As Any, lpBufferSize As Long) As Long
Private Declare Function WNetCloseEnum Lib "mpr.dll" ( _
   ByVal hEnum As Long) As Long
Private Declare Function lstrlen Lib "KERNEL32" Alias "lstrlenA" _
   (ByVal lpString As Any) As Long
Private Declare Function lstrcpy Lib "KERNEL32" Alias "lstrcpyA" _
   (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
 
' Déclarations pour LetterToUNC
Private Const WS_VERSION_REQD = &H101
Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Private Const MIN_SOCKETS_REQD = 1
Private Const SOCKET_ERROR = -1
Private Const WSADescription_Len = 256
Private Const WSASYS_Status_Len = 128
 
Private Type HOSTENT
    hName As Long
    hAliases As Long
    hAddrType As Integer
    hLength As Integer
    hAddrList As Long
End Type
 
Private Type WSADATA
    wversion As Integer
    wHighVersion As Integer
    szDescription(0 To WSADescription_Len) As Byte
    szSystemStatus(0 To WSASYS_Status_Len) As Byte
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpszVendorInfo As Long
End Type
 
Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _
wVersionRequired As Integer, lpWSAData As WSADATA) As Long
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
 
Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname$, _
ByVal HostLen As Long) As Long
Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal _
hostname$) As Long
Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, ByVal _
hpvSource&, ByVal cbCopy&)
 
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
Public Function GetRemoteMACAddress(ByVal pIPDistante As String) As String
Dim lAddr As Long
Dim lMacAddr As Long
Dim lMacAddrByte() As Byte
Dim lPhyAddrLen As Long
Dim lCpt As Integer
' Transforme l'adresse IP texte en adresse IP numérique
lAddr = inet_addr(pIPDistante)
If lAddr <> -1 Then
    ' Taille d'une adresse MAC = 6
    lPhyAddrLen = 6
    ' Recherche l'adresse MAC distante
    If SendARP(lAddr, 0&, lMacAddr, lPhyAddrLen) = 0 Then
        If (lMacAddr <> 0) And (lPhyAddrLen <> 0) Then
            ' Tableau de byte qui contiendra l'adresse MAC
            ReDim lMacAddrByte(0 To lPhyAddrLen - 1)
            ' Copie l'adresse MAC dans le tableau (lMacAddr est une adresse mémoire)
            CopyMemory lMacAddrByte(0), lMacAddr, ByVal lPhyAddrLen
            ' Convertit l'adresse MAC en texte
            GetRemoteMACAddress = ""
            For lCpt = LBound(lMacAddrByte) To UBound(lMacAddrByte)
                GetRemoteMACAddress = GetRemoteMACAddress & Right("00" & Hex(lMacAddrByte(lCpt)), 2) & IIf(lCpt = UBound(lMacAddrByte), "", "-")
            Next
        End If
    End If
End If
End Function
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
 
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Source KB Microsoft : http://support.microsoft.com/kb/192689/fr
Public Function LetterToUNC(DriveLetter As String) As String
Dim hEnum As Long
Dim NetInfo(1023) As NETRESOURCE
Dim entries As Long
Dim nStatus As Long
Dim LocalName As String
Dim UNCName As String
Dim i As Long
Dim r As Long
 
' Begin the enumeration
nStatus = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_ANY, _
   0&, ByVal 0&, hEnum)
 
LetterToUNC = "Drive Letter Not Found"
 
' Check for success from open enum
If ((nStatus = 0) And (hEnum <> 0)) Then
   ' Set number of entries
   entries = 1024
 
   ' Enumerate the resource
   nStatus = WNetEnumResource(hEnum, entries, NetInfo(0), _
      CLng(Len(NetInfo(0))) * 1024)
 
   ' Check for success
   If nStatus = 0 Then
      For i = 0 To entries - 1
         ' Get the local name
         LocalName = ""
         If NetInfo(i).lpLocalName <> 0 Then
            LocalName = Space(lstrlen(NetInfo(i).lpLocalName) + 1)
            r = lstrcpy(LocalName, NetInfo(i).lpLocalName)
         End If
 
         ' Strip null character from end
         If Len(LocalName) <> 0 Then
            LocalName = Left(LocalName, (Len(LocalName) - 1))
         End If
 
         If UCase$(LocalName) = UCase$(DriveLetter) Then
            ' Get the remote name
            UNCName = ""
            If NetInfo(i).lpRemoteName <> 0 Then
               UNCName = Space(lstrlen(NetInfo(i).lpRemoteName) _
                  + 1)
               r = lstrcpy(UNCName, NetInfo(i).lpRemoteName)
            End If
 
            ' Strip null character from end
            If Len(UNCName) <> 0 Then
               UNCName = Left(UNCName, (Len(UNCName) _
                  - 1))
            End If
 
            ' Return the UNC path to drive
            LetterToUNC = UNCName
 
            ' Exit the loop
            Exit For
         End If
      Next i
   End If
End If
 
' End enumeration
nStatus = WNetCloseEnum(hEnum)
End Function
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
 
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Source KB Microsoft : http://support.microsoft.com/kb/160215/fr
Private Function hibyte(ByVal wParam As Integer)
    hibyte = wParam \ &H100 And &HFF&
End Function
 
Private Function lobyte(ByVal wParam As Integer)
    lobyte = wParam And &HFF&
End Function
 
Private Sub SocketsInitialize()
Dim WSAD As WSADATA
Dim iReturn As Integer
Dim sLowByte As String, sHighByte As String, sMsg As String
    iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
    If iReturn <> 0 Then
        MsgBox "Winsock.dll is not responding."
        End
    End If
    If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = _
        WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then
        sHighByte = Trim$(Str$(hibyte(WSAD.wversion)))
        sLowByte = Trim$(Str$(lobyte(WSAD.wversion)))
        sMsg = "Windows Sockets version " & sLowByte & "." & sHighByte
        sMsg = sMsg & " is not supported by winsock.dll "
        MsgBox sMsg
        End
    End If
    ' iMaxSockets is not used in winsock 2. So the following check is only
    ' necessary for winsock 1. If winsock 2 is requested,
    ' the following check can be skipped.
    If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
        sMsg = "This application requires a minimum of "
        sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported sockets."
        MsgBox sMsg
        End
    End If
End Sub
 
Private Sub SocketsCleanup()
Dim lReturn As Long
    lReturn = WSACleanup()
    If lReturn <> 0 Then
        MsgBox "Socket error " & Trim$(Str$(lReturn)) & " occurred in Cleanup "
        End
    End If
End Sub
 
Public Function GetIpFromHost(ByVal pHostName As String) As Variant
Dim hostname As String * 256
Dim hostent_addr As Long
Dim host As HOSTENT
Dim hostip_addr As Long
Dim temp_ip_address() As Byte
Dim i As Integer
Dim ip_address As String
Dim lCpt As Integer
Dim lResult() As String
On Error GoTo Gestion_Erreurs
    SocketsInitialize
    ' Retire le double \
    If Left(pHostName, 2) = "\\" Then
        pHostName = Right(pHostName, Len(pHostName) - 2)
    End If
    ' Retire un éventuel chemin
    If InStr(pHostName, "\") > 0 Then
        pHostName = Left(pHostName, InStr(pHostName, "\") - 1)
    End If
    hostname = Trim$(pHostName & vbNullChar)
    hostent_addr = gethostbyname(hostname)
    If hostent_addr = 0 Then
        MsgBox "Winsock.dll is not responding."
        Exit Function
    End If
    RtlMoveMemory host, hostent_addr, LenB(host)
    RtlMoveMemory hostip_addr, host.hAddrList, 4
    'get all of the IP address if machine is  multi-homed
    lCpt = 0
    Do
        ReDim temp_ip_address(1 To host.hLength)
        RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
 
        For i = 1 To host.hLength
            ip_address = ip_address & temp_ip_address(i) & "."
        Next
        ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
 
        ReDim lResult(lCpt)
        lResult(lCpt) = ip_address
        lCpt = lCpt + 1
        ip_address = ""
        host.hAddrList = host.hAddrList + LenB(host.hAddrList)
        RtlMoveMemory hostip_addr, host.hAddrList, 4
     Loop While (hostip_addr <> 0)
Gestion_Erreurs:
    SocketsCleanup
    GetIpFromHost = lResult
End Function
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
Il y a trois fonctions :
  • - LetterToUNC qui transforme une lettre de disque en nom réseau ;
  • - GetIpFromHost qui recherche les adresses IP d'un serveur ;
  • - GetRemoteMACAddress qui recherche l'adresse MAC à partir d'une IP.


Il y a juste à rechercher la lettre du disque sur lequel est la base distante pour remplacer le "Q:" que j'ai mis en dur dans le code.

Créé le 14 octobre 2007  par cafeine

Lien : Comment obtenir l'adresse MAC de la carte réseau ?
Lien : http://access.developpez.com/sources/?page=reseau#mac1
Lien : http://access.developpez.com/sources/?page=reseau#mac2


Comment récupérer le résultat de la calculatrice de Windows et plus généralement comment retrouver une fenêtre Windows par son nom ou sa classe.


Code à mettre dans un module :

 
Sélectionnez
Option Explicit
 
Private Declare Function GetDesktopWindow Lib "user32" () As Long
 
Private Declare Function GetWindow Lib "user32" _
  (ByVal hWnd As Long, _
   ByVal wCmd As Long) As Long
 
Private Declare Function GetWindowText Lib "user32" _
   Alias "GetWindowTextA" _
  (ByVal hWnd As Long, _
   ByVal lpString As String, _
   ByVal cch As Long) As Long
 
Private Declare Function GetClassName Lib "user32" _
   Alias "GetClassNameA" _
  (ByVal hWnd As Long, _
   ByVal lpClassName As String, _
   ByVal nMaxCount As Long) As Long
 
Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDLAST = 1
Private Const GW_HWNDNEXT = 2
Private Const GW_HWNDPREV = 3
Private Const GW_OWNER = 4
Private Const GW_CHILD = 5
 
Public Function GetWdwLike(ByVal hWndStart As Long, _
                                WindowText As String, _
                                Classname As String) As Long
 
   Dim hWnd As Long
   Dim sWindowText As String
   Dim sClassname As String
   Dim r As Long
  
  ' Niveau de récursion
   Static level As Integer
  
  
  ' Initialisation du handle de départ et du niveau de récursion
   If level = 0 Then
      If hWndStart = 0 Then hWndStart = GetDesktopWindow()
   End If
  
  ' Itération du niveau récursif
   level = level + 1
  
  ' On trouve le premier window
   hWnd = GetWindow(hWndStart, GW_CHILD)
 
   Do Until hWnd = 0
      
     ' Recherche récursive
      Call GetWdwLike(hWnd, WindowText, Classname)
      
     ' On obtient la classe et le text du window
      sWindowText = Space$(255)
      r = GetWindowText(hWnd, sWindowText, 255)
      sWindowText = Left(sWindowText, r)
        
      sClassname = Space$(255)
      r = GetClassName(hWnd, sClassname, 255)
      sClassname = Left(sClassname, r)
              
     ' On vérifie que c'est conforme à la recherche
      If (sWindowText Like WindowText) And _
         (sClassname Like Classname) Then
                GetWdwLike = hWnd
      End If
    
     ' Window suivant
      hWnd = GetWindow(hWnd, GW_HWNDNEXT)
  
   Loop
 
  ' Reduce the recursion counter
   level = level - 1
 
End Function
 
 
Public Function GetCalcResult() As Double
 
Dim CalchWnd As Long, ReshWnd As Long
Dim sTxt As String, r As String
 
On Error Resume Next
 
CalchWnd = GetWdwLike(0, "*", "SciCalc")
ReshWnd = GetWdwLike(CalchWnd, "*.*", "Static")
 
sTxt = Space$(255)
r = GetWindowText(ReshWnd, sTxt, 255)
GetCalcResult = CDbl(Left(sTxt, r))
 
End Function
Créé le 14 octobre 2007  par cafeine


Voici une solution en utilisant les API.


Coller ce code dans un nouveau module :

 
Sélectionnez
Private Declare Function FoldString Lib "kernel32.dll" Alias _
        "FoldStringA" (ByVal dwMapFlags As Long, ByVal lpSrcStr As Long, _
        ByVal cchSrc As Long, ByVal lpDestStr As Long, ByVal cchdest As Long) As Long
 
Function OteAccents(ByVal str As String) As String
 
    Dim i As Integer
    OteAccents = Space(Len(str))
    
    For i = 0 To (Len(str) - 1) * 2 Step 2
        FoldString &H40, StrPtr(str) + i, 1, StrPtr(OteAccents) + i, 1
    Next i
 
End Function
Créé le 14 octobre 2007  par cafeine

Lien : Comment ignorer les accents dans une requête SQL ?


Pour réduire une fenêtre d'une application autre qu'Access il faut passer par des API.


Ces déclarations sont à mettre au début du module :

 
Sélectionnez
' Déclarations
Const WM_SYSCOMMAND As Long = &H112

Const SC_MINIMIZE As Long = &HF020&
Const SC_MAXIMIZE As Long = &HF030&
Const SC_RESTORE As Long = &HF120&

Private Declare Function PostMessage Lib "User32.dll" Alias "PostMessageA" ( _
ByVal hwnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Declare Function FindWindow1 Lib "User32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As Long, ByVal lpWindowName As String) As Long


Il faut utiliser la fonction suivante pour fermer la fenêtre, celle-ci fonctionne avec le titre de la fenêtre à réduire :

 
Sélectionnez
Function AppMinimize(AppTitle As String) As Boolean
Dim hwnd As Long
hwnd = FindWindow1(0, AppTitle & vbNullChar)
If hwnd <> 0 Then
PostMessage hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0
AppMinimize = True
Else
AppMinimize = False ' Fenêtre pas trouvée
End If
End Function


Pour comprendre le fonctionnement vous pouvez faire un essai avec le Bloc-notes, ouvrez Bloc-notes, la fenêtre s'appelle : "Sans titre - Bloc-notes".


Mettez ce code sur un événement de votre choix :

 
Sélectionnez
Sub quicktest()
Dim AppTitle As String, tmr As Long

AppTitle = "Sans titre - Bloc-notes"
AppActivate AppTitle
tmr = Timer
While ((Timer - tmr) < 2)
Wend
AppMinimize AppTitle

End Sub


Ouvrez votre application Access en pleine fenêtre et la fenêtre Bloc-notes en niveau inférieur, sur appel du code ci-dessus la fenêtre Bloc-notes se réduira une fois le timer écoulé.

Créé le 14 octobre 2007  par LedZeppII

Pour ce faire il faut utiliser l'API OleTranslateColor.

 
Sélectionnez
Private Declare Function OleTranslateColor Lib "olepro32.dll" _
          (ByVal OLE_COLOR As Long, ByVal hPalette As Long, pccolorref As Long) As Long
 
'---------------------------------------------------------------------------------------
' Récupère la couleur système si nécessaire
'---------------------------------------------------------------------------------------
' pColor     : Numéro de la couleur
' Les couleurs définies par défaut dans Access sont souvent des couleurs système
' Par exemple la couleur de fond d'un formulaire par défaut est -2147483633
' Il faut retrouver la couleur définie dans le système pour cette valeur
' Renvoie la couleur dans un Long
'---------------------------------------------------------------------------------------
Private Function GetColor(pColor As Long) As Long
    If pColor < 0 Then
        Call OleTranslateColor(pColor, 0, pColor)
    End If
    GetColor = pColor
End Function
 
'---------------------------------------------------------------------------------------
' Conversion code couleur Long vers RGB
'---------------------------------------------------------------------------------------
' pLong     : Numéro de la couleur
' pRed      : Composante Rouge
' pGreen    : Composante Vert
' pBlue     : Composante Bleu
'---------------------------------------------------------------------------------------
Public Function LongToRGB(ByVal pLong As Long, pRed As Long, pGreen As Long, pBlue As Long) As Boolean
' On récupère la couleur système si nécessaire
    pLong = GetColor(pLong)
    On Error GoTo Gestion_Erreurs:
    pBlue = Int(pLong / 65536)
    pGreen = Int((pLong - (65536 * pBlue)) / 256)
    pRed = pLong - ((pBlue * 65536) + (pGreen * 256))
Gestion_Erreurs:
    If Err.Number = 0 Then LongToRGB = True    ' Renvoie Vrai si pas d'erreur
End Function
Créé le 14 octobre 2007  par Arkham46

Pour savoir si la touche Shift est activée au démarrage.
Mettre dans la section Déclarations d'un module de code :

 
Sélectionnez
' Vérifier l'état d'une touche
Const VK_LSHIFT As Long = &HA0
Const VK_RSHIFT As Long = &HA1
Private Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Integer) As Byte
 
Public Function IsShiftKeyDown() As Boolean
IsShiftKeyDown = False
If (GetKeyState(VK_LSHIFT) And &H80) = &H80 Then IsShiftKeyDown = True
If (GetKeyState(VK_RSHIFT) And &H80) = &H80 Then IsShiftKeyDown = True
End Function

À mettre dans un module de code

 
Sélectionnez
Public Function Init()
If IsShiftKeyDown Then
   If InputBox("Mot de Passe ") = "123" Then
      ' Le mot de passe est valide
      ...
   End If
End If
End Function

Ensuite il faut créer une macro qui sera nommée Autoexec :

 
Sélectionnez
Action : ExécuterCode                 Nom fonction : Init()
Créé le 31 mars 2008  par LedZeppII

Pour réduire la fenêtre active dans Access, il suffit d'utiliser la méthode Minimize, mais pour réduire la fenêtre de l'application Microsoft Access,
l'un des moyens possibles est l'appel des API. Voici le code à placer dans un module global :

 
Sélectionnez
' Dans la section déclarations
Public Const SW_MINIMIZE = 6
Public Type POINTAPI
        x As Long
        y As Long
End Type
Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Public Type WINDOWPLACEMENT
        Length As Long
        flags As Long
        showCmd As Long
        ptMinPosition As POINTAPI
        ptMaxPosition As POINTAPI
        rcNormalPosition As RECT
End Type
 
Public Declare Function SetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Dim Rectan As RECT
 
' La procédure
Sub Reduire()
    ' Réduire la fenêtre active dans la fenêtre d'Access
    DoCmd.Minimize
    
    ' Réduire la fenêtre d'Access
    Dim WinEst As WINDOWPLACEMENT
    Dim Punto As POINTAPI
    Dim rtn As Long
    Punto.x = 100
    Punto.y = 100
    ' Initialiser la structure
    WinEst.Length = Len(WinEst)
    WinEst.showCmd = SW_MINIMIZE
    WinEst.ptMinPosition = Punto
    WinEst.ptMaxPosition = Punto
    WinEst.rcNormalPosition = Rectan
    ' La réduction effective se fait ici
    rtn = SetWindowPlacement(Application.hWndAccessApp, WinEst)
End Sub

L'appel de la procédure se fait par un Call Reduire à l'événement sur clic d'un bouton.

Créé le 31 mars 2008  par Mahefasoa
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.