下午好,
我是VBA世界的全新人物。我有一个用于记录风险的工作簿,我有一个名为RiskRegister的工作表,其中包含所记录的每个风险的所有数据。我还有一个摘要选项卡,它使用风险登记表中的ID,并使用vlookup公式将相关字段复制到摘要表。我需要更新宏做的是搜索工作表AP上的列AP以搜索“V High”,如果找到匹配项我需要将该行的A列值复制到A列的下一个可用行中表CSR风险报告。我找到了下面的代码,但是当我运行它时,我得到运行时错误424对象需要。有人可以告诉我哪里出错,或者是否有更好的方法来完成这项任务?
Private Sub CommandButton1_Click()
Dim tValue As String
Dim dValue As String
'Get last row value of sheet RiskRegister
a = Worksheets("RiskRegister").Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To a
'If Value = "V High" then copy the value in column A into coloumn 1 of "CSR Risk Report"
If Worksheets("RiskRegister").Cells(i, 42).Value = "V High" Then
tValue = Worksheets("RiskRegister").Cells(i, 1).Value.Copy
Worksheets("CSR Risk Report").Activate
'Get last row of "CSR Risk Report" and paste the value in last row of column A
b = Worksheets("CSR Risk Report").Cells(Rows.Count, 1).End(xlUp).Row
dValue = Worksheets("CSR Risk Report").Cells(b + 1, 1).Select
dValue = tValue
Worksheets("RiskRegister").Activate
End If
Next
' Not sure what this is
Application.CutCopyMode = False
End Sub
我还需要循环“高”然后“中”的结果,我计划简单地用新的搜索条件重复if循环。我希望这会将它粘贴到正确的优先级顺序,即V high - > High - > Medium
亲切的问候
亚当
首先:声明“Option Explicit”
然后声明你的变量
不,我们可以看到您正在尝试将方法“.copy”分配给字符串变量。 “.copy”方法将值放入剪贴板,而不是变量。
然后你在下面做同样的事情,尝试将方法“.select”放入字符串中......
试试这个:
Option Explicit
Private Sub CommandButton1_Click()
Dim tValue As String
Dim dValue As Range
'Get last row value of sheet RiskRegister
Dim a As Long
a = Worksheets("RiskRegister").Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To a
'If Value = "V High" then copy the value in column A into coloumn 1 of "CSR Risk Report"
If Worksheets("RiskRegister").Cells(i, 42).Value = "V High" Then
tValue = Worksheets("RiskRegister").Cells(i, 1).Value
'Worksheets("CSR Risk Report").Activate
'Get last row of "CSR Risk Report" and paste the value in last row of column A
Dim b As Long
b = Worksheets("CSR Risk Report").Cells(Rows.Count, 1).End(xlUp).Row
Set dValue = Worksheets("CSR Risk Report").Cells(b + 1, 1)
dValue = tValue
'Worksheets("RiskRegister").Activate
End If
Next
End Sub
注意:“Application.CutCopyMode = False”清除剪贴板。如果您使用.copy和.paste方法,则只需要它。如果我们直接使用变量和值,那么我们不需要这个。
在上述评论的基础上,试试这个
Private Sub CommandButton1_Click()
Dim tValue As String
Dim dValue As String
Dim a As Long, i As Long, b As Long, r As Range, v, j As Long
v = Array("V High", "High", "Medium")
With Worksheets("RiskRegister")
'Get last row value of sheet RiskRegister
a = .Cells(Rows.Count, 1).End(xlUp).Row
For j = LBound(v) To UBound(v)
Set r = .Range(.Cells(2, "AP"), .Cells(a, "AP")).Find(What:=v(j), Lookat:=xlWhole, _
MatchCase:=False, SearchFormat:=False)
If Not r Is Nothing Then
tValue = .Cells(r.Row, 1).Value
'Get last row of "CSR Risk Report" and paste the value in last row of column A
b = Worksheets("CSR Risk Report").Cells(Rows.Count, 1).End(xlUp).Row
Worksheets("CSR Risk Report").Cells(b + 1, 1).Value = tValue
End If
Next j
End With
End Sub
您不需要复制单元格并更改工作表之间的激活 - 您每次更新它时也不需要检查最后一行(变量b),您只需添加1
老实说,听起来你只需要用过滤器安排一些东西,但为了代码答案,试试这个:
Private Sub CommandButton1_Click()
Dim WSA As Worksheet
Dim WSB As Worksheet
Dim a As Long
Dim b As Long
Dim i As Long
Set WSA = ThisWorkbook.Worksheets("RiskRegister")
Set WSB = ThisWorkbook.Worksheets("CSR Risk Report")
'Get last rows
a = WSA.Cells(WSA.Rows.Count, 1).End(xlUp).Row
b = WSB.Cells(WSB.Rows.Count, 1).End(xlUp).Row
For i = 2 To a
If WSA.Cells(i, 42).Value = "V High" Then
b = b + 1
WSB.Cells(b, 1).Value2 = WSA.Cells(i, 42).Value2
End If
Next
End Sub