Vba 在变量中存储多个值并删除子变量末尾的行

Vba 在变量中存储多个值并删除子变量末尾的行,vba,excel,Vba,Excel,我已经编写了下面的代码,它应该运行一个数据集并删除所有与调用C1中的值不匹配的行。在我的原始代码中,我逐行删除了代码,代码非常慢,所以现在我尝试将所有值添加到变量中,并删除最后的所有单元格。这可能吗 Sub FixData() Dim wbFeeReport As Workbook Dim wsData As Worksheet Dim wsData2 As Worksheet Dim FrRngCount As Range Dim x As Long Dim y As Long Dim va

我已经编写了下面的代码,它应该运行一个数据集并删除所有与调用C1中的值不匹配的行。在我的原始代码中,我逐行删除了代码,代码非常慢,所以现在我尝试将所有值添加到变量中,并删除最后的所有单元格。这可能吗

Sub FixData()

Dim wbFeeReport As Workbook
Dim wsData As Worksheet
Dim wsData2 As Worksheet
Dim FrRngCount As Range
Dim x As Long
Dim y As Long
Dim varRows As Variant

Set wbFeeReport = ThisWorkbook
Set wsData = wbFeeReport.Worksheets("Data")
Set wsData2 = wbFeeReport.Worksheets("Data2")

Set FrRngCount = wsData.Range("D:D")
y = Application.WorksheetFunction.CountA(FrRngCount)

For x = y To 2 Step -1
If wsData.Range("J" & x).Value <> wsData2.Range("C1").Value Then
varRows = x
Else
wsData.Range("AF" & x).Value = wsData.Range("J" & x).Value
End If
Next x

wsData.Rows(varRows).EntireRow.Delete

End Sub
Sub-FixData()
将报告作为工作簿
将wsData设置为工作表
将wsData2设置为工作表
Dim FRRNG计数为范围
暗x等长
长得一样暗
Dim varRows作为变体
设置wbFeeReport=ThisWorkbook
设置wsData=wbFeeReport.Worksheets(“数据”)
设置wsData2=wbFeeReport.Worksheets(“Data2”)
设置FrRngCount=wsData.Range(“D:D”)
y=Application.WorksheetFunction.CountA(FrRngCount)
对于x=y到2,步骤-1
如果wsData.Range(“J”和x).值为wsData2.Range(“C1”).值,则
varRows=x
其他的
wsData.Range(“AF”&x).Value=wsData.Range(“J”&x).Value
如果结束
下一个x
wsData.Rows(varRows).EntireRow.Delete
端接头
现在代码只删除最后一行,因为变量每次在循环中运行时都会被覆盖。关于如何在变量中存储所有值并删除最后不需要的行,有什么建议吗


谢谢你的帮助

由于您需要一个包含所有行的范围,您可以将其收集到一个“运行中”,如下所示:

Sub FixData()

  Dim wsData As Worksheet
  wsData = ThisWorkbook.Worksheets("Data")

  Dim val As Variant
  val = ThisWorkbook.Worksheets("Data2").Range("C1").Value

  Dim DelRows As Range, x As Long

  For x = 2 To wsData.Cells(wsData.Rows.Count, 4).End(xlUp).Row
    If wsData.Range("J" & x).Value <> val Then
      If DelRows Is Nothing Then
        Set DelRows = wsData.Rows(x)
      Else
        Set DelRows = Union(wsData.Rows(x), DelRows)
      End If
    Else
      wsData.Range("AF" & x).Value = wsData.Range("J" & x).Value
    End If
  Next x

  DelRows.EntireRow.Delete

End Sub
Sub-FixData()
将wsData设置为工作表
wsData=此工作簿。工作表(“数据”)
Dim-val作为变体
val=此工作簿。工作表(“数据2”)。范围(“C1”)。值
将DelRows变暗为范围,x变长
对于x=2的wsData.Cells(wsData.Rows.Count,4).End(xlUp).Row
如果wsData.Range(“J”&x).Value val,则
如果DelRows什么都不是
Set DelRows=wsData.Rows(x)
其他的
Set DelRows=Union(wsData.Rows(x),DelRows)
如果结束
其他的
wsData.Range(“AF”&x).Value=wsData.Range(“J”&x).Value
如果结束
下一个x
DelRows.EntireRow.Delete
端接头

当您需要一个包含所有行的范围时,您可以在一次“运行”中收集它,如下所示:

Sub FixData()

  Dim wsData As Worksheet
  wsData = ThisWorkbook.Worksheets("Data")

  Dim val As Variant
  val = ThisWorkbook.Worksheets("Data2").Range("C1").Value

  Dim DelRows As Range, x As Long

  For x = 2 To wsData.Cells(wsData.Rows.Count, 4).End(xlUp).Row
    If wsData.Range("J" & x).Value <> val Then
      If DelRows Is Nothing Then
        Set DelRows = wsData.Rows(x)
      Else
        Set DelRows = Union(wsData.Rows(x), DelRows)
      End If
    Else
      wsData.Range("AF" & x).Value = wsData.Range("J" & x).Value
    End If
  Next x

  DelRows.EntireRow.Delete

End Sub
Sub-FixData()
将wsData设置为工作表
wsData=此工作簿。工作表(“数据”)
Dim-val作为变体
val=此工作簿。工作表(“数据2”)。范围(“C1”)。值
将DelRows变暗为范围,x变长
对于x=2的wsData.Cells(wsData.Rows.Count,4).End(xlUp).Row
如果wsData.Range(“J”&x).Value val,则
如果DelRows什么都不是
Set DelRows=wsData.Rows(x)
其他的
Set DelRows=Union(wsData.Rows(x),DelRows)
如果结束
其他的
wsData.Range(“AF”&x).Value=wsData.Range(“J”&x).Value
如果结束
下一个x
DelRows.EntireRow.Delete
端接头
最快的方法是

  • 将数据加载到数组中
  • 将有效数据复制到第二个数组中
  • 清除范围的内容
  • 将第二个数组写回工作表

最快的方法是

  • 将数据加载到数组中
  • 将有效数据复制到第二个数组中
  • 清除范围的内容
  • 将第二个数组写回工作表


使用将所有单元格收集到单个单元格中,然后使用
rng.entirerow.delete
。使用将所有单元格收集到单个单元格中,然后使用
rng.entirerow.delete
。哇,这太快了!非常感谢您的帮助Thomas。快速提问:为什么Dim Data、Data1和TargetValue不需要定义?如果不指定声明类型,变量类型默认为Variant。哇,这太快了!非常感谢您的帮助Thomas。快速提问:为什么Dim Data、Data1和TargetValue不需要定义?如果不指定声明类型,变量类型默认为Variant。这也是一段很好的代码。谢谢你的帮助,德克!这也是一段很好的代码。谢谢你的帮助,德克!