Получение значения из формы MS Access из Excel VBA - PullRequest
1 голос
/ 27 марта 2009

Лучший способ проверить, открыта ли форма доступа и получить значение текстового поля с помощью Excel VBA.

Я имею в виду, есть ли способ проверить, запущено ли приложение MS Access, и если это так, проверить, открыта ли определенная форма, а затем получить значение из поля текстового поля этой формы.

Что-то вроде

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

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

@ Debou.Print Remou выдает ошибку, если форма не открыта.

Большинство разработчиков Access импортируют функцию IsLoaded () в свою базу данных и используют ее. Код в моей версии этого (который может или не может быть отредактирован из исходной версии MS) это:

  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

Чтобы использовать это из Excel, вы можете переписать его так:

  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

(я не проверял это в Excel, но вы поняли)

1 голос
/ 28 марта 2009

Вот пример кода.

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