【问题标题】:Copy/Paste Item onto another sheet based on a single cell value根据单个单元格值将项目复制/粘贴到另一张纸上
【发布时间】:2019-01-29 03:12:38
【问题描述】:

我正在尝试创建一个宏,该宏根据单个单元格的值 (B2) 将我的“后端”工作表的(A 列)中的项目复制/粘贴到我的“后端 2”工作表上。为了提供一些背景信息,我预测了建筑楼层的数据,并尝试重新格式化我的电子表格,以便 Tableau 将日期读取为“维度”。为了实现这一点,我需要一个宏,它可以在预测的 15 个月内复制/粘贴我的 83 层数据 15 次。我还想要参考单元格 (B2),以便我可以在需要时将月份添加到预测中。谢谢!

复制自:

粘贴到:


当前答案允许我复制一个值类型“地板”,但我想知道是否可以运行一个宏来根据复制数量复制/粘贴整行。请参考以下示例。我在工作表 1 上有 3 个独特的团队,我想根据工作表 2 上的单元格 L2 将它们复制四次。

之前(表 1)

之后(表 2)

【问题讨论】:

  • B 中的单个值是您将A 中的每个值乘以的因素吗?
  • 是的。我重新编辑了我的问题,以显示我想要复制的图像,以显示我想要粘贴的样子。在此示例中,我希望将项目粘贴 3 次。我假设如果我可以为一个“楼层”做到这一点,我就可以使用循环?我不确定什么是最好的方法。
  • 复制列中是否只有一个值?否则我不知道你会如何处理这个
  • 简单地回答你的问题,是的。从本质上讲,我有 83 个建筑楼层的数据(我想不加选择地处理),并尝试使用 Tableau 进行可视化预测。但为了让 Tableau 将日期标识为“维度”,我需要每个楼层的日期字段。所以在这种情况下,我正在创建一个 15 个月的预测,这意味着我需要每个楼层重复 15 次。 B2 是一个参考单元格,以防我必须在预测中添加更多月份。感谢您与我们联系!
  • 哦,好吧,那就让这变得又好又容易,我现在就解决这个问题,哈哈

标签: vba excel excel-2007 copy-paste


【解决方案1】:

这应该适合你:

Sub floors()

    Dim ws1 As Worksheet
    Set ws1 = sheets("Bcknd")

    Dim ws2 As Worksheet

    If Not sheetExists("Migration Plan Data Extract") Then
        sheets.Add After:=ws1
        Set ws2 = sheets(ws1.index + 1)
        ws2.name = "Migration Plan Data Extract"
    Else
        Set ws2 = sheets("Migration Plan Data Extract")
    End If

    If Len(ws1.Range("B2").Value2) > 0 And IsNumeric(ws1.Range("B2").Value2) Then
        ws2.Range("A1").Value2 = ws1.Range("A1").Value2

        Dim vals As Variant
        vals = ws1.Range("A2:A" & ws1.Range("A" & Rows.Count).End(xlUp).Row).Value

        Dim i As Long
        Dim j As Long: j = 1

        For i = 1 To ws1.Range("B2").Value2 * UBound(vals)
            ws2.Range("A" & i + 1).Value2 = vals(j, 1)

            If i Mod ws1.Range("B2") = 0 Then
                j = j + 1
            End If
        Next i

    End If

End Sub

好的,这应该复制整行:)

Sub floors2()

    Dim ws1 As Worksheet
    Set ws1 = sheets("Bcknd")

    If Len(ws1.Range("L2")) > 0 And IsNumeric(ws1.Range("L2").Value2) Then

        Dim ws2 As Worksheet

        If Not sheetExists("Migration Plan Data Extract") Then
            sheets.Add After:=ws1
            Set ws2 = sheets(ws1.index + 1)
            ws2.name = "Migration Plan Data Extract"
        Else
            Set ws2 = sheets("Migration Plan Data Extract")
        End If

        ws1.Range("A1:J1").copy Destination:=ws2.Range("A1:J1")

        Dim lastRow As Long
        lastRow = ws1.Range("A" & rows.count).End(xlUp).row

        Dim rng As Range
        Set rng = ws1.Range("A2:J" & lastRow)

        Dim currentRow As Long: currentRow = 2

        Dim i As Long
        Dim j As Long
        For i = 1 To rng.rows.count
            For j = 1 To ws1.Range("L2").Value2
                rng.rows(i).copy Destination:=ws2.Range("A" & currentRow)
                currentRow = currentRow + 1
            Next j
        Next i

    End If

End Sub

两者都使用此子程序查看工作表“迁移计划数据提取”是否已存在

Function sheetExists(sheetToFind As String) As Boolean

    sheetExists = False

    Dim sheet As Worksheet
    For Each sheet In Worksheets
        If sheetToFind = sheet.name Then
            sheetExists = True
            Exit Function
        End If
    Next sheet

End Function

【讨论】:

  • 要为您选择合适的工作表,只需将sheets(1) 中的1 替换为带引号的工作表名称,例如sheets("sheet name")
【解决方案2】:

根据我的测试,文字代码类似于以下内容。 将 soucreSheet 和 targetWorksheet 修改为您的

Sub Test11()

Dim rowCount As Long
Dim sourceSheet As Worksheet
Dim targetWorksheet As Worksheet
Dim copyTimes As Integer

  Set sourceSheet = Worksheets("Sheet11")
  Set targetWorksheet = Worksheets("Sheet12")
    rowCount = targetWorksheet.Cells(Rows.Count, 1).End(xlUp).row

    copyTimes = CInt(sourceSheet.Cells(2, 2).Value)

    For i = 2 To sourceSheet.UsedRange.Rows.Count
        MsgBox sourceSheet.Cells(i, 1).Value
        sourceSheet.Cells(i, 1).Copy
        For j = 1 To copyTimes
            targetWorksheet.Activate
            targetWorksheet.Cells(rowCount + 1, 1).Select
            targetWorksheet.Paste
            rowCount = rowCount + 1
        Next

            sourceSheet.Activate
    Next

    Application.CutCopyMode = False
End Sub

【讨论】:

  • 感谢 Seiyu 花时间创建代码。我应该提供更多背景信息。我有一份需要复制粘贴的 83 个建筑楼层的清单。所以 msgbox 很有帮助,但是对于这个过程来说有点太多了。另外,我希望宏在到达最后一层或第一个空白单元格时停止。再次感谢!
  • 经过一些研究,我发现“调整大小”比“粘贴”更好。所以我登陆了以下代码。不过代码只贴一楼。所以我放置了一个循环代码,但它给了我相同的结果: Sub Test1() Dim x As Integer NumRows = Range("A1", Range("A1").End(xlDown)).Rows.Count Range(" A1").Select For x = 1 To NumRows Dim y As Long y = Sheets("Backend").Range("D1").Value Worksheets("Backend 2").Range("A2").Resize(y ).Value = Worksheets("Backend").Range("A1").Value ActiveCell.Offset(1, 0).Select Next End Sub
  • 我的电脑没有开发环境。我明天需要测试你的新环境。您应该将上下文更新为您的问题,但 commnets
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多