2009-03-27 16 views
1

Quelle est la meilleure façon de vérifier si le formulaire d'accès est ouvert et d'obtenir la valeur de la zone de texte à l'aide d'Excel VBA.Récupération de la valeur à partir du formulaire MS Access à partir d'Excel VBA

Je veux dire est-il un moyen de vérifier si l'application MS Access est en cours d'exécution et si elle est alors vérifier certain formulaire est ouvert puis obtenir la valeur du champ de zone de texte de ce formulaire.

Quelque chose comme

If MSAccess.([Application name]).Forms("FormName").isOpen then 
    MyVar = MSAccess.([Application name]).Forms("FormName")![PO Number] 
    end if 
+0

Vous voudrez peut-être ajouter des exemples, plus de détails pour obtenir une meilleure réponse. –

+0

Je ne vais pas mettre cela dans une réponse car elle ne répond pas vraiment à la question posée, mais cela sent comme une très mauvaise idée en devenir. Mon conseil serait de trouver une meilleure façon d'aborder tout ce que vous essayez de faire. Si vous donnez plus de détails, je vais essayer de vous conseiller sur une meilleure approche. – JohnFx

Répondre

1

Voici quelques exemples de code.

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ 
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Public Declare Function ShowWindow Lib "user32" _ 
    (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long 

Public Const SW_SHOW = 5 
Public Const GW_HWNDNEXT = 2 

Sub FindAccess() 
Dim WinHandle As Long 
Dim objAc As Object 

'Form title' 
FindWindow vbNullString, "Images" 

'use it' 
ShowWindow WinHandle, SW_SHOW 

'to get the application' 
Set objAc = GetObject(, "Access.Application") 

'and print a control's value' 
Debug.Print objAc.Forms("frmImages").Controls("Description") 

Set objAc = Nothing 
End Sub 
+0

Merci, c'est ce que je voulais exactement. – THEn

1

@ Remug's Debug.Print ne produira pas d'erreur si le formulaire n'est pas ouvert.

La plupart des développeurs d'Access importent une fonction IsLoaded() dans leur base de données et l'utilisent. Le code dans ma version de celui-ci (qui peut ou ne peut pas être modifié à partir de la version MS originale) est la suivante:

Function IsLoaded(ByVal strFormName As String) As Boolean 
    ' Returns True if the specified form is open in Form view or Datasheet view. 
    Const conObjStateClosed = 0 
    Const conDesignView = 0 

    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then 
     If Forms(strFormName).CurrentView <> conDesignView Then 
      IsLoaded = True 
     End If 
    End If 
    End Function 

Pour utiliser ce à partir d'Excel, vous pouvez réécrire ainsi:

Function IsLoaded(ByVal strFormName As String, objAccess As Object) As Boolean 
    ' Returns True if the specified form is open in Form view or Datasheet view. 
    Const conObjStateClosed = 0 
    Const conDesignView = 0 
    Const acSysCmdGetObjectState = 10 
    Const acForm = 2 

    If objAccess.SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then 
     If objAccess.Forms(strFormName).CurrentView <> conDesignView Then 
      IsLoaded = True 
     End If 
    End If 
    End Function 

(Je n'ai pas testé cela à partir d'Excel, mais vous avez l'idée)

Questions connexes