2017-12-18 11 views
1

MS-Access에서 하위에 함수의 변수를 사용할 수 없습니다 내 Load() 하위에 GetUserName를 사용하여 값을 얻을 수 있지만, 드릴 수 없습니다내 MS 액세스 양식에서 VBA 코드 아래 내가 가진

Option Compare Database 
Option Explicit 

Public Function GetUserName() As String 
    Dim obj1 As Object 
    Dim GetEmpID As String 
    Set obj1 = CreateObject("WScript.Network") 
    GetUserName = DLookup("[BAFUser]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 
    GetEmpID = DLookup("[EmpID]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 
    Set obj1 = Nothing 
End Function 

Private Sub Form_Load() 
    Me.EmpName.Value = GetUserName 
    Me.EmpID.Value = GetEmpID 
End Sub 

GetEmpID을 사용하여 값을 가져옵니다.

가능한 이유는 무엇입니까? 어떻게 해결할 수 있습니까?

미리 감사드립니다.

+2

GetEmpID 는 getUserName 메서드 기능의 범위 내에서 선언 된 변수와 함수의 범위 외부에 액세스 할 수 없습니다. – Jeremy

답변

2

옵션 1 (그 값을 반환하지 않기 때문에, 현재 서브)는 기능 설정 모듈 수준 변수를 생성

Option Compare Database 
Option Explicit 

Dim UserName as String 
Dim EmpID as String 

Public Sub GetValues() 
    Dim obj1 As Object 

    Set obj1 = CreateObject("WScript.Network") 
    UserName = DLookup("[BAFUser]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 
    EmpID = DLookup("[EmpID]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 
    Set obj1 = Nothing 
End Sub 

Private Sub Form_Load() 
    Call GetValues() 'Invoke the function to set values 
    Me.EmpName.Value = UserName 'retrieve values from module level variables 
    Me.EmpID.Value = EmpID 
End Sub 

옵션 2 : 변수하는 ByRef 만든다.

Option Compare Database 
Option Explicit 

Public Sub GetValues(ByRef UserName as String, ByRef EmpID as String) 
    Dim obj1 As Object 

    Set obj1 = CreateObject("WScript.Network") 
    UserName = DLookup("[BAFUser]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 
    EmpID = DLookup("[EmpID]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 
    Set obj1 = Nothing 
End Sub 

Private Sub Form_Load() 
    Dim UserName as String 
    Dim EmpID as String 
    Call GetValues(UserName, EmpId) 'Invoke the function to set values of local variables. 
    Me.EmpName.Value = UserName 'retrieve values from function scoped variables. 
    Me.EmpID.Value = EmpID 
End Sub 

경고 : 메모리에서 입력. 사소한 수정이 필요할 수 있습니다.

+0

해결책을 가져 주셔서 감사합니다. 두 방법 모두 완벽 해 보이지만, 공유 폴더에서 동시에 여러 파일을 사용하는 사용자가 있다면 어떤 옵션이 가장 좋을지 알려주실 수 있습니까? 여러 사용자가 데이터를 입력하는 양식입니다. 위에서 언급 한 옵션을 사용하면 오류가 발생할 수 있습니다. –

+0

여러 사용자의 경우 Access db를 각 사용자가 로컬 시스템에 보유 할 "프런트 엔드"와 네트워크 공유에있는 데이터 인 "백엔드"로 분할하는 것이 좋습니다. http://www.fmsinc.com/microsoftaccess/databasesplitter/ 및 https://support.microsoft.com/en-us/help/304932/how-to-manually-split-a-access-database-in- – Jeremy

+0

thaks @jeremy fo 제안 그러나, 우리는 우리의 공유 폴더에있는 우리 사무실의 파일 수를 줄이는 것에 중점을 두었으므로 각 사용자에게 복사본을 제공하는 것이 좋지 않을 것입니다. 그러나, 나는 그 파일을 위해 대부분의 액세스 기능을 비활성화했다. 그래서 그것이 더 효율적인 방법으로 수행 될 수 있다면 나는 희망했다. –

1

항상 함수에서 ByRef를 사용할 수 있습니다.

Option Compare Database 
Option Explicit 

Public Function GetUserName(ByRef GetEmpID as string) as string 
dim obj1 as object 

Set obj1 = CreateObject("WScript.Network") 

GetUserName = DLookup("[BAFUser]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 
GetEmpID = DLookup("[EmpID]", "BAF_User", "[BRID] = '" & obj1.UserName & "'") 

If not obj1 is nothing then 
    Set obj1 = Nothing 
End If 
End Function 

Private Sub Form_Load() 
Dim GetEmpID as string 

GetEmpID = "None" 

Me.EmpName.value = GetUserName(GetEmpID) 
Me.EmpID.Value = GetEmpID 
End Sub 

ByRef는 메모리에 변수를 저장하는 데 사용되는 주소를 전달합니다. 값 대신 주소가 전달되면 주소에 발생한 모든 변경 사항이 프로젝트의 변수에 적용됩니다.

ByVal로와하는 ByRef의 자세한 설명은 아래 웹 사이트를 참조하십시오 http://www.cpearson.com/excel/byrefbyval.aspx

+0

도움을 주셔서 감사합니다,이 방법을 시도해보십시오. 내가 사용하고있는 양식이 공유 폴더를 통해 mutiple 사용자가 동시에 사용할 액세스 파일이기 때문에 위의 코드를 사용하면 오류가 발생할 수 있다고 제안 할 수 있습니까? –