为什么在用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