下面的函数拷贝一个行,然后插入这个拷贝的行,以达到自动添加行的目的。但是,这个函数在运行时,如果用户正在操作其他的Excel那么,就会出现异常,出现异常的原因我想是因为:用户在操作其他book时,下面函数的活动工作簿就变成了用户正在操作的工作簿,而不是程序里面的工作簿。变量定义如下:Private mExlApp       As Excel.Application
Private mExlBook      As Excel.Workbook
Private mExlSheet     As Excel.WorksheetPublic Sub AddExcelBookRow(ByVal lngCopyRow As Long, ByVal lngRowCount As Long)
    Dim lngRow As Long
    mExlApp.DisplayAlerts = False
 
    For lngRow = 1 To lngRowCount
        mExlSheet.Rows(CStr(lngCopyRow) & ":" & CStr(lngCopyRow)).Select
        mExlApp.Selection.Copy
        mExlSheet.Rows(CStr(lngCopyRow + 1) & ":" & CStr(lngCopyRow + 1)).Select
        mExlApp.Selection.Insert Shift:=xlDown
    Next
    Clipboard.Clear
    mExlSheet.Cells(1, 1).Select
End Sub

解决方案 »

  1.   

    不用active 不用 selection 
    用类似下面的
    exwbook.Worksheets(3).Range("A6:A17")
    绝对定位
      

  2.   

    把****.select去掉,你这是copy的宏吧,模拟的手工操作用绝对定位
    mExlSheet.Rows
    换成
    mExlBook.worksheets(3).Rows
    这里的3是sheet的顺序
      

  3.   

    谢谢各位!!!我感觉问题应该出在下面两行代码:... ...
    mExlApp.Selection.Copy
    ... ...
    mExlApp.Selection.Insert Shift:=xlDown
    ... ...
      

  4.   

    把你的sub改成下面的代码试试Public Sub AddExcelBookRow(ByVal lngCopyRow As Long, ByVal lngRowCount As Long)
        Dim lngRow As Long
        Dim bkNm  As String
        Dim stNm As String
        
        bkNm = ActiveWorkbook.Name
        stNm = ActiveSheet.Name
        
        mExlApp.DisplayAlerts = False
     
        For lngRow = 1 To lngRowCount
            Workbooks(bkNm).Sheets(stNm).Rows(CStr(lngCopyRow) & ":" & CStr(lngCopyRow)).Copy
            Workbooks(bkNm).Sheets(stNm).Rows(CStr(lngCopyRow + 1) & ":" & CStr(lngCopyRow + 1)).Insert Shift:=xlDown
        Next
        Clipboard.Clear
        Workbooks(bkNm).Sheets(stNm).Cells(1, 1).Select
    End Sub
      

  5.   

    问题解决了,谢谢各位的帮助!!!
    正如大家所说的那样,用绝对定位的方法,解决了这个问题,同时,因为原来的方法对系统剪贴版有依赖,所以改成了以下方法,不知道这么做有没有不妥的地方。(只列出了关键部分)        mExlSheet.Rows("12:12").Insert Shift:=xlDown
            mExlSheet.Range("A11:S11").AutoFill Destination:=mExlSheet.Range("A11:S12"), Type:=xlFillDefault