gpt4 book ai didi

vba - 什么可能导致 Range.Copy 抛出错误?

转载 作者:行者123 更新时间:2023-12-01 18:30:09 25 4
gpt4 key购买 nike

我的 VBA 代码中有以下行:

wks.Rows(lLastRow).Copy

通常情况下它工作得很好。 lLastRow 始终为 11。wks 始终是事件工作表。

但有时上面的行会抛出以下类型的错误:“范围类的复制方法失败”。

然后我必须重新启动 Excel 文件才能使生产线再次开始工作。

您知道是什么原因导致了这个问题吗?什么可能导致 Range.Copy 语句停止工作,然后在文件重新启动后再次开始工作?

编辑:这是我的更多代码。该代码由调用 NewActionButton()

的按钮启动
Sub NewActionButton()
'Dim runState As New cRunState
'Set runState = New cRunState
If bProduction = True Then On Error GoTo ErrHandler

'START
Dim lStart As Long
Dim lId As Long
Dim lDate As Long
Dim lEnd As Long
Dim wks As Worksheet

Set wks = GetSheetByCodename(ThisWorkbook, "wActions")
lStart = 2
lId = 3
lDate = 2
lEnd = 12

Call NewRow(wks, lStart, lId, lDate, lEnd)
'END

On Error GoTo 0
Exit Sub
ErrHandler:
MsgBox ("Ett of" & oe & "rutsett fel har skett.")
End Sub

我遇到错误的过程。第一次失败时,它似乎在 .Insert 语句上抛出错误。然后,如果我再次运行该宏,它会在 .Copy 语句上引发错误。如果我重新启动文档,它就会起作用。

Sub NewRow(wks As Worksheet, lStartCol As Long, lIdCol As Long, lDate As Long, lEndCol As Long)
Dim lLastRow As Long
Dim rConstants As Range
Dim rConstant As Range
Dim rEarlierIds As Range

'Determine last row based on criteria column
lLastRow = LastRow(wks.Columns(lIdCol))

'Copy template row from directly above
wks.Range(wks.Cells(lLastRow, lStartCol), wks.Cells(lLastRow, lEndCol)).Copy

'Insert new row
wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).Insert

'Remove unwanted properties
Set rConstants = wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).SpecialCells(xlCellTypeConstants)
If Not rConstants Is Nothing Then
For Each rConstant In rConstants.Cells
rConstant = ""
Next rConstant
End If

'Add ID
Set rEarlierIds = wks.Columns(lIdCol)
wks.Cells(lLastRow + 1, lIdCol) = Evaluate("Max(" & rEarlierIds.Address & ")+1")

'Add Date
wks.Cells(lLastRow + 1, lDate) = Date

'Remove copy marking
Application.CutCopyMode = False
End Sub

EDIT2:.Insert 语句确实插入了一个新范围。然而,尽管如此,执行仍然停止,并且我收到错误消息“Range 类的插入方法失败。因此该行完成了工作,但我收到错误并且执行停止。

EDIT3:我不知道出了什么问题,但我发现了一种模式。如果我在打开 Excel 文件后立即执行宏,则 .Insert 语句有效。我可以执行任意多次。但是,一旦我双击一个单元格,然后单击 ESC 离开该单元格,然后再次尝试运行宏,则 .Insert 语句会引发错误。这对我来说毫无意义。

EDIT4:我已将上面的代码更新为当前的外观。

EDIT5:下面的代码可以完美运行。我改变的是我不再复制然后插入。相反,我首先插入一个新行,然后复制到其中。我仍然不知道为什么我以前的代码不起作用。我希望有人有一个想法或可以确认我偶然发现了一个错误,并且可以说明是什么情况导致了该错误。

Sub NewRow(wks As Worksheet, lStartCol As Long, lIdCol As Long, lDate As Long, lEndCol As Long)
Dim lLastRow As Long
Dim rConstants As Range
Dim rConstant As Range
Dim rEarlierIds As Range

'Determine last row based on criteria column
lLastRow = LastRow(wks.Columns(lIdCol))

'Insert new row
wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).Insert

'Copy template row from directly above
wks.Range(wks.Cells(lLastRow, lStartCol), wks.Cells(lLastRow, lEndCol)).Copy

'Paste formulas row
wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).PasteSpecial xlPasteFormulas

'Remove values
Set rConstants = wks.Range(wks.Cells(lLastRow + 1, lStartCol), wks.Cells(lLastRow + 1, lEndCol)).SpecialCells(xlCellTypeConstants)
If Not rConstants Is Nothing Then
For Each rConstant In rConstants.Cells
rConstant = ""
Next rConstant
End If

'Add ID
Set rEarlierIds = wks.Columns(lIdCol)
wks.Cells(lLastRow + 1, lIdCol) = Evaluate("Max(" & rEarlierIds.Address & ")+1")

'Add Date
wks.Cells(lLastRow + 1, lDate) = Date

'Remove copy marking
Application.CutCopyMode = False
End Sub

最佳答案

这可能与 VB 命令通常对应于 Excel 在其自己的界面中执行的命令有关。大多数时候,这不会引起任何问题 - 实际上这就是宏录制起作用的原因(即使它不能很好地工作)。不过,偶尔你也会遇到一些怪癖。这听起来像其中之一(涉及复制/粘贴的其他操作之一通常是工作簿层上的任何交互,除了粘贴命令之外,当最终调用粘贴时,将导致 InvalidOperation 异常)。

在这种情况下,我建议复制一些单元格,然后右键单击任何列或行。您会注意到插入选项已完全消除 - 只有“插入复制的单元格”选项。只要工作表处于 CutCopyMode 状态,这一点就保持不变;当它出来时,插入选项返回。我的猜测是

  • 您的代码在禁止操作时尝试插入(而不是插入复制的单元格),或者
  • 当您的代码尝试插入的范围仅准备好插入一些空白单元格时,您的代码会尝试插入复制的单元格。

不过,为了确定这一点,您可能必须反编译这两种方法,这超出了我的能力范围。不过,很高兴听到您提出了解决方案。

关于vba - 什么可能导致 Range.Copy 抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27379310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com