我目前正在处理的VBA项目存在问题,特别是运行时错误,并带有一段代码,该代码在表底部查找下一个空单元格并将存储的字符串写入该范围
现在-对该项目的简要说明。我在Excel工作表中有一张表格,其中记录了我工作的公司可能会提出的每项预期工作。为此,我有一个前端,该前端具有用于创建/查看新“作业”或“机会”的控件,并且在此处运行的代码对信息进行了某种意义上的检查,在网络驱动器上为联系人创建了标准化的文件夹结构和合同信息,并为该工作生成一个唯一的ID,然后将其用于我们的CRM和通讯
我运行的代码似乎第一次没有问题(ADD NEW JOB)->(CREATE),但是在第二次运行时崩溃,它将抛出运行时错误'-2147417848(80010108)':方法'Value对象“ Range”的“”失败。在行:
r.Value = pFix
和Excel(在Windows 10上为2016)将崩溃并重新启动
编辑:我相信这可能是因为r
第二轮运行时未正确存储-或第一轮之后未从内存中正确清除。但是我已经尝试过了Set r = Nothing
,在这里我读到的内容仍然表明这不应该成为问题
此代码来自UserForm frmNewJob(屏幕抓取中显示的输入表单)上的Button_Click事件
Private Sub CommandButton1_Click()
Dim pFix As String
Dim sNew As Long
Dim jNumber As String
Dim jName As String
Dim jIndex As String
Dim jClient As String
Dim jSite As String
Dim jComments As String
Dim cName As String
Dim createdDate As Date
Dim r As Range
Dim hLink As String
Dim hLink2 As String
Dim wDir As String
Dim msg As String
Dim ans As String
Set r = Nothing
wDir = ActiveWorkbook.Path
If TextBox1.Value = "" Then
Call MsgBox("Please enter a valid Requester Name", vbCritical)
Exit Sub
Else
If TextBox2.Value = "" Then
Call MsgBox("Please enter a valid Client Name", vbCritical)
Exit Sub
Else
If TextBox3.Value = "" Then
Call MsgBox("Please enter a valid Site Description", vbCritical)
Exit Sub
Else
End If
End If
End If
pFix = "GSM"
sNew = WorksheetFunction.Max(Columns(2)) + 1
jNumber = pFix & sNew
jClient = TextBox2.Value
jIndex = Left(jClient, 1)
jSite = TextBox3.Value
jName = jClient & " - " & jSite
jComments = TextBox4.Value
cName = TextBox1.Value
createdDate = Now
Set r = Sheet1.Range("A" & Rows.Count).End(xlUp).Offset(1)
r.Value = pFix
r.Offset(0, 1) = sNew
r.Offset(0, 2) = jNumber
r.Offset(0, 3) = jName
r.Offset(0, 4) = jComments
r.Offset(0, 5) = createdDate
r.Offset(0, 6) = cName
Call MsgBox("New Job Number is: " & jNumber, vbOKOnly)
On Error Resume Next
hLink = wDir & "\" & jIndex
MkDir hLink
hLink = hLink & "\" & jNumber & " - " & jName
MkDir hLink
hLink2 = hLink & "\" & "1. Tender Documents"
MkDir hLink2
hLink2 = hLink & "\" & "2. Clarifications and Addendums"
MkDir hLink2
hLink2 = hLink & "\" & "3. Client Correspondence and MoU's"
MkDir hLink2
hLink2 = hLink & "\" & "4. Technical Queries"
MkDir hLink2
hLink2 = hLink & "\" & "5. Document Register"
MkDir hLink2
hLink2 = hLink & "\" & "6. Subcontractor and Material Pricing"
MkDir hLink2
hLink2 = hLink & "\" & "7. Estimate"
MkDir hLink2
hLink2 = hLink & "\" & "8. Photos"
MkDir hLink2
hLink2 = hLink & "\" & "9. Tender Submission"
MkDir hLink2
hLink2 = hLink & "\" & "10. Drawings"
MkDir hLink2
hLink2 = hLink & "\" & "11. Post Tender Correspondence"
MkDir hLink2
Unload Me
'Call filterByJobNumber
Call copyTable
msg = "Would you like to open the newly created directory?"
ans = MsgBox(msg, vbYesNo, "Open Directory?")
If ans = vbYes Then
Shell "explorer """ & hLink & "", vbNormalFocus
Else
End If
End Sub
它使Excel崩溃而不仅仅是中断并让我调试的事实是让我感到困惑的事实-它不会失败会在第一次运行但在第二次崩溃会崩溃
编辑:我将其范围缩小到了一行r.Value = pFix
,这是将存储的pFix字符串写入新范围的点r
。msgbox(pFix)
在此行之前弹出,表明pFix
存储了正确的字符串,因此错误必须在范围内
也许有些新鲜的眼睛会发现我忽略的错误-了解原因会阻止以后再发生
编辑2:
我进行了进一步的测试,当将值写入range时,问题肯定在代码运行的第二个实例上发生r
。我创建了一个小测试来强制崩溃,在下面的代码中Excel将锁定并在第二个循环中退出-仅当r
每次连续运行之间的更改地址(行数增加)和创建的新行位于表格的底部(Excel会自动将此新行添加到表格范围)。有人可以运行代码并确认他们是否存在相同的问题吗?
Sub testMacro()
Dim r As Range
Dim str As String
str = "TEST"
i = 1
Do Until i = 5
Set r = Sheet1.Range("A" & Rows.Count).End(xlUp).Offset(1)
Call MsgBox(r.Address, vbOKOnly, "Range address for 'r' is")
r = str
i = i + 1
Loop
End Sub
我尝试卸载/重新安装和修复Office 2016安装作为一项附加措施,但没有帮助。如果Windows 10不可在其他地方重复使用,那可能是一个怪癖吗?
回答为“社区Wiki”,从未回答的问题列表中删除,并且在我不更改代码的情况下就已将其解决。
看来Office 2016 / Excel 2016安装存在一些潜在问题。在进一步的测试中,我确实产生了VBA“内存不足”错误,但是在这种特殊情况下,对代码的更改似乎没有产生任何积极影响。
再次删除,重新启动和重新安装Office(第2次)似乎已解决了该问题,而无需对工作簿进行任何其他更改,并且原始Sub在运行时不会产生错误
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句