1

我正在尝试使用这些函数来管理附件表,而不使用 Access 接口,因此人们无法删除或破坏内容,但是,每当我尝试调用这些函数中的任何一个时,我都会收到 Argument not Optional 编译器错误。

http://blogs.office.com/b/microsoft-access/archive/2007/08/24/adding-removing-and-saving-files-from-the-new-attachment-field-in-access-2007。 aspx

在我拥有的按钮的 onclick 事件中

Database.OpenRecordset tblAttach
Recordset.AddNew
Call AddAttachment
Recordset.Update

我遇到的另一个问题是此代码仅用于从直接路径导入,我确实需要文件选择的文件对话框方法,但我不知道该放什么

Dim f As Object
Set f = Application.FileDialog(3)
f.AllowMultiSelect = False
'*** not sure how to get the path to f to insert it into the table
f.Show
4

2 回答 2

8

您的第一个问题来自您没有仔细阅读您提到的链接中的代码。子程序定义为
AddAttachment

AddAttachment(ByRef rstCurrent As DAO.Recordset, _
              ByVal strFieldName As String, _
              ByVal strFilePath As String)

这意味着它有 3 个强制参数:

  • rstCurrent要存储文件的表的打开记录集。该文件将被添加到记录集当前记录中。

  • strFiledName将保存文件的附件字段的名称。您tblAttach在 Access 中创建的表格必须至少有一个附件字段(可能还有其他字段以及与附件相关的信息,以便您可以找到它,例如文档名称和 ID,可能是文档的原始路径等)。

  • strFilePath要附加的文件所在的绝对路径。

您的第二个问题是让用户通过文件对话框选择他们想要的文件:

Public Function SelectFile() As String
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogOpen)
    With fd
        .AllowMultiSelect = False
        .Title = "Please select file to attach"
        If .show = True Then
            SelectFile = .SelectedItems(1)
        Else
            Exit Function
        End If
    End With
    Set fd = Nothing
End Function

调用这个函数SelectFile()让用户选择一个文件。如果操作被取消或未选择文件,该函数将返回文件的完整路径或空字符串。

为了让用户在保存附件时选择文件的名称和位置,代码类似:

Public Function SelectSaveAs(initialName As String) As String
    Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogSaveAs)
    With fd
        .Title = "Save Attachment"
        .InitialFileName = initialName
        If .show = True Then
            SelectSaveAs = .SelectedItems(1)
        Else
            Exit Function
        End If
    End With
End Function

例如,打电话SelectSaveAs("toto.xls")给附件建议一个名称,让用户选择他们将保存它的位置(他们也可以更改名称)。该函数将返回保存附件的文件的完整路径。

现在,您可以将所有内容放在一起。

假设您创建了一个tblAttach其中包含一个Files字段的字段。
我们可以在您提到的链接中重写测试:

    Dim dbs As DAO.database
    Dim rst As DAO.RecordSet

    ' Ask the user for the file
    Dim filepath As String
    filepath = SelectFile()

    ' Check that the user selected something
    If Len(filepath) = 0 Then
        Debug.Assert "No file selected!"
        Exit Sub
    End If

    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("tblAttach")

    ' Add a new row and an attachment
    rst.AddNew
    AddAttachment rst, "Files", filepath
    rst.Update

    ' Close the recordset
    rst.Close
    Set rst = Nothing
    Set dbs = Nothing

要让用户保存文件,您可以执行类似的操作:打开记录集,移动到包含您要保存的文件的记录,询问用户文件名,然后将所有这些信息传递给SaveAttachment子例程。

于 2013-08-15T11:35:40.853 回答
0
'----- code to browse, select file and attach to access table
'----- Thanks a lot for earlier submissions, I have just put together all related codes
'----- the code is to add attachments to the attachment field in Ms Access Table. If you don't want to bring up built in form, you can use this code to browse the file and attach
'------ please add this code as Module in Ms Access.  
'------ being a public function, you call this code from any form just by adding 4 parameters  for example  Table name is EmpMaster, Attachment field name is Empcertificate, name of the ID field is EmpID, record ID number say 101
'----- Add_Attachment "EmpMaster", "Empcertificate", "EmpID", 101
'---- it works for me

Option Compare Database
Public Function Add_Attachment(strTableName, 
strAttachField, strIDfield As String, i As Long)

'------------ code to browse file and select file to attach
    Dim fd As FileDialog
    Dim oFD As Variant
    Dim strFileName As String

    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .ButtonName = "Select"
        .AllowMultiSelect = False
        .Title = "Choose File"
        .InitialView = msoFileDialogViewDetails
        .Show

        For Each oFD In .SelectedItems
            strFileName = oFD
        Next oFD
        On Error GoTo 0
    End With

    Set fd = Nothing

'------------ from here code for file attachment process

    Dim cdb As DAO.Database, rstMain As DAO.Recordset, rstAttach As DAO.Recordset2, _
        fldAttach As DAO.Field2
    Set cdb = CurrentDb
    Set rstMain = cdb.OpenRecordset("SELECT " & strAttachField & " FROM " & strTableName & " where " & strIDfield & "= " & i, dbOpenDynaset)

    rstMain.Edit
   Set rstAttach = rstMain(strAttachField).Value
    rstAttach.AddNew

    Set fldAttach = rstAttach.Fields("FileData")

    fldAttach.LoadFromFile strFileName
    rstAttach.Update
    rstAttach.Close
    Set rstAttach = Nothing
    rstMain.Update
    rstMain.MoveNext
rstMain.Close
Set rstMain = Nothing
Set cdb = Nothing
End Function
于 2018-07-13T18:09:09.607 回答