You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Access遍历附件文件名生成变更记录的VBA报错解决

解决MS Access VBA运行时错误451的方案

错误原因分析

  • 循环范围越界:AttachmentCount返回附件总数,附件索引从0开始,原代码For i = 0 To Count会访问不存在的索引(最后一次循环i等于Count,超出最大索引Count-1)。
  • 控件引用错误:原代码Forms!Attachments!SF_AttachmentsList!FileName(i)的写法不符合Access子窗体控件的引用规则,且未正确调用列表控件的索引访问方式,导致无法获取对象属性。

修正方案一:直接通过附件控件的Attachments集合获取文件名(推荐)

无需依赖子窗体,直接从主窗体的附件控件遍历附件集合,代码更稳定:

Private Sub BtnEditSOW_Click()
    Dim i As Long
    Dim varChanges As String
    Dim Count As Integer
    Dim strFileName As String
    
    ' 获取附件总数
    Count = Me.Attachments.AttachmentCount
    
    ' 遍历所有附件(索引从0到Count-1)
    For i = 0 To Count - 1
        ' 直接从附件控件的Attachments集合获取文件名
        strFileName = Me.Attachments.Attachments(i).FileName & ": [Note changes to this attachment here. Put 'No Changes' if none. Or delete this line if not applicable.]"
        ' 拼接结果,避免开头空行
        If varChanges = "" Then
            varChanges = strFileName
        Else
            varChanges = varChanges & Chr(13) & Chr(10) & strFileName
        End If
    Next i
    
    ' 将结果写入绑定控件
    Me.RecordOfChanges = varChanges
End Sub

修正方案二:正确引用子窗体的列表控件

如果必须通过子窗体的文件名列表控件获取数据,需修正控件引用方式:

Private Sub BtnEditSOW_Click()
    Dim i As Long
    Dim varChanges As String
    Dim Count As Integer
    Dim strFileName As String
    
    ' 获取子窗体列表控件的行数
    Count = Me.SF_AttachmentsList.Form.FileName.ListCount
    
    ' 遍历列表项(索引从0到Count-1)
    For i = 0 To Count - 1
        ' 正确引用子窗体的列表控件项
        strFileName = Me.SF_AttachmentsList.Form.FileName.List(i) & ": [Note changes to this attachment here. Put 'No Changes' if none. Or delete this line if not applicable.]"
        ' 拼接结果,避免开头空行
        If varChanges = "" Then
            varChanges = strFileName
        Else
            varChanges = varChanges & Chr(13) & Chr(10) & strFileName
        End If
    Next i
    
    ' 将结果写入绑定控件
    Me.RecordOfChanges = varChanges
End Sub

关键修正点说明

  • 循环范围调整为0 To Count - 1,确保不越界访问。
  • 附件控件引用:Me.Attachments.Attachments(i).FileName直接访问附件集合的FileName属性,无需依赖子窗体。
  • 子窗体引用:使用Me.SF_AttachmentsList.Form.控件名的格式访问子窗体上的控件,列表控件通过List(i)获取指定索引的项。

内容的提问来源于stack exchange,提问作者Dan Kirchner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:25:49