Vba 如何阻止宏在多次运行时重复?
我有一个宏,我在这里与其他用户一起提供了巨大的帮助。然后我稍微编辑了一下以满足我的需要 现在,运行宏将使Excel在Sheet2的第V列中查找0以上的任何数值。如果存在大于0的值,则复制该行的单元格S:V。然后Excel将在T列中查找包含数据的最后一行,并在T列之后移动到下一行。Excel然后将单元格S:V中的数据粘贴到此行中。之后,它将返回到Sheet2,并继续在第V列中查找下一个存在的值,并再次执行该操作,直到到达该列的末尾 我的问题是,当您运行宏两次时,它将根据需要执行两次操作,从而导致重复的值。我希望Excel执行宏一次,如果再次运行,则不会发生任何情况。我试图防止人为错误,以防有人意外地运行宏两次而没有注意到它。这可能吗Vba 如何阻止宏在多次运行时重复?,vba,excel,Vba,Excel,我有一个宏,我在这里与其他用户一起提供了巨大的帮助。然后我稍微编辑了一下以满足我的需要 现在,运行宏将使Excel在Sheet2的第V列中查找0以上的任何数值。如果存在大于0的值,则复制该行的单元格S:V。然后Excel将在T列中查找包含数据的最后一行,并在T列之后移动到下一行。Excel然后将单元格S:V中的数据粘贴到此行中。之后,它将返回到Sheet2,并继续在第V列中查找下一个存在的值,并再次执行该操作,直到到达该列的末尾 我的问题是,当您运行宏两次时,它将根据需要执行两次操作,从而导致重
Sub CopyPaste()
Dim c As Range
Dim IRow As Long, lastrow As Long
Dim rSource As Range
Dim wsI As Worksheet, wsO As Worksheet
Dim endrow As Long
On Error GoTo Whoa
'~~> Sheet Where values needs to be checked
Set wsI = ThisWorkbook.Sheets("Sheet2")
'~~> Output sheet
Set wsO = ThisWorkbook.Sheets("Sheet1")
Application.ScreenUpdating = False
'Look for last row with data in column T and move to next
endrow = wsO.Cells(Rows.Count, "T").End(xlUp).Row + 1
With wsI
'~~> Find Last Row which has data in Col S to V
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Columns("S:V").Find(What:="*", _
After:=.Range("S1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
Set rSource = .Range("V1:V" & lastrow)
If IsNumeric(c.Value) Then
If c.Value > 0 Then
wsO.Cells(endrow + IRow, 20).Resize(1, 4).Value = _
.Range("S" & c.Row & ":V" & c.Row).Value
wsO.Cells(endrow + IRow, 25).Value = "ID#" & .Range("J" & c.Row).Value
IRow = IRow + 1
End If
End If
Next
End With
LetsContinue:
Application.ScreenUpdating = True
Application.CutCopyMode = False
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
子复制粘贴()
调光范围
暗淡的伊洛一样长,最后一行一样长
作为范围的Dim rSource
将wsI设置为工作表,将wsO设置为工作表
暗尾行与长尾行相同
关于错误转到哇
“~~>需要检查值的工作表
设置wsI=ThisWorkbook.Sheets(“Sheet2”)
'~~>输出表
设置wsO=thiswoolk.Sheets(“Sheet1”)
Application.ScreenUpdating=False
'查找第T列中包含数据的最后一行,然后移到下一行
endrow=wsO.Cells(Rows.Count,“T”).End(xlUp).行+1
与wsI
“~~>查找第S列到第V列中包含数据的最后一行
如果Application.WorksheetFunction.CountA(.Cells)为0,则
lastrow=.Columns(“S:V”).Find(What:=“*”_
之后:=.范围(“S1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
lastrow=1
如果结束
设置rSource=.Range(“V1:V”和lastrow)
如果是数字(c值),则
如果c.值>0,则
wsO.Cells(endrow+IRow,20)。调整大小(1,4)。值=_
.范围(“S”和c.行&“:V”和c.行).值
wsO.Cells(endrow+IRow,25).Value=“ID#”和.Range(“J”和c.Row).Value
IRow=IRow+1
如果结束
如果结束
下一个
以
让我们继续:
Application.ScreenUpdating=True
Application.CutCopyMode=False
出口接头
哇
MsgBox错误说明
继续
端接头
正如SJR提到的,为什么不在再次运行代码之前清除wsO:
Sub CopyPaste()
Dim c As Range
Dim IRow As Long, lastrow As Long
Dim rSource As Range
Dim wsI As Worksheet, wsO As Worksheet
Dim endrow As Long
On Error GoTo Whoa
'~~> Sheet Where values needs to be checked
Set wsI = ThisWorkbook.Sheets("Sheet2")
'~~> Output sheet
Set wsO = ThisWorkbook.Sheets("Sheet1")
wsO.Rows("2:" & Rows.Count).ClearContents
'the above line will clear the sheet from Row 2 to the last (in case you have headers, if not then change 2 to 1
Application.ScreenUpdating = False
'Look for last row with data in column T and move to next
endrow = wsO.Cells(Rows.Count, "T").End(xlUp).Row + 1
With wsI
'~~> Find Last Row which has data in Col S to V
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Columns("S:V").Find(What:="*", _
After:=.Range("S1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
Set rSource = .Range("V1:V" & lastrow)
If IsNumeric(c.Value) Then
If c.Value > 0 Then
wsO.Cells(endrow + IRow, 20).Resize(1, 4).Value = _
.Range("S" & c.Row & ":V" & c.Row).Value
wsO.Cells(endrow + IRow, 25).Value = "ID#" & .Range("J" & c.Row).Value
IRow = IRow + 1
End If
End If
End With
LetsContinue:
Application.ScreenUpdating = True
Application.CutCopyMode = False
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
子复制粘贴()
调光范围
暗淡的伊洛一样长,最后一行一样长
作为范围的Dim rSource
将wsI设置为工作表,将wsO设置为工作表
暗尾行与长尾行相同
关于错误转到哇
“~~>需要检查值的工作表
设置wsI=ThisWorkbook.Sheets(“Sheet2”)
'~~>输出表
设置wsO=thiswoolk.Sheets(“Sheet1”)
行(“2:&Rows.Count”).ClearContent
'上一行将从第2行到最后一行清除工作表(如果有标题,则将2更改为1
Application.ScreenUpdating=False
'查找第T列中包含数据的最后一行,然后移到下一行
endrow=wsO.Cells(Rows.Count,“T”).End(xlUp).行+1
与wsI
“~~>查找第S列到第V列中包含数据的最后一行
如果Application.WorksheetFunction.CountA(.Cells)为0,则
lastrow=.Columns(“S:V”).Find(What:=“*”_
之后:=.范围(“S1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
lastrow=1
如果结束
设置rSource=.Range(“V1:V”和lastrow)
如果是数字(c值),则
如果c.值>0,则
wsO.Cells(endrow+IRow,20)。调整大小(1,4)。值=_
.范围(“S”和c.行&“:V”和c.行).值
wsO.Cells(endrow+IRow,25).Value=“ID#”和.Range(“J”和c.Row).Value
IRow=IRow+1
如果结束
如果结束
以
让我们继续:
Application.ScreenUpdating=True
Application.CutCopyMode=False
出口接头
哇
MsgBox错误说明
继续
端接头
正如SJR提到的,为什么不在再次运行代码之前清除wsO:
Sub CopyPaste()
Dim c As Range
Dim IRow As Long, lastrow As Long
Dim rSource As Range
Dim wsI As Worksheet, wsO As Worksheet
Dim endrow As Long
On Error GoTo Whoa
'~~> Sheet Where values needs to be checked
Set wsI = ThisWorkbook.Sheets("Sheet2")
'~~> Output sheet
Set wsO = ThisWorkbook.Sheets("Sheet1")
wsO.Rows("2:" & Rows.Count).ClearContents
'the above line will clear the sheet from Row 2 to the last (in case you have headers, if not then change 2 to 1
Application.ScreenUpdating = False
'Look for last row with data in column T and move to next
endrow = wsO.Cells(Rows.Count, "T").End(xlUp).Row + 1
With wsI
'~~> Find Last Row which has data in Col S to V
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Columns("S:V").Find(What:="*", _
After:=.Range("S1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
Set rSource = .Range("V1:V" & lastrow)
If IsNumeric(c.Value) Then
If c.Value > 0 Then
wsO.Cells(endrow + IRow, 20).Resize(1, 4).Value = _
.Range("S" & c.Row & ":V" & c.Row).Value
wsO.Cells(endrow + IRow, 25).Value = "ID#" & .Range("J" & c.Row).Value
IRow = IRow + 1
End If
End If
End With
LetsContinue:
Application.ScreenUpdating = True
Application.CutCopyMode = False
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
子复制粘贴()
调光范围
暗淡的伊洛一样长,最后一行一样长
作为范围的Dim rSource
将wsI设置为工作表,将wsO设置为工作表
暗尾行与长尾行相同
关于错误转到哇
“~~>需要检查值的工作表
设置wsI=ThisWorkbook.Sheets(“Sheet2”)
'~~>输出表
设置wsO=thiswoolk.Sheets(“Sheet1”)
行(“2:&Rows.Count”).ClearContent
'上一行将从第2行到最后一行清除工作表(如果有标题,则将2更改为1
Application.ScreenUpdating=False
'查找第T列中包含数据的最后一行,然后移到下一行
endrow=wsO.Cells(Rows.Count,“T”).End(xlUp).行+1
与wsI
“~~>查找第S列到第V列中包含数据的最后一行
如果Application.WorksheetFunction.CountA(.Cells)为0,则
lastrow=.Columns(“S:V”).Find(What:=“*”_
之后:=.范围(“S1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
lastrow=1
如果结束
设置rSource=.Range(“V1:V”和lastrow)
如果是数字(c值),则
如果c.值>0,则
wsO.Cells(endrow+IRow,20)。调整大小(1,4)。值=_
.范围(“S”和c.行&“:V”和c.行).值
wsO.Cells(endrow+IRow,25).Value=“ID#”和.Range(“J”和c.Row).Value