我希望将一个工作表中的值范围复制到另一个工作表的指定范围中,而值总是来自以前的工作表(工作表行中),即使在复制工作表之后也是如此。我使用以下方法将值从一个工作表复制到另一个工作表,这似乎有效:
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
发布于 2017-01-05 02:44:04
编辑
因此,您需要的是一个从“前一个工作表”导入的宏,因此当您单击按钮时,子例程首先从当前获取前一个表,然后相应地获取值。
我们将假设所有工作表都被命名为“周期”,其中x是标识周期的整数。创建新工作表副本时,首先需要将新工作表重命名为“周期”,然后单击按钮从工作表"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
发布于 2017-01-05 02:18:36
当你给你的细胞起名字的时候:
范围(“任何”).name=“工作表!名称”
而不仅仅是
范围(“任何”).name=“名称”
==>通过这种方式,您可以在几张单张上给出相同的命名范围,而不存在任何问题。
希望这能有所帮助。
不过,我不会建议使用太多的命名范围.
https://stackoverflow.com/questions/41482194
复制