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
相关产品推荐
相关产品推荐

