【问题标题】:Copying non blank cells from sheet to another while linking another cell ref在链接另一个单元格参考时将非空白单元格从工作表复制到另一个单元格
【发布时间】:2021-10-04 23:12:19
【问题描述】:

我想将特定范围 (A2:B50) 从工作表 1 复制到工作表 2,同时忽略空白单元格。并在每列粘贴 x 行后在位于 B1 的两张表之间添加一个键。例如:

在 Sheet2 中变成这个:

在每个副本上,如果我想添加新数据,它将添加到 Sheet2 中现有数据的顶部。

这是我的代码,它不能按预期工作,有什么帮助吗?

With Sheets("Sheet1").Range("A3:B11")

.AutoFilter 1, "<>"

Dim cel As Range
For Each cel In .SpecialCells(xlCellTypeVisible)

    Sheets("Sheet2").Range("A" & cel.Row).Value = cel.Value

Next

.AutoFilter

End With

【问题讨论】:

  • 有什么帮助吗?

标签: excel vba


【解决方案1】:

未经测试,但试试这个:

Sub Tester()

    Dim lRw As Long, rw As Long, wsSrc As Worksheet, wsDest As Worksheet
    Dim cDest As Range, v, v2, k
    
    Set wsSrc = ThisWorkbook.Sheets("Sheet1")  'or activeworkbook
    Set wsDest = ThisWorkbook.Sheets("Sheet2")
    
    'next empty row on destination sheet (in "key" column, but offsetting to A))
    Set cDest = wsDest.Cells(Rows.Count, 3).End(xlUp).Offset(1, -2)
    k = wsSrc.Range("B1").Value 'key value
    
    lRw = wsSrc.Cells(Rows.Count, "A").End(xlUp).Row 'last row of source data
    For rw = 3 To lRw
        v = wsSrc.Cells(rw, 1).Value
        v2 = wsSrc.Cells(rw, 2).Value
        If Len(v) > 0 Or Len(v2) > 0 Then  'if either cell has a value 
            cDest.Value = v                'write values
            cDest.Offset(0, 1).Value = v2
            cDest.Offset(0, 2).Value = k   'write key
            Set cDest = cDest.Offset(1, 0) 'next destination row
        End If
    Next rw
End Sub

已编辑 - 对于任何指定数量的源列:

Sub Tester()
    Const NUM_COLS As Long = 3 'or whatever
    
    Dim lRw As Long, rw As Long, wsSrc As Worksheet, wsDest As Worksheet
    Dim cDest As Range, k
    
    Set wsSrc = ThisWorkbook.Sheets("Sheet1")  'or activeworkbook
    Set wsDest = ThisWorkbook.Sheets("Sheet2")
    
    'next empty row on destination sheet (in "key" column, but offsetting to A))
    Set cDest = wsDest.Cells(Rows.Count, NUM_COLS + 1).End(xlUp).Offset(1, -NUM_COLS)
    
    k = wsSrc.Range("B1").Value 'key value
    
    lRw = wsSrc.Cells(Rows.Count, "A").End(xlUp).Row       'last row of source data
    For rw = 3 To lRw                                      'loop over source rows
        With wsSrc.Cells(rw, 1).Resize(1, NUM_COLS)
            If Application.CountA(.Cells) > 0 Then         'if any cell has a value
                cDest.Resize(1, NUM_COLS).Value = .Value   'write values
                cDest.Offset(0, NUM_COLS).Value = k        'write key
                Set cDest = cDest.Offset(1, 0)             'next destination row
            End If
        End With
    Next rw
End Sub

【讨论】:

  • 我设法让它工作,但我不能让它复制超过两列,我改变了这些,它仍然没有工作。 Dim cDest As Range, v, v2, v3, k and v3 = wsScr.Cells(rw, 3).Value and wsDest.Cells(Rows.Count, 4) 如何将复制范围从两列增加到超过两个?
  • 有什么帮助吗?
  • 非常感谢您宝贵的时间。它有效,但有一个问题。这部分:如果 Application.CountA(.Cells) > 0 我使用宏清除单元格并将其替换为“”,它不算作真正的空白。如果您对空单元格进行测试,它将返回 FALSE。尽管没有任何价值。旧代码“If Len(v) > 0 Or Len(v2) > 0 Then”可以完美运行。我尝试将其更改为:“如果 Application.CountBlank(.Cells) = 0 Then”,它仍然不会忽略空的非真正空白单元格。
  • 非虚拟机。通过将我的第二个宏 .Value="" 更改为 .Clear 来修复它非常感谢
猜你喜欢
  • 1970-01-01
  • 2017-02-18
  • 2012-08-04
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多