.Paste在'If'部分声明中有效,但不是'Else'

时间:2015-10-28 21:35:08

标签: excel vba excel-vba

我正在自动化从工作表导入数据的过程,但为了数据完整性(并最终附加到数据库),我不希望标识符输入两次。如果标识符(SHC_No)不在A列中,我的代码可以导入数据,并提示您是否因为某些内容发生了更改而要替换这些条目。它将删除条目,并找到下一个空白行,但.paste函数将无法运行。 (即使它在我要粘贴的单元格上,我可以在剪贴板中看到数据。)

我遇到了运行时错误1004“工作表类的粘贴方法失败”和“Range类的PasteSpecial方法失败”,以及438“对象不支持此属性或方法。”

我对Excel VBA比较陌生。我尝试了.paste和.pastespecial的不同变体,似乎没有任何效果。我尝试过With语句,并定义了范围。我很茫然。

任何想法或建议,将不胜感激。

Sub ImportAPDR()

Dim wbImport As Workbook
Dim wbCurrent As Workbook
Dim strSHC As String

Set wbImport = Workbooks("ImportPhase2.xlsm") 'Ensure name of the workbook... and don't change it.
Set wbCurrent = ActiveWorkbook

'On Error GoTo Handler:
Application.ScreenUpdating = False 'Prevents flickering screen.

'Activate Page 3 of the APDR

Worksheets("Page 3").Activate

strSHC = Range("A11").Value

Range("A11").Activate

Do

    If ActiveCell.Value = "" Then Exit Do
    ActiveCell.Offset(1, 0).Activate

Loop

'Selects All data from A11 until the EOR
ActiveCell.Offset(-1, 12).Activate
Range("A11", ActiveCell).Select

Selection.Copy

'Find the first blank cell in the Import workbook.

wbImport.Activate
Worksheets("Import").Activate

FindSHC (strSHC) 'Must send a variable or the other subroutine will not work.
Application.ScreenUpdating = True

Exit Sub

'Handler:
'MsgBox ("Ensure to run the macro on the APDR workbook, not the import workbook.")

End Sub

Sub FindSHC(strSHC As String)

    Dim foundSHC As String
    Dim Rng As Range
    Dim StartRange As Range
    Dim PasteRng As Range

    FindString = strSHC
    If Trim(strSHC) <> "" Then
        With Sheets("Import").Range("A:A")
            Set Rng = .Find(What:=FindString, _
                            After:=.Cells(.Cells.Count), _
                            LookIn:=xlValues, _
                            LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlNext, _
                            MatchCase:=False)
            If Rng Is Nothing Then
                Range("A1").Activate
                Do
                    If ActiveCell.Value = "" Then Exit Do
                    ActiveCell.Offset(1, 0).Activate
                Loop
                ActiveSheet.Paste
                Application.CutCopyMode = False
                MsgBox ("The Tenant/Unit Details have been copied for import.")
            Else
                Application.Goto Rng, True
                Set StartRange = ActiveCell
                Answer = MsgBox("This APDR looks like it has already been imported." & vbNewLine & "Do you want to reimport and replace?", vbYesNo)
                If Answer = vbYes Then
                    'Finds the values that have previously been entered and loops to select them all for deletion.
                    Do

                        If ActiveCell.Value <> strSHC Then Exit Do
                        ActiveCell.Offset(1, 0).Activate

                    Loop

                    ActiveCell.Offset(-1, 0).Activate
                    Range(StartRange, ActiveCell).Select
                    Selection.EntireRow.Delete Shift:=xlUp

                    'Find the next open row
                    Range("A1").Activate

                    Do

                        If ActiveCell.Value = "" Then Exit Do
                        ActiveCell.Offset(1, 0).Activate

                    Loop

                    ActiveSheet.Paste    '<-----This is where I get my error.
                    Application.CutCopyMode = False
                    MsgBox ("The Tenant/Unit Details have been replaced.")
                Else
                    Application.CutCopyMode = False
                    MsgBox ("Import has been cancelled.")
                End If
            End If
        End With
    End If

End Sub    

1 个答案:

答案 0 :(得分:0)

以下是一些避免陷入困境的提示。

  1. 始终尝试通过手动执行所有操作来模拟宏所做的事情,只要有可能。在您的情况下,您可以为QA选择2个标识符 - 一个不存在,另一个存在。你不会遇到第一个问题,但是第二个问题 - 在你复制了一些范围后删除任何单元格内容时,你的选择和复制的范围将从剪贴板中丢失。而这实际上是造成麻烦的原因。

  2. 进行适当的调试。一旦你进入奇怪的异常 - 调试什么带来你的代码到这一点。再次 - 在你的情况下,你可以看到,一旦你删除内容&#34;虚线边框&#34;复制范围周围将消失,这意味着您不再复制可以粘贴的范围。

  3. 这个直接进入复制粘贴组合。每当您需要使用Copy&amp;粘贴构建您的代码,以便这两个代码一个接一个地进行。避免这两个函数之间的任何范围交互。如果您需要进行一些计算,只需将范围参数(如范围矩形尺寸,起始行+列,结束行+列)保存到其他变量,并仅在使用这些保存参数完成所有操作时复制。

  4. 祝你好运。