.PasteSpecial不适用于Range对象

时间:2016-04-17 13:25:17

标签: excel vba excel-vba

Y helo thar,

实际上我的vba知识非常好,通常我编码没有太多困难,但这让我疯了。

代码非常简单。我有一个工作表PR_DB,其中存储了我的所有项目。对于每个项目,都有许多员工,保存在单元格(sel_pr, >10+)中(员工姓名和ID)。

enter image description here

我想从项目中删除员工并整理项目数据库条目。所有员工都列在两个列表框中。在项目中工作的那些,以及那些没有的。通过按钮,我可以从列表框中添加和删除员工。

enter image description here

当我将员工添加到项目(顶部按钮)时,我的Sub只将ID和名称放在所述项目行的末尾。 当我从项目中删除它们并因此从数据库中删除它时,我会查找包含员工数据的单元格。之后我只想将所有单元格切割到右边并将它们粘贴到左边的一个单元格(通过偏移),这样就删除了删除的名称。

这是我的代码:

Sub delMA_from_prBetList()

    Dim i, j, k, listRow, lastRowMA_DB, lastRowPR_DB, sel_pr As Integer
    Dim wsPR, wsMA_DB, wsPR_DB As Worksheet
    Dim foundMA As Boolean
    Dim cutRng, pasteRng As Range

    Set wsPR = Worksheets("Projekte")
    Set wsMA_DB = Worksheets("MA_DB")
    Set wsPR_DB = Worksheets("PR_DB")
    lastRowPR_DB = wsPR_DB.UsedRange.Rows.Count

    'check if any employee was selected
    If IsNull(wsPR.prBetListe.Value) = True Then
        MsgBox "Please select an employee."
        Exit Sub
    End If
    j = 10


    'look for selected project in DB 
    For i = 2 To lastRowPR_DB
        If wsPR_DB.Cells(i, 1) = CInt(wsPR.prListe.Value) Then
            'row ID of said project
            sel_pr = i
        End If
    Next

    'find employee

    Do Until wsPR_DB.Cells(sel_pr, j) = ""        
        'employees are saved as "ID;NAME"

        If wsPR_DB.Cells(sel_pr, j) = wsPR.prBetListe.Value & ";" & wsPR.prBetListe.Column(1, wsPR.prBetListe.ListIndex) Then
            'when found, look for last cell with an entry
            k = j
            Do Until wsPR_DB.Cells(sel_pr, k) = ""
                k = k + 1
            Loop

               'set cutRng so it spans from cell right to the found employee
               'to last cell with an employee in that project
                Set cutRng = wsPR_DB.Range(wsPR_DB.Cells(sel_pr, j + 1), wsPR_DB.Cells(sel_pr, k))
                'set pasteRng like cutRng, just one cell further to the left
                'so the deleted employee will be overwritten
                Set pasteRng = cutRng.Offset(rowOffset:=0, columnOffset:=-1)
                cutRng.Cut
                pasteRng.PasteSpecial


                Exit Do
        End If

        j = j + 1
    Loop

're-initialize listboxes     
Call init_maListe_dyn
Call init_prBetListe_dyn

End Sub

那么问题是什么?一切正常,我想剪切的所有单元格都会进入剪贴板,但它们并没有粘贴到pasteRng中。错误是 Error 1004 "Application-defined or Object-defined error"。我尝试了很多东西,但解决方案可能很容易找到。

希望你能提前帮助我。

PS:我有点匆忙,因此文本的格式可能不尽如人意。请耐心等待。

2 个答案:

答案 0 :(得分:3)

直接使用:

cutRng.Cut pasteRng

这应该可以解决你的问题;)

答案 1 :(得分:0)

如果要将一列偏移到左侧,则应为

Set pasteRng = cutRng.Offset(,-1)

此外,您还没有定义要粘贴的方式。如果在此实例之前以不同方式设置粘贴设置(通过代码或其他方式),则粘贴设置可能不会设置为粘贴值。如果您只想剪切粘贴值

cutRng.Cut
pasteRng.PasteSpecial xlPasteValues

让我知道这是否有帮助,如果没有,我会进一步研究它。