复制相对工作表中的值

时间:2017-01-05 10:09:22

标签: excel vba excel-vba copy

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

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”。

然而,我的实际问题如下。如果我将来复制我的工作表(未来期间),我希望我始终从上一个工作表中复制单元格范围。我现在的方式,如果我复制工作表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

2 个答案:

答案 0 :(得分:0)

当你命名你的细胞时:

范围( “无所谓”)。名称= “表!名称”

而不仅仅是

范围( “无所谓”)。名称= “名称”

==>这样你可以在几张纸上给出相同的命名范围而没有任何问题

希望这有帮助。

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

答案 1 :(得分:0)

修改

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

我们假设所有工作表都被命名为" 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

此外,您可以通过添加另一个按钮来自动生成新的期间工作表,例如&#34;生成下一个期间&#34;,这将创建新的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