要将值粘贴到Excel VBA-查找单元格

时间:2013-07-29 23:11:34

标签: excel vba excel-vba

我正在尝试构建一个宏,通过查找行值并查找列值并使用它来确定要粘贴的单元格,将值插入到表的特定单元格中。我对VBA很陌生,所以我不确定我在做什么。

这是我到目前为止所做的:

Name=Sheets("Input").Range("C5")
Week=Sheets("Input").Range("C19")
copyCell=Sheets("Input").Range("C18")

pasteCell = Application.Index(Sheets("Resources").Range("B2:AZ50"),Application.Match(Week,Sheets("Resources").Range("A2:A50"),0),Application.Match(Name,Sheets("Resources").Range("B1:AZ1"),0))

copyCell.Copy
pasteCell.PasteSpecial PasteValues

我不断收到运行时错误对象,但我不太确定我做错了什么......

任何帮助将不胜感激!

更新

这是正在粘贴单元格的表格(这个表格不是真正的表格只是一个例子,以便隐藏表格中的名称但它看起来完全相同,除了真正的表格从第一行开始)。

enter image description here

这是输入页面:

enter image description here

注意:我已经在周变量中添加了更多代码:

If WorksheetFunction.CountA(Sheets("Input").Range("C19")) = 0 Then
Week = Sheets("Input").Range("C20").Value
Else
Week = Sheets("Input").Range("C19").Value
End If

非常感谢你们给予的帮助!

1 个答案:

答案 0 :(得分:0)

在没有看到更多代码的情况下,我假设您已将copyCellpasteCell声明为类型Variant(如果未声明,则类型Variant)。

这会引起您描述的错误。

通过正确声明变量解析它,并在分配对象变量时使用Set关键字。

此外,如果未声明NameWeek,也会引发424 Object Required错误。它们应为String数据类型,并使用范围.Value方法进行分配。如果其中一个匹配函数返回错误(未找到匹配项),则此错误将持续存在,而不会对代码进行更多修订。

我认为这会奏效:

Sub Test()
Dim Name As String
Dim Week As Long
Dim copyCell As Range
Dim pasteCell As Range

Name = Sheets("Input").Range("C5").Value
Week = CLng(DateValue(Sheets("Input").Range("C19").Value))
Set copyCell = Sheets("Input").Range("C18")

If Not IsError(Application.Match(Week, Sheets("Resources").Range("A2:A50"), 0)) And _
    Not IsError(Application.Match(Name, Sheets("Resources").Range("B1:AZ1"), 0)) Then

    Set pasteCell = Application.Index(Sheets("Resources").Range("B2:AZ50"), _
        Application.Match(Week, Sheets("Resources").Range("A2:A50"), 0), _
        Application.Match(Name, Sheets("Resources").Range("B1:AZ1"), 0))

    copyCell.Copy
    pasteCell.PasteSpecial PasteValues
Else:
    MsgBox Name & " and/or " & Week & " not found!", vbInformation
End If
End Sub

<强>已更新

Excel并不总是知道如何处理日期值。这就是这种情况。在工作表上,日期值存储为长整数。在宏中,我们将其称为字符串,可能会引发多个错误,包括“1004”(无法匹配)。

我对上面的代码Dim Week as Long进行了修订,然后更改了分配以确保该值从工作表中解释为Date,然后作为Long整数分配给这个变量:

Week = CLng(DateValue(Sheets("Input").Range("C19").Value))

现在,如果您的日期并非所有日期都是日期(google it ...),这可能不是万无一失的,但这实际上经常发生一些日期作为日期输入(数字格式化为日期)而其他日期则作为字符串输入文字。如果是这种情况,仍应正确处理Week值,但查找范围的格式也应相同,以避免再次出现潜在错误。