Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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
Excel 复制行而不触发宏VBA_Excel_Vba_Automation_Copy - Fatal编程技术网

Excel 复制行而不触发宏VBA

Excel 复制行而不触发宏VBA,excel,vba,automation,copy,Excel,Vba,Automation,Copy,有几个问题与这个主题有关,但我有点挣扎 我有一个主表,用于存储各种信息。我使用列B隐藏/取消隐藏其他列。因此,对于在B列中输入的每个不同值,它将显示相应的列。e、 g.如果在列B中输入X,则将显示列C:F,并隐藏列g:I 这可以正常工作,但我想自动将此工作表中相同的值复制到单独的工作表中。e、 g.抓取母版中的所有X,并复制到仅包含X的单独表中 我可以这样做,但只能通过使用需要触发的宏。如果我需要复制大量行,这不是很有效。特别是如果您只更新了1行,但需要复制所有内容 我希望在输入值后立即自动复制

有几个问题与这个主题有关,但我有点挣扎

我有一个主
,用于存储各种信息。我使用
列B
隐藏/取消隐藏其他
。因此,对于在B列中输入的每个不同值,它将显示相应的
。e、 g.如果在
列B
中输入
X
,则将显示
列C:F
,并隐藏
列g:I

这可以正常工作,但我想自动
将此工作表中相同的值复制到单独的
工作表中
。e、 g.抓取母版中的所有
X
,并复制到仅包含
X
的单独
表中

我可以这样做,但只能通过使用需要触发的
宏。如果我需要
复制大量
,这不是很有效。特别是如果您只更新了1
,但需要复制所有内容

我希望在输入值后立即自动复制。无需触发宏

这是
脚本
在主
表中隐藏/取消隐藏特定

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False
        Dim t As Range
        For Each t In Intersect(Target, Range("B:B"))
            Select Case (t.Value)
                Case "Change of Numbers"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("H:BL").EntireColumn.Hidden = True
                    'do nothing
            End Select
        Next t

    End If

safe_exit:
    Application.EnableEvents = True
End Sub
由于我无法将单独的工作表添加到脚本中以自动复制,因此我对如何执行此操作感到有点困惑

我目前正在使用下面的脚本。这会将相应的
复制到相应的
工作表
。但它只有在被触发时才起作用。我希望在填写后自动
复制

@Gexas,这是怎么回事

Private Sub Worksheet_Change(ByVal Target As Range)

    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False
        Dim t As Range
        For Each t In Intersect(Target, Range("B:B"))
            Select Case (t.Value)
                Case "Change of Numbers"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("H:BL").EntireColumn.Hidden = True
                    'do nothing
            End Select
        Next t

    End If
safe_exit:
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet

    Set sht1 = Worksheets("MASTER")
    Set sht2 = Worksheets("CON")

    sht2.UsedRange.ClearContents

    With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)
        .Cells.EntireColumn.Hidden = False ' unhide columns
        If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False

        .AutoFilter field:=1, Criteria1:="Change of Numbers"

        .Range("A:F, BL:BO").Copy Destination:=sht2.Cells(2, "B")
        .Parent.AutoFilterMode = False

        .Range("H:BK").EntireColumn.Hidden = True ' hide columns
    End With
End Sub
过滤和复制 如果将“Sub”移动到工作表代码(Master)中,可能会像在“Private Sub”中一样丢失其中的“sht1”,如果不只是将行过滤器和复制适当地添加到“Private Sub”中

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo safe_exit

    ' Something has changed in Column "B"
    If Not Intersect(Target, Range("B:B")) Is Nothing Then

        Application.EnableEvents = False

    ' *******************
        FilterAndCopy ' *
    ' *******************

        Dim t As Range

        For Each t In Intersect(Target, Range("B:B"))
            Select Case (t.Value)
                Case "Change of Numbers"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("H:BL").EntireColumn.Hidden = True
                    'do nothing
            End Select
        Next t

    End If

safe_exit:

    Application.EnableEvents = True

End Sub


'****************
Sub FilterAndCopy()

    Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet

    Set sht1 = Worksheets("MASTER")
    Set sht2 = Worksheets("CON")

    sht2.UsedRange.ClearContents

    With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)
        .Cells.EntireColumn.Hidden = False        ' unhide columns
            If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False
                .AutoFilter field:=1, Criteria1:="Change of Numbers"
                .Range("A:F, BL:BO").Copy Destination:=sht2.Cells(2, "B")
            .Parent.AutoFilterMode = False
        .Range("H:BK").EntireColumn.Hidden = True ' hide columns
    End With

End Sub
'****************
过滤和复制 如果将“Sub”移动到工作表代码(Master)中,可能会像在“Private Sub”中一样丢失其中的“sht1”,如果不只是将行过滤器和复制适当地添加到“Private Sub”中

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    On Error GoTo safe_exit

    ' Something has changed in Column "B"
    If Not Intersect(Target, Range("B:B")) Is Nothing Then

        Application.EnableEvents = False

    ' *******************
        FilterAndCopy ' *
    ' *******************

        Dim t As Range

        For Each t In Intersect(Target, Range("B:B"))
            Select Case (t.Value)
                Case "Change of Numbers"
                    Columns("B:BP").EntireColumn.Hidden = False
                    Columns("H:BL").EntireColumn.Hidden = True
                    'do nothing
            End Select
        Next t

    End If

safe_exit:

    Application.EnableEvents = True

End Sub


'****************
Sub FilterAndCopy()

    Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet

    Set sht1 = Worksheets("MASTER")
    Set sht2 = Worksheets("CON")

    sht2.UsedRange.ClearContents

    With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)
        .Cells.EntireColumn.Hidden = False        ' unhide columns
            If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False
                .AutoFilter field:=1, Criteria1:="Change of Numbers"
                .Range("A:F, BL:BO").Copy Destination:=sht2.Cells(2, "B")
            .Parent.AutoFilterMode = False
        .Range("H:BK").EntireColumn.Hidden = True ' hide columns
    End With

End Sub
'****************

工作表\u Change
事件可以包含两个函数。由于代码是从第一行到最后一行读取的,所以VBA将按顺序从第二行代码中复制内容,然后隐藏列。下面的代码应该可以工作,假设其他一切都很好。请注意,我无法测试它,也没有检查其他错误。刚换了菜

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet

    Set sht1 = Worksheets("MASTER")
    Set sht2 = Worksheets("CON")

    sht2.UsedRange.ClearContents

    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False

        With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)
          .Cells.EntireColumn.Hidden = False       ' unhide columns
           If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False

            .AutoFilter field:=1, Criteria1:="Change of Numbers"

            .Range("A:F, BL:BO").Copy Destination:=sht2.Cells(2, "B")
            .Parent.AutoFilterMode = False

            .Range("H:BK").EntireColumn.Hidden = True ' hide columns
        End With

        Dim t As Range
        For Each t In Intersect(Target, Range("B:B"))
            Select Case (t.Value)
            Case "Change of Numbers"
                Columns("B:BP").EntireColumn.Hidden = False
                Columns("H:BL").EntireColumn.Hidden = True
                'do nothing
            End Select
        Next t

    End If

    safe_exit:
    Application.EnableEvents = True
End Sub

工作表\u Change
事件可以包含两个函数。由于代码是从第一行到最后一行读取的,所以VBA将按顺序从第二行代码中复制内容,然后隐藏列。下面的代码应该可以工作,假设其他一切都很好。请注意,我无法测试它,也没有检查其他错误。刚换了菜

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rng As Range, sht1 As Worksheet, sht2 As Worksheet

    Set sht1 = Worksheets("MASTER")
    Set sht2 = Worksheets("CON")

    sht2.UsedRange.ClearContents

    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        On Error GoTo safe_exit
        Application.EnableEvents = False

        With Intersect(sht1.Columns("B:BP"), sht1.UsedRange)
          .Cells.EntireColumn.Hidden = False       ' unhide columns
           If .Parent.AutoFilterMode Then .Parent.AutoFilterMode = False

            .AutoFilter field:=1, Criteria1:="Change of Numbers"

            .Range("A:F, BL:BO").Copy Destination:=sht2.Cells(2, "B")
            .Parent.AutoFilterMode = False

            .Range("H:BK").EntireColumn.Hidden = True ' hide columns
        End With

        Dim t As Range
        For Each t In Intersect(Target, Range("B:B"))
            Select Case (t.Value)
            Case "Change of Numbers"
                Columns("B:BP").EntireColumn.Hidden = False
                Columns("H:BL").EntireColumn.Hidden = True
                'do nothing
            End Select
        Next t

    End If

    safe_exit:
    Application.EnableEvents = True
End Sub

所以从
工作表\u Change
事件调用它?我觉得我错过了什么…嗯?你完全失去了我。为什么
FilterAndCopy()
需要出现在主控表中?它是隐式公开的。我在这里显然有点不知所措。我不明白什么需要进入哪个工作表。我在工作表更改事件中调用什么?
FilterAndCopy()
,因为我理解这个问题。所以从
工作表更改事件中调用它?我觉得我错过了什么…嗯?你完全失去了我。为什么
FilterAndCopy()
需要出现在主控表中?它是隐式公开的。我在这里显然有点不知所措。我不明白什么需要进入哪个工作表。我从工作表更改事件调用什么?
FilterAndCopy()
我理解这个问题。但是
FilterAndCopy()
仍然不会自动触发,或者我错了?但是
FilterAndCopy()
仍然不会自动触发,或者我错了?没有,每次工作表上的任何地方发生更改时,都会更改工作表CON。不需要这样做,除非B列中的单元格中的值已更改为“数字更改”。哦,我明白你现在所说的,我将更改我的答案为正确的顺序。这很好。现在我想手动触发FilterAndCopy(运行宏)。不,每次工作表上的任何地方发生更改时,都会更改工作表CON。不需要这样做,除非B列中的单元格中的值已更改为“数字更改”。哦,我明白你现在所说的,我将更改我的答案为正确的顺序。这很好。现在我想手动触发FilterAndCopy(运行宏)。