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