0

最近、2007 Access ファイルを 2010 に変換 (エクスポート/インポート) しました。1 つのフォームを除いて、すべて正常に動作します。エラーが発生し続けます:

コンパイル エラー: ユーザー定義型が定義されていません

「Microsoft ActiveX Data Objects 2.8」を参照に追加しようとしましたが、問題は解決しません。 Sub ClearTreeView(tvwTree As TreeView)アクセスが問題として強調したものです。

Option Compare Database
Option Explicit

' Clears all nodes on a treeview control
Sub ClearTreeView(tvwTree As TreeView) 'what Access highlighted as the issue
    On Error GoTo EH
    tvwTree.Nodes.Clear
    Exit Sub
EH:
    MsgBox "Error " & Err.Number & ": " & Err.Description
End Sub

' Calls functions to clear and populate a treeview control
' Parameters:
'       strForm         Name of the form
'       strTV           TreeView control name
'       strSourceName   Name of the table or query containing the data used to populate the treeview
'       strChildField   ID field for the child records
'       strParentField  Parent ID Field
'       strTextField    Field containing text that will be used as node labels
'
Sub FillTreeView(tvwTree As Object, strSourceName As String, strChildField As String, strParentField As String, strTextField As String)
    Dim strSQL As String
    Dim rs As DAO.Recordset
    
    On Error GoTo EH
    
    ' Open the recordset using table and fields specified in Sub parameters
    strSQL = "SELECT " & strChildField & ", " & strParentField & ", " & strTextField & " FROM " & strSourceName
    Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
    
    ' Clear any existing data out of the treeview
    ClearTreeView tvwTree
    
    ' Call recursive function to fill in treeview
    AddTreeData tvwTree, rs, strChildField, strParentField, strTextField
    
    ' Close the recordset
    rs.Close
    Set rs = Nothing
    Exit Sub
EH:
    MsgBox "Error " & Err.Number & ": " & Err.Description
End Sub


' Recursive function to populate a treeview control
' Parameters:
'       strFormName     Name of the form
'       strTreeViewName TreeView control name
'       rs              Recordset containing the data used to populate the treeview
'       strChildField   ID field for the child records
'       strParentField  Parent ID Field
'       strTextField    Field containing text that will be used as node labels
'       varParentID     Optional parameter that only gets passed for recursive calls to this function.  Specifies the ID of the current record to be used as a
'                       ParentID when searching the recordset for "grand-children", etc.
Sub AddTreeData(objTV As TreeView, rs As DAO.Recordset, strChildField As String, strParentField As String, strTextField As String, Optional varParentID As Variant)
    Dim nodChild As Node
    Dim nodParent As Node
    Dim strLabel As String
    Dim strNodeID As String
    Dim strCriteria As String
    Dim strBookmark As String
    
    On Error GoTo EH
    
    ' Test for a circular reference
    If rs(strChildField) = rs(strParentField) Then GoTo EH_CircularReference
    
    ' If the optional parameter is missing, then this is the first(non-recursive) call to this function.
    ' Set the critieria to look for a parent id of 0.
    If IsMissing(varParentID) Then
        strCriteria = strParentField & " = 0 "
    Else
        ' Otherwise, extract the childID portion of the node ID, which was passed as an optional parameter.
        strCriteria = strParentField & " = " & Mid(varParentID, InStr(1, varParentID, "C") + 1)
        ' Define the parent node
        Set nodParent = objTV.Nodes("node" & varParentID)
    End If
    
    ' Look for records having the specified "parent"
    rs.FindFirst strCriteria
    Do Until rs.NoMatch
        ' Read node caption from the text field
        strLabel = rs(strTextField)
        ' Create a new node ID in the format ParentID &"C" & ChildID (eg: 4C12)
        strNodeID = "node" & rs(strParentField) & "C" & rs(strChildField)
        
        ' If optional parameter is missing (first call to this function)...
        If Not IsMissing(varParentID) Then
            'add new node to the next higher node for this record
            Set nodChild = objTV.Nodes.Add(nodParent, tvwChild, strNodeID, strLabel)
        Else
            ' Otherwise, add new node to the top level of the tree
            Set nodChild = objTV.Nodes.Add(, , strNodeID, strLabel)
        End If
        
        ' Bookmark our place in the recordset so that we can resume the search from the same point after the recursive call to this function.
        strBookmark = rs.Bookmark
        
        ' call this function recursively for "children"
        AddTreeData objTV, rs, strChildField, strParentField, strTextField, rs(strParentField) & "C" & rs(strChildField)
        
        ' Return to bookmared place in the recordset
        rs.Bookmark = strBookmark
        
        ' Find the next record having the same parentID
        rs.FindNext strCriteria
    Loop
    
    Exit Sub
    
EH_CircularReference:
    MsgBox "Exiting because of a circular reference in which a child record was determined to be it's own parent."
    Exit Sub

    
EH:
    MsgBox "Error " & Err.Number & ": " & Err.Description
End Sub
4

1 に答える 1

3

Excel のユーザー フォームの 1 つで同じエラーを受け取りました。

新しい 2010 Office パッケージが 64 ビットの場合、2007 バージョンで使用されていた以前の 32 ビット ActiveX コントロールは互換性がありません。

次のリンクを参照してください: http://msdn.microsoft.com/en-us/library/ee691831(office.14).aspx#odc_office2010_Compatibility32bit64bit_ActiveXControlCOMAddinCompatibility

フォームをデザイン ビューで開こうとしたときに TreeView コントロールがフォームに存在しない場合は、これが問題である可能性があります。

64 ビット バージョンがインストールされているかどうかを確認するには、[Access] -> [ファイル] -> [ヘルプ] -> を開き、右側の [Microsoft Access について] の下を見てください。括弧内に 32 ビットまたは 64 ビットと表示されているはずです。

リンクが説明しているように、互換性のない機能を置き換える必要があるため、新しいコントロールを使用する必要があります。

考えられる解決策:

デザイン ビューでフォームを開き、リボン タブのコントロール グループの下向き矢印を選択すると、「ActiveX コントロール」という名前のオプションが表示されます (選択するには、デザイン ビューにいる必要があります)。

ここで「CTreeView」コントロールを検索し、従来の Microsoft TreeView コントロール (64 ビット アクセスには表示されません) の代わりにそれを使用してみてください。

32 ビット オフィスがインストールされている場合、投稿された内容に問題があるかどうかはわかりませんが、問題があると思われます。

よろしくお願いします、

于 2013-10-18T16:25:10.720 に答える