在相关工作表中复制值

我想从一个工作表复制一个范围的值到另一个工作表的指定范围,而值总是来自以前的工作表(在工作表行),即使在复制工作表之后。 我正在使用以下从一个工作表复制到另一个,这似乎工作的值:

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”这样的实际单元格范围,macros将不起作用。 在未来,我只想使用单元格范围作为“R10:S11”。

我的实际问题是以下。 如果我将来复制我的工作表(对于未来的时间段),我希望我总是复制上一个工作表的单元格范围。 现在我已经做到了,如果我复制工作表period2,并且可能是period6,它仍然会复制period1工作表中的值。 但是,我希望当前工作表“n”将复制工作表“n-1”中范围的值。

我发现了一个有点类似的方法可以帮助,但我不能将两个macros组合成一个。 这个方法在这里:

 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 

编辑

所以你需要的是一个从“上一张”导入的macros,所以当你点击button时,子程序首先从当前获取前一个,并相应地获取这些值。

我们假设所有的工作表都被命名为“periodx”,其中x是一个标识句点的整数。 当我们创build一个新的工作表副本时,我们首先需要以“periodx”的forms重命名新的工作表,然后点击button从工作表“periody”中获取值,其中y = x-1。

只要用这个replace你的button处理程序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 

此外,您可以通过添加另一个button(例如“生成下一个期间”)来自动生成新期间工作表,该button将创build新的ws并为其指定适当的名称。 这将为用户保存复制工作表并重命名工作。 新button的代码将如下所示:

 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 

当你给你的单元格命名时:

范围( “什么”)。NAME = “表!名称”

而不仅仅是

范围(“什么”)。名称=“名称”

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

希望这可以帮助。

不过,我不会build议使用太多的命名范围…