【问题标题】:Excel Macro - copy cells from one sheet into another based on valueExcel宏 - 根据值将单元格从一张表复制到另一张表中
【发布时间】:2016-06-13 21:27:36
【问题描述】:

我想根据一列中的值将单元格从一张表复制到另一张表中。问题是我想复制值而不是公式,但我无法让 Destination 命令与 Pastespecial 一起使用。到目前为止,我有:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _
Cancel As Boolean)

Dim i, LastRow

LastRow = Range("A" & Rows.Count).End(xlUp).Row

Sheets("Available").Cells.ClearContents

For Each c In Range("A1:A" & LastRow)

If UCase(c.Offset(0, 1).Value) = "Not Sold" Then

Range("A" & c.Row & ":" & "G" & c.Row).Copy _

Destination:=Sheets("Available").Range("A" & Rows.Count) _

.End(xlUp).Offset(1)

End If

Next c

Target.Offset(1).Select
End Sub

我还想复制带有值的单元格上方的一些单元格,并将其添加到复制到新工作表的行的右侧。

任何帮助将不胜感激。

【问题讨论】:

  • 问题出在UCase(c.Offset(0, 1).Value) = "Not Sold"。 UCase 意味着该词将是全部大写。将 "Not Sold" 更改为 "NOT SOLD" 或删除 UCase 包装器。

标签: excel macros vba


【解决方案1】:

首先让我指出几件我认为行不通的事情,或者一个好主意。

使用If UCase(c.Offset(0, 1).Value) = "Not Sold" 应该每次都失败,因为您要转换为大写然后比较它。你要If Ucase(c.Offset(0, 1).Value) = "NOT SOLD"

其次,您将iLastRow 设置为Variants,而不是Integers,我相信这就是您想要的。从技术上讲不是问题,但我不喜欢未知变量。你似乎也没有使用i,除非我忽略了一些东西。

最后,为了准确找到最后一行,我会使用

lastRow = Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).row

这是查找我所知道的最后一行的最可靠方法,实际上是found right here on stack.

现在,对于实际代码本身,这是我的建议。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean)

    Dim i, LastRow as Integer
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Set ws1 = ActiveSheet
    Set ws2 = Sheets("Available")

    i = 1

    LastRow = ws1.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

    ws2.Cells.ClearContents

    For Each c In Range(Cells(1,2), Cells(LastRow, 2))
        If UCase(c.Value) = "NOT SOLD" Then
            ws2.Range(ws2.Cells(i, 1), ws2.Cells(i, 7)).Value = ws1.Range( _
                ws1.Cells(c.Row, 1), ws1.Cells(c.Row, 7)).Value
            i = i + 1
        End If
    Next c

    Target.Offset(1).Select 

End Sub

【讨论】:

  • 感谢您的回答,但它不喜欢以下 2 行: ws2.Range(Cells(i, 1), Cells(i, 7)).Value = Range( _ Cells( c.Row, 1), Cells(c.Row, 7)).Value
  • 将它们压缩成一行。 ws2.Range(Cells(i, 1), Cells(i, 7)).Value = Range(Cells(c.Row, 1), Cells(c.Row, 7)).Value 我的多行格式可能有误。
  • 还是不开心……我看看能不能把格式排好。
  • 这仍然不适合我。有人可以帮忙吗。
  • @ImadAli 抱歉,我意识到 i 已声明,但从未设置为值,因此当它尝试复制值时,它没有有效的单元格。我已经更正了代码。
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多