Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
Arrays Excel根据其他工作表中列表的内容清除单元格_Arrays_Excel_Vba_Cell - Fatal编程技术网

Arrays Excel根据其他工作表中列表的内容清除单元格

Arrays Excel根据其他工作表中列表的内容清除单元格,arrays,excel,vba,cell,Arrays,Excel,Vba,Cell,我有一张从A1到T1的1000行20列的excel表格。该范围内的每个单元格都有一些数据,通常是一个或两个单词。 在表2中,A1列有1000个值的数据列表 我正在使用VBA脚本从Sheet1中的Sheet2列表中查找单词,并清除已找到单词的单元格值 我现在有一个VBA脚本,它只在Sheet1的A1列上工作,并且只删除行。以下是脚本: Sub DeleteEmails() Dim rList As Range Dim rCrit As Range With Worksheets("Shee

我有一张从A1到T1的1000行20列的excel表格。该范围内的每个单元格都有一些数据,通常是一个或两个单词。 在表2中,A1列有1000个值的数据列表

我正在使用VBA脚本从Sheet1中的Sheet2列表中查找单词,并清除已找到单词的单元格值

我现在有一个VBA脚本,它只在Sheet1的A1列上工作,并且只删除行。以下是脚本:

Sub DeleteEmails() 
Dim rList As Range 
Dim rCrit As Range 

With Worksheets("Sheet1") 
    .Range("A1").Insert shift:=xlDown: .Range("A1").Value = "Temp Header" 
    Set rList = .Range("A1", .Cells(Rows.Count, 1).End(xlUp)) 
End With 
With Worksheets("Sheet2") 
    .Range("A1").Insert shift:=xlDown: .Range("A1").Value = "Temp Header" 
    Set rCrit = .Range("A1", .Cells(Rows.Count, 1).End(xlUp)) 
End With 

rList.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rCrit, Unique:=False 
rList.Offset(1).SpecialCells(xlCellTypeVisible).Delete shift:=xlUp 
Worksheets("Sheet1").ShowAllData 

rList(1).Delete shift:=xlUp: rCrit(1).Delete shift:=xlUp 

Set rList = Nothing: Set rCrit = Nothing 
End Sub 

有人能帮我吗?我需要清除值,而不是删除行,这应该适用于Sheet1的所有列,而不仅仅是A1。

我现在手头没有excel,因此公式名称可能不是100%准确,但我认为这一行需要更改:

rList.Offset(1).SpecialCells(xlCellTypeVisible).Delete shift:=xlUp 

将rList设置为所需选择后<代码>删除是您删除行而不清除行的原因<代码>(1)是您只执行
A1
而不是整个范围的原因

编辑

我用的最后一个代码是(包括现在检查所有列):


请允许我请求您不要在vba中使用“:”。在vba的默认IDE中很难注意到这一点,我花了一段时间才弄明白为什么会发生这样的事情,但却毫无意义

我现在手头没有excel,因此公式名称可能不是100%准确,但我认为这一行需要更改:

rList.Offset(1).SpecialCells(xlCellTypeVisible).Delete shift:=xlUp 

将rList设置为所需选择后<代码>删除是您删除行而不清除行的原因<代码>(1)是您只执行
A1
而不是整个范围的原因

编辑

我用的最后一个代码是(包括现在检查所有列):


请允许我请求您不要在vba中使用“:”。在vba的默认IDE中很难注意到这一点,我花了一段时间才弄明白为什么会发生这样的事情,但却毫无意义

这里是另一种使用数组的方法,通过最小化工作表(通过范围/单元格进行迭代)和代码之间的通信量。此代码不使用任何
清除内容
。只需将整个范围放入一个数组中,将其清理干净,然后单击按钮即可输入所需内容:)

  • 根据OP的要求进行编辑:添加注释并更改所需图纸的代码
代码:

  • 请不要告诉我您真正需要设置的是范围:

  • 钥匙范围
  • 待清理范围
输出:(出于显示目的,我使用相同的工作表,但您可以根据需要更改工作表名称

根据OP运行OP文件的请求进行编辑:

它没有清理所有列的原因是,在上面的示例中,只清理了两列,其中有16列。因此,您需要为循环添加另一个
,以对其进行迭代。性能下降不多,但有一点;)下面是运行您发送的工作表后的屏幕截图。除此之外,没有什么可以改变的

代码:


这里是另一种使用数组的方法,通过最小化工作表(通过范围/单元格进行迭代)和代码之间的通信量。此代码不使用任何
清除内容
。只需将整个范围放入一个数组中,将其清理干净,然后单击按钮即可输入所需内容:)

  • 根据OP的要求进行编辑:添加注释并更改所需图纸的代码
代码:

  • 请不要告诉我您真正需要设置的是范围:

  • 钥匙范围
  • 待清理范围
输出:(出于显示目的,我使用相同的工作表,但您可以根据需要更改工作表名称

根据OP运行OP文件的请求进行编辑:

它没有清理所有列的原因是,在上面的示例中,只清理了两列,其中有16列。因此,您需要为
循环添加另一个
,以对其进行迭代。性能下降不多,但有一点;)下面是运行您发送的工作表后的屏幕截图。除此之外,没有什么可以改变的

代码:



使用
.Find
根据值查看此链接@CamSpy,您想清除该单元格还是删除整行,还是只删除该单元格?@bonCodigo我想清除该单元格,以保留其他列的顺序/rows@SiddharthRout凭借他所做的,AdvancedFilter正是这项工作的合适工具。我不明白人们怎么能在“查找”根本不是问题的情况下向上投票。@Maverik:不是循环每一列,而是循环Sheet2列中的单元格,使用
.Find
查找表1中的值,然后使用
.ClearContents
如果找到了单词,那么我不确定您不理解的部分:)使用
.Find
根据值查看此链接@CamSpy,您想清除该单元格还是删除整行,还是只删除该单元格?@bonCodigo我想清除该单元格,以保留其他列的顺序/rows@SiddharthRout凭借他所做的,AdvancedFilter正是这项工作的合适工具。我不明白人们怎么能在“查找”根本不是问题的情况下向上投票。@Maverik:不是循环每一列,而是循环Sheet2列中的单元格,使用
.Find
在Sheet1中查找值,然后使用
.ClearContents
如果找到了单词,那么我不确定您不理解的部分:)我在尝试执行按您编写的方式编辑的脚本时收到编译错误语法错误消息。我想我必须抓取excel并模拟您的工作表:)给我一半一hour@CamSpy现在应该修好了。我认为是ClearContents结尾的
()
把vba甩了。我早些时候被错误的行搞混了,因为您使用了难以捉摸的“:”(我认为它是命名参数的一部分,被忽略了)
Option Explicit

Sub DeleteEmails()
    Dim rList As Range
    Dim rCrit As Range
    Dim rCells As Range
    Dim i As Integer

    With Worksheets("Sheet2")
        .Range("A1").Insert shift:=xlDown
        .Range("A1").Value = "Temp Header"
        Set rCrit = .Range("A1", .Cells(Rows.Count, 1).End(xlUp))
    End With

    Set rCells = Sheet1.Range("$A$1:$T$1")

    rCells.Insert shift:=xlDown

    Set rCells = rCells.Offset(-1)

    rCells.Value = "Temp Header"

    For i = 1 To rCells.Count
        Set rList = Sheet1.Range(rCells(1, i).address, Sheet1.Cells(Rows.Count, i).End(xlUp))

        If rList.Count > 1 Then  'if a column is empty as is in my test case, continue to next column
            rList.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=rCrit, Unique:=False
            rList.Offset(1).ClearContents
            Worksheets("Sheet1").ShowAllData
        End If
    Next i

    rCells.Delete shift:=xlUp
    rCrit(1).Delete shift:=xlUp

    Set rList = Nothing: Set rCrit = Nothing

End Sub
Option Explicit

Sub matchAndClear()
    Dim ws As Worksheet
    Dim arrKeys As Variant, arrData As Variant
    Dim i As Integer, j As Integer, k As Integer

    '-- here we take keys column from Sheet 1 into a 1D array
    arrKeys = WorksheetFunction.Transpose(Sheets(1).Range("A2:A11").Value)
    '-- here we take to be cleaned-up-range from Sheet 2 into a 2D array
    arrData = WorksheetFunction.Transpose(Sheets(2).Range("C2:D6").Value)

    '-- here we iterate through each key in keys array searching it in 
    '-- to-be-cleaned-up array
    For i = LBound(arrKeys) To UBound(arrKeys)
        For j = LBound(arrData, 2) To UBound(arrData, 2)
                '-- when there's a match we clear up that element
                If UCase(Trim(arrData(1, j))) = UCase(Trim(arrKeys(i))) Then
                    arrData(1, j) = " "
                End If
                '-- when there's a match we clear up that element
                If UCase(Trim(arrData(2, j))) = UCase(Trim(arrKeys(i))) Then
                    arrData(2, j) = " "
                End If
        Next j
    Next i

    '-- replace old data with new data in the sheet 2 :)
    Sheets(2).Range("C2").Offset(0, 0).Resize(UBound(arrData, 2), _
    UBound(arrData)) = Application.Transpose(arrData)

End Sub
'-- here we iterate through each key in keys array searching it in
    '-- to-be-cleaned-up array
    For i = LBound(arrKeys) To UBound(arrKeys)
        For j = LBound(arrData, 2) To UBound(arrData, 2)
            For k = LBound(arrData) To UBound(arrData)
                '-- when there's a match we clear up that element
                If UCase(Trim(arrData(k, j))) = UCase(Trim(arrKeys(i))) Then
                    arrData(k, j) = " "
                End If
            Next k
        Next j
    Next i