我正在尝试构建一个宏,通过查找行值并查找列值并使用它来确定要粘贴的单元格,将值插入到表的特定单元格中。我对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
我不断收到运行时错误对象,但我不太确定我做错了什么......
任何帮助将不胜感激!
更新
这是正在粘贴单元格的表格(这个表格不是真正的表格只是一个例子,以便隐藏表格中的名称但它看起来完全相同,除了真正的表格从第一行开始)。
这是输入页面:
注意:我已经在周变量中添加了更多代码:
If WorksheetFunction.CountA(Sheets("Input").Range("C19")) = 0 Then
Week = Sheets("Input").Range("C20").Value
Else
Week = Sheets("Input").Range("C19").Value
End If
非常感谢你们给予的帮助!
答案 0 :(得分:0)
在没有看到更多代码的情况下,我假设您已将copyCell
和pasteCell
声明为类型Variant
(如果未声明,则是类型Variant
)。
这会引起您描述的错误。
通过正确声明变量解析它,并在分配对象变量时使用Set
关键字。
此外,如果未声明Name
和Week
,也会引发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
值,但查找范围的格式也应相同,以避免再次出现潜在错误。