2010-01-13 3 views
0

VBA를 사용하여 액세스 할 때 사용자 지정 속성을 만드는 방법을 찾고 있습니다. 여기VBA를 사용하여 액세스 할 때 사용자 지정 속성을 만드는 방법

내가 붙어 얼마나 내가 어디의 :

사용자 정의 속성의 값 (이름이 foo는이다)과 같이 읽을 수 있습니다 :

Dim cnt As Container 
Dim doc As Document 

Set cnt = DBEngine(0)(0).Containers!Databases 
Set doc = cnt.Documents!userDefined 

doc.Properties.Refresh 
Debug.Print (doc.Properties!foo) 

Similary, 나는를 만들 수 있습니다 새 속성 : 이제

doc.Properties.Append doc.CreateProperty("vba created", dbText, "yes") 

문제는 다음과 같습니다

Set doc = cnt.Documents!userDefined 

은 mdb에 적어도 하나 이상의 사용자 정의 속성이있는 경우에만 작동합니다. VBA를 사용하여 사용자 지정 속성을 만들려면 사용자 지정 속성을 만들어야합니다.

을 사용하여 VBA를 사용하여 몇 가지 MDB를 만들고 수동 개입없이 모든 작업을 수행해야하므로이 사용자 지정 속성을 수동으로 만들지는 않습니다. 선명도 여기

에 대한 올바른 방향

르네

편집에 대한 포인터

덕분에 내가 달성 할 수없는 것을 보여주기 위해 사용할 수 있습니다 희망 (아래 손질) 코드입니다 :

option explicit 

public sub add_user_defined_property() 

on error goto error_lbl 

    dim ac as access.application 
    dim cnt as dao.container 
    dim doc as dao.document 
    dim prp as dao.property 
    dim db as dao.database 

    dim mdb_name as string 
     mdb_name = "c:\temp\cust_prop_test.mdb" 

    set ac = new access.application 
    set db = ac.dbEngine.workspaces(0).createDatabase(mdb_name, dbLangGeneral, 0) 

    ac.openCurrentDatabase(mdb_name) 

' set cnt = DBEngine(0)(0).Containers("Databases") 
    set cnt = db.containers("Databases") 

    ' following line throws "3265 Item not found in this collection" 
    set doc = cnt.Documents!UserDefined 

    set prp = doc.createProperty("MyNewProperty", dbText, "MyNewProperty") 
    doc.properties.append prp 

' for Each prp In doc.Properties 
'  debug.print "Name = " & prp.Name & ", value = " & prp.Value 
' next 

error_lbl: 

    select case err.number 
     case 3265 
       msgBox("Expected error occured") 
     case else 
       msgBox(err.number & vbCrLf & err.description) 
    end select 

end sub 

이 코드는 3265 (이 컬렉션에없는 항목) 오류를 l 오프라인

set doc = cnt.Documents!UserDefined 

을 읽기 때문에 (내가 생각하는) MDB를 새로 생성되고 아직 이 cnt.Documents에 멤버 - 정의가 포함되어 있지 않습니다. 만약 이미 수동으로 그런 속성을 추가했다면, 즉 mdb 파일을 열어서 File-> Database Properties 메뉴로 가서 사용자 정의 탭으로 가면 작동 할 것입니다.

+0

Access에서 만든 MDB에는 여러 속성이있는 UserDefined 속성 컬렉션이 있으므로 코드에서 이러한 MDB를 만들어야합니다. 왜 그냥 오류에 대한 함정과 그것을 무시하지? –

+0

오류를 무시하면 도움이 될 것입니다. –

+0

글쎄, "무시"는 내가 UserDefined 문서가 부족하여 발생하는 오류를 잡아두고 부재시에 원하는 모든 작업을 진행한다는 것을 의미합니다 (예 : UserDefined 문서를 만들고 속성을 추가하고, 또는 무엇을하고 싶은지). –

답변

3

DB 파일을 만들기 위해 생성 된 데이터베이스를 사용하고있는 것이 문제입니다. 이 방법으로 MDB 파일을 만들면 MSysDB 문서 개체 만 생성됩니다.

수행하려는대로 데이터베이스를 만들고 문서! 사용자 정의 개체에서 속성을 설정할 수 있도록하려면 응용 프로그램에서 데이터베이스를 만들어야합니다.

다음 행을 변경, 이렇게하려면 다음을 수행

set ac = new access.application 
    set db = ac.dbEngine.workspaces(0).createDatabase(mdb_name, dbLangGeneral, 0) 

    ac.openCurrentDatabase(mdb_name) 

에 :

set ac = new access.application 
    ac.NewCurrentDatabase (mdb_name) 

    Set db = ac.CurrentDb 

이는 .MDB 파일을 생성하고이 MSysDb, SummaryInfo 및 사용자 정의 된 이름에 3 문서를해야합니다.

코드가 내가 작업하고있는 문제를 해결하는 데 도움이되었습니다.이 코드가 도움이됩니다.

1

편집을 다시 설명

Set cnt = DBEngine(0)(0).Containers("Databases") 
Set doc = cnt.Documents!UserDefined 

Set prp = doc.CreateProperty("MyNewProperty", dbText, "MyNewProperty") 
doc.Properties.Append prp 

For Each prp In doc.Properties 
    Debug.Print "Name = " & prp.Name & ", value = " & prp.Value 
Next 
다음

당신이 더 많은 정보를 찾을 수 Less Than Dot, 일부 샘플 코드입니다.

'--------------------------------------------------------------------------------------- 
' Procedure : CreateDBStrProp 
' Purpose : Create a Custom Database Property of dbText (string) type 
' Arguments : strPropName As String-the Property Name 
'   : strPropValue As String-the Property Value 
'--------------------------------------------------------------------------------------- 

Function CreateDBStrProp(strPropName As String, strPropValue As String) As Boolean 
On Error GoTo Err_CreateDBStrProp 

    Dim db As DAO.Database 
    Dim prp As Property 

    Set db = DBEngine(0)(0) 

    '' First we verify the Property Exists to avoid an error 
    If ExistsDBProperty(strPropName) = False Then 
     Set prp = db.CreateProperty(strPropName, dbText, strPropValue) 
     db.Properties.Append prp 
    Else 
     Set prp = db.Properties(strPropName) 
     prp.Value = strPropValue 
     MsgBox "DBProperty " & strPropName & " already exists.  " _ 
      & vbCrLf & vbCrLf & "Property value was set." _ 
      , vbExclamation 
    End If 

    CreateDBStrProp = True 

Exit_CreateDBStrProp: 
    Set prp = Nothing 
    Set db = Nothing 
    Exit Function 

Err_CreateDBStrProp: 
    CreateDBStrProp = False 
    MsgBox "Error " & Err.Number & " (" & Err.Description & ")" & _ 
    " In procedure CreateDBStrProp" 
    Resume Exit_CreateDBStrProp 
End Function 
+0

링크를 제공해 주셔서 감사합니다. 그러나 이것은 제가 원하는 바가 아닙니다. 만들려는 속성은 입니다. DBEngine (0) (0) .Containers! Databases.Documents! userDefined.Properties, DBEngine (0) (0) .Properties가 아닙니다. 메뉴 파일 -> 데이터베이스 속성 -> 사용자 지정 –

+0

이러한 속성 (... 아래의 사용자 정의)은 볼 수 있습니다. – Fionnuala

+0

메모를 추가했습니다. UserDefined 문서가 존재하지 않는 것, 아니요 속성? –