【问题标题】:Copy all cells with certain value into another column skipping blanks将具有特定值的所有单元格复制到另一列跳过空白
【发布时间】:2012-11-20 09:21:35
【问题描述】:

我有三列,A、B 和 C:
A 列包含名称、NAME1、NAME2 等。
B 列仅包含值“YES”或“NO”。
假设 C 列包含 A 列中 B 列中值为“YES”的名称。

我可以说,只要 B 列中的值为“YES”,将值从 A 列复制到 C 列。很简单:

C1=IF(B1="YES",A1,"")

但这将包括空白单元格,我不想这样做。所以我想我正在寻找一种方法来复制 A 列中所有 B 列中值为“YES”的名称,并将它们粘贴到 C 列中,跳过空白。

我确实找到了一个 VBA 项目,它为列中的所有单元格着色具有特定值。我不确定如何将其编辑为我需要的内容。这是我到目前为止提出的代码。

问题
1) 运行时错误 '1004' 应用程序定义或对象定义的错误
2) 从 A 列复制
3) 检查并删除NewRange中的重复项

编辑 1:在代码中添加了注释行
编辑 2:将 NewRange 更改为从具有偏移量的 A 列(由于运行时错误而未经测试)EDIT 3:从一张表复制代码与粘贴到另一张表的代码分开
EDIT 4:添加用户@abahgat 的更正
编辑 5:删除重复项

Sub RangeCopyPaste()
Dim cell As Range
Dim NewRange As Range
Dim MyCount As Long
MyCount = 1

'--> Loop through each cell in column B
'--> Add each cell in column A with value "YES" in column B to NewRange 
For Each cell In Worksheets("Sheet1").Range("B1:B30")
    If cell.Value = "YES" Then
        If MyCount = 1 Then Set NewRange = cell.Offset(0,-1)
        Set NewRange = Application.Union(NewRange, cell.Offset(0,-1))
        MyCount = MyCount + 1
    End If
Next cell

'--> Copy NewRange from inactive sheet into active sheet
NewRange.Copy Destination:=activesheet.Range("C1")

'--> Remove Duplicates
activesheet.Range("C1:C30").RemoveDuplicates

End Sub

【问题讨论】:

    标签: excel skip vba


    【解决方案1】:

    没有 VBA 的解决方案:

    C 列包含如下公式:

    =COUNTIF(B$1:B1;"yes")
    

    如果该行在 B 列中有“是”值,则增加 C 列中的数字。
    该值将在下一步中使用。

    D 列包含如下公式:

    =INDEX(A:A;MATCH(ROW();C:C;0))
    

    取值:
    表:一整行
    行号:由匹配函数计算:在整个 C 列中查找第一次出现的行号(我们将放置值的行号)。 0 表示我们正在寻找这个数字而不是最接近的数字。

    跳过错误:

    =IF(ISERROR(MATCH(ROW();C:C;0));"";INDEX(A:A;MATCH(ROW();C:C;0)))
    

    更容易写:

    =IFERROR(INDEX(A:A;MATCH(ROW();C:C;0));"")
    

    这意味着: 如果该值不是错误,则写入规则中的值;如果规则错误,则写入空字符串

    【讨论】:

    • 谁能解释一下。除非您知道自己在做什么,否则它现在非常模糊和不清楚。谢谢:)
    【解决方案2】:

    刚刚在您的If 上使用了And 条件来避免空单元格

    1. 在C1中,放入然后复制下来=IF(AND(LEN(A1>0),B1="YES"),A1,NA()))
    2. 选择column C
      • 按 F5
      • 特殊 ...检查Formulas,然后勾选错误(见图)
      • 删除选定的单元格,以便在 C 列中留下更短的所需名称列表

    【讨论】:

    • 感谢您的回复,但它似乎不起作用。它和我之前描述的完全一样。 Name 值为“NO”的行在 C 列中包含一个空白。但 C 列不应有任何空白,它的长度应始终等于或小于其他两列。 C 列应该是所有“YES”名称的副本,没有空格(因此“错误”行上可能有名称)。我希望我能正确解释自己。
    • @AmpiSevere 说得通 - 见上文
    • 谢谢,这确实很好用,但是(抱歉 :-))我必须为 8 个不同的“B”列执行此操作,我希望能够编辑“是”和“否” "价值观。是否可以自动执行此操作?同时我会使用这个方法,谢谢!
    • 我意识到,当我只从列中选择并复制某些单元格然后粘贴它们时,(逻辑上)只粘贴选定和复制的单元格,因此会自动跳过空白。我现在剩下的唯一问题是(请参阅上面新添加的 VBA 代码)如何仅复制 NewRange 并将其粘贴到我选择的工作表中的某个范围内。有什么想法吗?
    【解决方案3】:

    这样就可以了:

    Sub RangeCopyPaste()
      Dim cell As Range
      Dim NewRange As Range
      Dim MyCount As Long
      MyCount = 1
    
      For Each cell In Worksheets("Sheet1").Range("B1:B30")
          If cell.Value = "YES" Then
              If MyCount = 1 Then Set NewRange = cell.Offset(0,-1)
              Set NewRange = Application.Union(NewRange, cell.Offset(0,-1))
              MyCount = MyCount + 1
          End If
      Next cell
    
      NewRange.Copy Destination:=activesheet.Range("D1")
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 2014-03-16
      • 2018-04-22
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多