Vba .PasteSpecial不适用于范围对象
Y helo thar 事实上,我的vba知识相当好,通常我在编码方面没有太多困难,但这让我发疯 代码非常简单。我有一个工作表Vba .PasteSpecial不适用于范围对象,vba,excel,Vba,Excel,Y helo thar 事实上,我的vba知识相当好,通常我在编码方面没有太多困难,但这让我发疯 代码非常简单。我有一个工作表PR_DB,其中存储了我的所有项目。每个项目都有许多员工,保存在单元格(sel_pr,>10+)(员工姓名和ID)中 我想从项目中删除一名员工,并整理项目数据库条目。所有员工都列在两个列表框中。那些在项目中工作的和那些没有工作的。通过按钮,我可以从任一列表框中添加和删除员工 当我将员工添加到项目(顶部按钮)时,我的Sub仅将ID和姓名放在所述项目行的末尾。 当我将它们
PR_DB
,其中存储了我的所有项目。每个项目都有许多员工,保存在单元格(sel_pr,>10+)
(员工姓名和ID)中
我想从项目中删除一名员工,并整理项目数据库条目。所有员工都列在两个列表框中。那些在项目中工作的和那些没有工作的。通过按钮,我可以从任一列表框中添加和删除员工
当我将员工添加到项目(顶部按钮)时,我的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
。错误是
错误1004“应用程序定义或对象定义错误”
。我尝试了一千种方法,但解决方法可能太容易了
希望你能帮助我,提前谢谢
PS:我有点赶时间,所以文本的格式可能不如它可能的好。请耐心等待。如果您想将一列偏移到左侧
Set pasteRng = cutRng.Offset(,-1)
此外,您没有定义要粘贴的方式。如果粘贴设置在此实例之前的设置不同(通过代码或其他方式),则不能将粘贴设置设置为粘贴值。如果您只想剪切粘贴这些值,那么
cutRng.Cut
pasteRng.PasteSpecial xlPasteValues
让我知道这是否有帮助,如果没有,我会进一步调查 如果要将一列偏移到左侧,则应
Set pasteRng = cutRng.Offset(,-1)
此外,您没有定义要粘贴的方式。如果粘贴设置在此实例之前的设置不同(通过代码或其他方式),则不能将粘贴设置设置为粘贴值。如果您只想剪切粘贴这些值,那么
cutRng.Cut
pasteRng.PasteSpecial xlPasteValues
让我知道这是否有帮助,如果没有,我会进一步调查 直接使用即可:
cutRng.Cut pasteRng
这应该可以解决您的问题;) 直接使用即可:
cutRng.Cut pasteRng
这应该可以解决您的问题;) 天哪。。非常感谢。但是我仍然不明白,为什么.PasteSpecial不起作用。因为
Application.CutCopyMode
需要为1才能使用Range.PasteSpecial
。我不知道这是什么原因,但你也可以在用户界面中看到:如果你“剪切”一个范围,唯一的选择是直接粘贴到某个地方。。。没有特别优惠;)好吧,这会给黑暗带来一些光明。再次感谢你,天哪。。非常感谢。但是我仍然不明白,为什么.PasteSpecial不起作用。因为Application.CutCopyMode
需要为1才能使用Range.PasteSpecial
。我不知道这是什么原因,但你也可以在用户界面中看到:如果你“剪切”一个范围,唯一的选择是直接粘贴到某个地方。。。没有特别优惠;)好吧,这会给黑暗带来一些光明。再次感谢。呜呜,我试过1
进行测试,但忘了设置。在原来的帖子中编辑了它xlPasteValues
只是可选的,因此它不会对方法本身产生任何影响。见上面的答案,这是有效的。但正如我所评论的,我仍然不知道为什么。不过还是要谢谢你啊,很好。这发生在我们所有人身上,很高兴你找到了一个有效的答案:)呜呜,我尝试了1
进行测试,但忘了设置它。在原来的帖子中编辑了它xlPasteValues
只是可选的,因此它不会对方法本身产生任何影响。见上面的答案,这是有效的。但正如我所评论的,我仍然不知道为什么。不过还是要谢谢你啊,很好。这发生在我们所有人身上,很高兴你找到了一个有效的答案:)