【问题标题】:Copy values across relative worksheets跨相关工作表复制值
【发布时间】:2017-03-06 05:25:42
【问题描述】:

我想将一个工作表中的一系列值复制到另一个工作表的指定范围内,而值始终来自上一个工作表(在工作表行中),即使在复制工作表之后也是如此。我正在使用以下内容将值从一个工作表复制到另一个工作表,这似乎可行:

Sub Copy_ultimo_stock()

'copy values between two periods
Worksheets("Period2").Range("test3").Value = Worksheets("Period1").Range("test2").Value

End Sub

我必须为单元格范围命名(test2 和 test3),因为如果我使用像“R10:S11”这样的实际单元格范围,宏将不起作用。然而,在未来,我只想将单元格范围用作“R10:S11”。

然而,我的实际问题如下。如果我将来复制我的工作表(用于未来期间),我希望我总是从 previous 工作表中复制单元格范围。我现在的做法是,如果我复制工作表 period2,并将其称为 period6,它仍会从 period1 工作表中复制值。但是,我希望当前工作表“n”将复制工作表“n-1”范围内的值。

我找到了一种可能有所帮助的类似方法,但我无法将两个宏合并为一个。这种方法就在这里:

Function PrevSheet(rCell As Range)
    Application.Volatile
    Dim i As Integer
    i = rCell.Cells(1).Parent.Index
    PrevSheet = Sheets(i - 1).Range(rCell.Address)
End Function

【问题讨论】:

    标签: vba excel copy


    【解决方案1】:

    编辑

    所以你的要求是一个从“上一张表”导入的宏,这样当你点击按钮时,子程序首先从当前获取上一张并相应地获取值。

    我们将假设所有工作表都命名为“periodx”,其中 x 是标识周期的整数。当我们创建一个新的工作表副本时,我们需要首先以“periodx”的形式重命名新的工作表,然后单击按钮从工作表“periody”中获取值,其中 y = x-1。

    只需用这个替换您的按钮处理程序Copy_ultimo_stock()

    Sub Copy_ultimo_stock()
        Dim wsCur As Worksheet, wsPrev As Worksheet
        Set wsCur = ActiveSheet
        ' We will suppose that all Worksheets are named like "periodx"
        ' where x is an integer identifying the period
        On Error Resume Next ' try fetching the previous ws as "periody" where y = x-1
        Dim x As Integer: x = CInt(Mid(wsCur.Name, Len("period") + 1))
        Set wsPrev = ThisWorkbook.Sheets("period" & (x - 1))
        If Err.Number <> 0 Then
           msgBox "Could not find the previous worksheet, Please check Worksheet names"
           Exit Sub
        End If
        On Error GoTo 0
    
        ' Now we copy the previous values. You can customize the ranges if the design changes
        wsCur.Range("D2:L8").Value = wsPrev.Range("D10:L16").Value
    
    End Sub
    

    此外,您可以通过添加另一个按钮来自动生成新的期间工作表,例如“生成下一个期间”,这将创建新的 ws 并为其指定适当的名称。这将为用户节省复制工作表和重命名的任务。新按钮的代码如下:

    Sub create_next_period()
        Dim wsCur As Worksheet, wsNext As Worksheet
        Set wsCur = ActiveSheet
    
        On Error Resume Next
        Dim x As Integer: x = CInt(Mid(wsCur.Name, Len("period") + 1))
        If Err.Number <> 0 Then
           msgBox "Please check Worksheet name. It should be named periodx"
           Exit Sub
        End If
    
        Set wsNext = ThisWorkbook.Sheets("period" & (x + 1))
        If Err.Number = 0 Then
           msgBox "The worksheet " & wsNext.Name & " already exists"
           Exit Sub
        Else
            Err.Clear
            wsCur.Copy After:=Worksheets(Worksheets.Count)
            Set wsNext = Worksheets(Worksheets.Count)
            wsNext.Name = "period" & (x + 1)
            wsNext.Activate
            Call Copy_ultimo_stock
        End If
    End Sub
    

    【讨论】:

    • 感谢您的回答。由于我在 VBA 方面基本上是文盲,因此我无法理解您的建议。我在自己的帖子和 excel 文件中使用的 VBA 部分只是从其他解释了如何操作的用户那里复制而来的。我真的无法修改现有 VBA 中的任何内容。是否可以编写 VBA 代码以便我可以复制它并在我的文件中工作?然后我会改变范围,使它们与我的单元格匹配。我知道我的方法对工作表的顺序非常敏感。它们将根据月份命名,这样会有所帮助。
    • @Jauheliha 我觉得我没有完全理解你的目标。我想现在我有了更好的主意,但我建议你展示一些工作表的快照以及单元格之间的关系。我现在的感觉是,你想要类似的东西,比如说,在 sheet3 中,单元格 F4 将等于单元格 E4 在上一张表中,类似的东西。
    • 感谢您的持续输入ASH!我这里有一些截图可以帮助你理解我的问题。我将屏幕截图简化为重要部分。实际的 excel 文件有点复杂,但这应该足以理解。您可以查看期间 1,2 和 3 的工作表。我的 makro 在单击后所做的操作是将“期间 1 当前期间”中的值复制到“期间 2 上一期间”中。这很好用。但是:如果我复制工作表“Period 2”并将其命名为“Period 3”(我已经完成),然后单击按钮...dropbox.com/sh/mtki4lf39gealha/AADssIuEq4IVJ47yE46ZAWxIa?dl=0
    • ...在工作表Period 3 中,它将复制来自Period 1 的值。然而,我的愿望是,它会从Period 2 中获取值。将来,还会有几十张要创建的工作表。因此,我的最终目标是始终从 previous 表中复制值,而不是像 Period 1 这样的绝对表引用。因为每次复制工作表时都必须更改宏。这有点像只需单击按钮即可将材料从一个时期翻转到下一个时期。 (我知道在这种情况下,您似乎可以只使用 CTRL+C 值,但实际模型...
    • 复制股票的宏就像一个魅力,谢谢!我也尝试使用宏来创建下一个时期,但它只复制了指定的单元格范围,但没有复制工作表中的格式或所有其他单元格(工作表更大,并且具有比摘录中显示的更多表格截屏)。不过我找到了另一种方法,如下所示:Sub CopySheet_End() ActiveSheet.Copy After:=Worksheets(Worksheets.Count) End Sub 唯一的问题是工作表的命名不正确......
    【解决方案2】:

    当你命名你的单元格时:

    Range("whatever").name="Sheet!Name"

    不只是

    Range("whatever").name="Name"

    ==> 这样您就可以毫无问题地在多张纸上给出相同的命名范围

    希望这会有所帮助。

    但是我不建议使用太多命名范围...

    【讨论】:

    • 感谢您的建议。我也更喜欢不使用任何命名范围,但在这种情况下,我必须给范围命名,因为由于某种原因,否则它将无法工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2016-12-23
    • 2022-11-22
    • 2013-12-22
    相关资源
    最近更新 更多