【问题标题】:Copy paste specific cell values from one work sheet to another based on a specific criteria根据特定条件将特定单元格值从一个工作表复制粘贴到另一个工作表
【发布时间】:2020-06-11 20:00:57
【问题描述】:

我已经有一段时间没有做任何类型的编码了,所以我很生疏。 我正在尝试编写一些 VBA 代码,以便在 Excel 工作表中单击一个按钮时,它将检查同一工作簿中的另一个工作表和特定单元格值的副本。这是基于其中一列中的标准(我数了第 15 列);我可能应该补充一点,数据在表格中。如果该行符合第 15 列中的指定条件,则使用按钮将特定列复制到工作表中。

我确实有一些代码,但我知道其中缺少很多东西。

不胜感激,我在正确的轨道上吗?任何人都可以在那里提供帮助,我可以获得有关我需要使用的编码的更多信息和提示。不确定是否有使用表格的简单方法?

Private Sub CommandButton1_Click()

''This will count how many rows are populated in the table''
a = Worksheets("Billable").Cells(Rows.Count, 1).End(xlUp).Row

''Loop will run from row 6 to the last row (Row 6 is the first row in table)''
For i = 6 To a
    ''If statement which will check the status column for Detailed Estimate Submitted > column 15''
    If Worksheets("Billable").Cells(i, 15).Value = "Detailed Estimate Submitted" Then
      Worksheets("Billable").Rows(i).Copy
      Worksheets("PM_Forecast").Activate
      b = Worksheets("PM_Forecast").Cells(Rows.Count, 1).End(xlUp).Row
      Worksheets("PM_Forecast").Cells(a + 1, 1).Select
      ActiveSheet.Paste
    End If
Next

Application.CutCopyMode = False

End Sub

表格示例:- 如果它们满足状态列中的特定条件,我只需要复制超过 3 列

【问题讨论】:

  • 您也需要复制格式/公式吗?还是只有价值观?我问的是为了了解可以使用最快的复制方法(使用数组)...
  • 我认为这可以通过公式来实现。如果您可以提供工作表样本和预期结果,将会有所帮助
  • 我只需要将单元格中的值在满足特定 cireteria 时复制到工作表中。我需要每隔几天运行一次,因此每次复制信息之前可能都需要清除工作表。在问题中添加了表格示例

标签: excel vba


【解决方案1】:

你没有回答我关于格式粘贴的问题...

所以,请测试下一个以经典方式粘贴的代码。但是没有选择和声明所有使用的变量:

Private Sub CommandButton1_Click()
 Dim shB As Worksheet, shPM As Worksheet, lastRowB As Long, lastRowPM As Long
 Dim i As Long, lastCol As Long

 Set shB = Worksheets("Billable")
 Set shPM = Worksheets("PM_Forecast")

 lastRowB = Worksheets("Billable").Cells(Rows.Count, 1).End(xlUp).row

 'Loop will run from row 6 to the last row (Row 6 is the first row in table)''
 For i = 6 To lastRowB
    If shB.Cells(i, 15).Value = "Detailed Estimate Submitted" Then
        lastCol = shB.Cells(i, Columns.Count).End(xlToLeft).Column
        lastRowPM = shPM.Cells(Rows.Count, 1).End(xlUp).row
        shB.Range(shB.Range("A" & i), shB.Cells(i, lastCol)).Copy _
                                   shPM.Cells(lastRowPM + 1, 1)
    End If
 Next
 Application.CutCopyMode = False
End Sub

对于使用变体的数组,您只能声明一个新变量Dim arr As Variant 并替换这部分:

shB.Range(shB.Range("A" & i), shB.Cells(i, lastCol)).Copy _
                                   shPM.Cells(lastRowPM + 1, 1)

用这个:

arr = shB.Range(shB.Range("A" & i), shB.Cells(i, lastCol)).Value
shPM.Cells(lastRowPM + 1, 1).Resize(, UBound(arr, 2)).Value = arr

然后,删除代码行Application.CutCopyMode = False。没有必要了,因为剪贴板内存没有被使用...

并在模块顶部使用Option Explicit。当代码变得复杂时,它将为您节省很多倍。

【讨论】:

  • 谢谢,是的,您上面的代码有效。这是比我更好的方法吗?使用数组更好吗?不确定。我现在需要弄清楚如何只复制符合 cireteria 的行中的特定单元格。
  • @user3088476:我会说,是的,它是......声明所有变量有助于 VBA 消耗更少的资源并阻止你犯一些错误。那么,选择和激活只是消耗Excel资源,并没有带来任何好处。它们只会使代码变粗/更长,并且在出现问题时更难以调试。数组方式仅在内存中有效,因此速度非常快。如果您要处理大尺寸范围,您可以看到差异。但是如果可能的话,最好养成每次都使用它们的习惯。
  • 感谢您的帮助,我去看看是否只有在满足条件时才能解决特定列的复制问题
【解决方案2】:

我无法发表评论,所以我将通过这个答案提出问题:

你的变量 b 当前没有被使用,我认为它应该在这一行:Worksheets("PM_Forecast").Cells(b + 1, 1).Select 但你写的是 a 而不是 b。

这能解决您当前的问题吗?

【讨论】:

  • 是的。我只想复制行中的特定单元格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多