Files
ProductionCycleCheck/VBA/Modules/模块4.bas
Misaka_Company c0f8d8163d Update VBA modules and test formatting
- Fix test result indicators encoding (use ?? instead of Unicode symbols)
- Add missing newlines at end of files
- Add new VBA module files for main functionality

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 10:20:00 +08:00

106 lines
4.9 KiB
QBasic
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'=============================================================================
' 临时排查脚本:精准定位 OLE DB 多步操作错误 (-2147217887)
'=============================================================================
Sub DebugOleDbError()
Dim ws As Worksheet
Dim r As Long, testRow As Long
Dim conn As Object, rs As Object
Dim dbPath As String, connStr As String, strSQL As String
Dim pcNo As String, seqNo As String
Dim fName As String
Dim valToVerify As Variant
dbPath = "\\192.168.110.114\生产进度表\2026年数据\执行卡下发记录.accdb"
connStr = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & dbPath & ";Uid=Admin;Pwd=;"
Set ws = ThisWorkbook.Worksheets("货期检查")
' 找到第一条填写了【修正交货日期】的数据进行测试
For r = 4 To ws.Cells(ws.Rows.count, 1).End(xlUp).Row
If Trim(CStr(ws.Cells(r, 10).Value)) <> "" Then
testRow = r
Exit For
End If
Next r
If testRow = 0 Then
MsgBox "没有找到填写了【修正交货日期】的数据,无法测试!", vbExclamation
Exit Sub
End If
Set conn = CreateObject("ADODB.Connection")
conn.Open connStr
pcNo = Replace(Trim(CStr(ws.Cells(testRow, 1).Value)), "'", "''")
seqNo = Trim(CStr(ws.Cells(testRow, 2).Value))
strSQL = "SELECT * FROM 货期修改记录 WHERE [排产号]='" & pcNo & "' AND [序号]=" & seqNo
Set rs = CreateObject("ADODB.Recordset")
rs.Open strSQL, conn, 1, 3
If rs.EOF Then rs.AddNew
' ==========================================
' 开始逐个字段缓慢写入,开启错误捕捉
' ==========================================
On Error GoTo CatchErr
If rs.EOF Then
fName = "排产号": valToVerify = ws.Cells(testRow, 1).Value: rs.Fields(fName).Value = valToVerify
fName = "序号": valToVerify = ws.Cells(testRow, 2).Value: rs.Fields(fName).Value = valToVerify
End If
fName = "产品名称": valToVerify = ws.Cells(testRow, 3).Value: rs.Fields(fName).Value = valToVerify
fName = "规格": valToVerify = ws.Cells(testRow, 4).Value: rs.Fields(fName).Value = valToVerify
fName = "型号": valToVerify = ws.Cells(testRow, 5).Value: rs.Fields(fName).Value = valToVerify
fName = "业务员": valToVerify = ws.Cells(testRow, 6).Value: rs.Fields(fName).Value = valToVerify
fName = "数量"
If IsNumeric(ws.Cells(testRow, 7).Value) And Not IsEmpty(ws.Cells(testRow, 7).Value) Then
valToVerify = ws.Cells(testRow, 7).Value
Else
valToVerify = 0
End If
rs.Fields(fName).Value = valToVerify
fName = "签订日期": If IsDate(ws.Cells(testRow, 8).Value) Then valToVerify = CDate(ws.Cells(testRow, 8).Value): rs.Fields(fName).Value = valToVerify
fName = "交货日期": If IsDate(ws.Cells(testRow, 9).Value) Then valToVerify = CDate(ws.Cells(testRow, 9).Value): rs.Fields(fName).Value = valToVerify
fName = "修正交货日期": If IsDate(ws.Cells(testRow, 10).Value) Then valToVerify = CDate(ws.Cells(testRow, 10).Value): rs.Fields(fName).Value = valToVerify
fName = "产品分类": valToVerify = ws.Cells(testRow, 11).Value: rs.Fields(fName).Value = valToVerify
fName = "BIP货期": If IsNumeric(ws.Cells(testRow, 12).Value) Then valToVerify = ws.Cells(testRow, 12).Value: rs.Fields(fName).Value = valToVerify
fName = "BIP货期_工作日": If IsNumeric(ws.Cells(testRow, 13).Value) Then valToVerify = ws.Cells(testRow, 13).Value: rs.Fields(fName).Value = valToVerify
fName = "工厂货期_工作日": If IsNumeric(ws.Cells(testRow, 14).Value) Then valToVerify = ws.Cells(testRow, 14).Value: rs.Fields(fName).Value = valToVerify
fName = "添加记录的时间"
valToVerify = Now: rs.Fields(fName).Value = valToVerify
' 最后一步提交
fName = "提交更新 (rs.Update)"
valToVerify = "无(最后提交环节)"
rs.Update
MsgBox "测试通过!说明第一条数据没问题。可能是后面的某一行数据触发了报错,我们可以进一步排查。"
rs.Close
conn.Close
Exit Sub
CatchErr:
Dim errMsg As String
errMsg = Err.Description
' 安全清理
On Error Resume Next
rs.CancelUpdate
rs.Close
conn.Close
MsgBox "?? 抓到导致 OLE DB 错误的内鬼了!" & vbCrLf & vbCrLf & _
"错误发生在处理字段:【" & fName & "】" & vbCrLf & _
"试图写入的值为:[" & CStr(valToVerify) & "]" & vbCrLf & vbCrLf & _
"?? 常见原因分析:" & vbCrLf & _
"1. 超长:这串内容是不是太长了?(超过了Access中该字段的长度限制)" & vbCrLf & _
"2. 空值拒绝:如果写入的值是空[]检查Access中该字段是否设置了【必填=是】或【允许空字符串=否】。" & vbCrLf & _
"3. 如果错误发生在【提交更新】阶段,说明有必填字段被漏掉了!" & vbCrLf & vbCrLf & _
"系统报错: " & errMsg, vbCritical
End Sub