Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何阻止宏在多次运行时重复?_Vba_Excel - Fatal编程技术网

Vba 如何阻止宏在多次运行时重复?

Vba 如何阻止宏在多次运行时重复?,vba,excel,Vba,Excel,我有一个宏,我在这里与其他用户一起提供了巨大的帮助。然后我稍微编辑了一下以满足我的需要 现在,运行宏将使Excel在Sheet2的第V列中查找0以上的任何数值。如果存在大于0的值,则复制该行的单元格S:V。然后Excel将在T列中查找包含数据的最后一行,并在T列之后移动到下一行。Excel然后将单元格S:V中的数据粘贴到此行中。之后,它将返回到Sheet2,并继续在第V列中查找下一个存在的值,并再次执行该操作,直到到达该列的末尾 我的问题是,当您运行宏两次时,它将根据需要执行两次操作,从而导致重

我有一个宏,我在这里与其他用户一起提供了巨大的帮助。然后我稍微编辑了一下以满足我的需要

现在,运行宏将使Excel在Sheet2的第V列中查找0以上的任何数值。如果存在大于0的值,则复制该行的单元格S:V。然后Excel将在T列中查找包含数据的最后一行,并在T列之后移动到下一行。Excel然后将单元格S:V中的数据粘贴到此行中。之后,它将返回到Sheet2,并继续在第V列中查找下一个存在的值,并再次执行该操作,直到到达该列的末尾

我的问题是,当您运行宏两次时,它将根据需要执行两次操作,从而导致重复的值。我希望Excel执行宏一次,如果再次运行,则不会发生任何情况。我试图防止人为错误,以防有人意外地运行宏两次而没有注意到它。这可能吗

    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