我的功能是从实现一个单元格内容确定后,后面的单元格自动填充,但是我只能一个一个的去粘贴表格后面才会自动填充,我批量复制粘贴的时候无法自动填充,如何解决?

为什么在用VBA时,表格只能一个单元格识别运行,当我批量粘贴数据的时候无法运行,如何可以改进?


Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> [B:B].Column Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    If Target = "" Then Target.Offset(0, 1).Resize(1, 6) = "": Exit Sub
    Set xrng = Sheets("无用列表").Range("B:B").Find(Target)
    If Not xrng Is Nothing Then
        Target.Offset(0, 1).Resize(1, 6) = xrng.Offset(0, 1).Resize(1, 6).Value
    End If
End Sub




我的功能是从实现一个单元格内容确定后,后面的单元格自动填充,但是我只能一个一个的去粘贴表格后面才会自动填充,我批量复制粘贴的时候无法自动填充

chatgpt:
您的 VBA 代码使用了 Excel 的 Worksheet_Change 事件,当单元格的内容改变时会被触发。但是这个事件只会对单个单元格生效,如果您批量复制粘贴数据,只会触发一次事件,导致后面的单元格没有被自动填充。

为了解决这个问题,您可以将 VBA 代码修改成一个宏,然后通过菜单或快捷键的方式运行它,而不是依赖于单元格的改变事件。具体步骤如下:

1.在 Excel 中按下 Alt + F11,打开 VBA 编辑器。
2.在左侧的“项目资源管理器”中找到您的 Excel 文件,并展开“Microsoft Excel 对象”节点。
3.双击“本工作表”,打开它的代码编辑窗口。
4.在编辑窗口中,输入以下代码:

Sub FillCells()
    Dim cell As Range
    For Each cell In Selection.Cells
        If cell.Column = [B:B].Column And cell.Value <> "" Then
            Set xrng = Sheets("无用列表").Range("B:B").Find(cell)
            If Not xrng Is Nothing Then
                cell.Offset(0, 1).Resize(1, 6) = xrng.Offset(0, 1).Resize(1, 6).Value
            End If
        End If
    Next cell
End Sub


5.关闭 VBA 编辑器,并回到您的 Excel 工作表。
6.选择您要填充数据的单元格范围,然后按下 Alt + F8,打开宏窗口。
7.在宏窗口中,选择“FillCells”宏,并点击“运行”按钮。
这样,您就可以通过宏来自动填充单元格了。选择您要填充的单元格范围,运行宏后,它就会自动填充这些单元格

回答引用ChatGPT:这是因为 Worksheet_Change 事件只在单元格的值更改时触发,而不是在粘贴数据时触发。当您批量粘贴数据时,每个单元格的值不会逐个更改,因此该事件不会触发。

为了解决这个问题,您可以使用 Worksheet_SelectionChange 事件来监视单元格的选择更改。当您选择一个范围进行粘贴时,该事件将触发,并且您可以通过检查所选范围中的值来自动填充后面的单元格。以下是一个示例代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column <> [B:B].Column Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    If Target = "" Then Target.Offset(0, 1).Resize(1, 6) = "": Exit Sub
    Set xrng = Sheets("无用列表").Range("B:B").Find(Target)
    If Not xrng Is Nothing Then
        Target.Offset(0, 1).Resize(1, 6) = xrng.Offset(0, 1).Resize(1, 6).Value
    End If
End Sub

这将在您选择并粘贴数据时触发事件,而不是在数据实际粘贴到单元格中时触发事件。因此,如果您想要确保在粘贴操作完成后立即填充单元格,请使用 Application.CutCopyMode 属性。例如,您可以在此代码中添加以下行来检查是否已经进行了粘贴操作:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode <> False Then Exit Sub
    ' 剩下的代码和之前的示例一样
End Sub

这将确保代码只在没有正在进行的粘贴操作时才会运行。

该回答引用ChatGPT
根据你提供的代码,可以看出这是一个Worksheet_Change事件,当B列的单元格内容发生变化时,会自动填充该单元格后面的6个单元格。但是,当你批量复制粘贴数据时,只有第一个单元格会自动填充,后面的单元格不会自动填充。
这是因为Worksheet_Change事件只会在单元格内容发生变化时触发,而批量复制粘贴数据时,虽然单元格的内容发生了变化,但是并没有触发Worksheet_Change事件。
解决这个问题的方法是,在复制粘贴数据之后,手动触发Worksheet_Change事件。可以在VBA编辑器中按F5键运行Worksheet_Change事件,或者在Excel中手动修改一下单元格的内容,让事件自动触发。
另外,你可以考虑使用其他的方法来实现自动填充单元格的功能,比如使用公式或者宏。这样可以避免在复制粘贴数据时出现问题。