Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 跨相关工作表复制值_Vba_Excel_Copy - Fatal编程技术网

Vba 跨相关工作表复制值

Vba 跨相关工作表复制值,vba,excel,copy,Vba,Excel,Copy,我希望将一个工作表中的一系列值复制到另一个工作表的指定范围中,而值总是来自上一个工作表(在工作表行中),即使在复制工作表之后也是如此。我使用以下方法将值从一个工作表复制到另一个工作表,这似乎很有效: Sub Copy_ultimo_stock() 'copy values between two periods Worksheets("Period2").Range("test3").Value = Worksheets("Period1").Range("test2").Value End

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

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

命名单元格时,请执行以下操作:

范围(“任意”).name=“工作表!名称”

不仅仅是

范围(“任意”).name=“name”

==>通过这种方式,您可以在多张图纸上给出相同的命名范围,而不会出现任何问题

希望这有帮助


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

当您命名单元格时,请执行以下操作:

范围(“任意”).name=“工作表!名称”

不仅仅是

范围(“任意”).name=“name”

==>通过这种方式,您可以在多张图纸上给出相同的命名范围,而不会出现任何问题

希望这有帮助

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

编辑

因此,您的需求是一个从“上一页”导入的宏,因此当您单击按钮时,子例程首先从当前页获取上一页,并相应地获取值

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

只需将您的按钮处理程序
Copy\u ultimo\u 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
Sub Copy\u ultimo\u stock()
将wsCur设置为工作表,将wsPrev设置为工作表
设置wsCur=ActiveSheet
'我们假设所有工作表的名称都类似于“periodx”
'其中x是标识周期的整数
在出现错误时,请“继续下一步”尝试将上一个ws提取为“周期”,其中y=x-1
作为整数的Dim x:x=CInt(Mid(wsCur.Name,Len(“period”)+1))
设置wsPrev=thispoolk.Sheets(“期间”和(x-1))
如果错误号为0,则
msgBox“找不到上一个工作表,请检查工作表名称”
出口接头
如果结束
错误转到0
'现在我们复制以前的值。如果设计发生更改,可以自定义范围
wsCur.Range(“D2:L8”).Value=wsPrev.Range(“D10:L16”).Value
端接头
此外,您可以通过添加另一个按钮(如“Generate Next period”)来自动生成新的周期工作表,该按钮将创建新的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
Sub-create\u next\u period()
将wsCur设置为工作表,将wsNext设置为工作表
设置wsCur=ActiveSheet
出错时继续下一步
作为整数的Dim x:x=CInt(Mid(wsCur.Name,Len(“period”)+1))
如果错误号为0,则
msgBox“请检查工作表名称。它应命名为periodx”
出口接头
如果结束
设置wsNext=thiswoolk.Sheets(“期间”和(x+1))
如果Err.Number=0,则
msgBox“工作表”&wsNext.Name&“已存在”
出口接头
其他的
呃,明白了
wsCur.Copy After:=工作表(Worksheets.Count)
设置wsNext=工作表(Worksheets.Count)
wsNext.Name=“period”和(x+1)
下一步。激活
调用副本\u ultimo\u库存
如果结束
端接头
编辑

因此,您的需求是一个从“上一页”导入的宏,因此当您单击按钮时,子例程首先从当前页获取上一页,并相应地获取值

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

只需将您的按钮处理程序
Copy\u ultimo\u 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
Sub Copy\u ultimo\u stock()
将wsCur设置为工作表,将wsPrev设置为工作表
设置wsCur=ActiveSheet
'我们假设所有工作表的名称都类似于“periodx”
'其中x是标识周期的整数
在出现错误时,请“继续下一步”尝试将上一个ws提取为“周期”,其中y=x-1
作为整数的Dim x:x=CInt(Mid(wsCur.Name,Len(“period”)+1))
设置wsPrev=thispoolk.Sheets(“期间”和(x-1))
如果错误号为0,则
msgBox“找不到上一个工作表,请检查工作表名称”
出口接头
如果结束
错误转到0
'现在我们复制以前的值。如果设计发生更改,可以自定义范围
wsCur.Range(“D2:L8”).Value=wsPrev.Range(“D10:L16”).Value
端接头
此外,您可以通过添加另一个按钮(如“Generate Next period”)来自动生成新的周期工作表,该按钮将创建新的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
Sub-create\u next\u period()
将wsCur设置为工作表,将wsNext设置为工作表
设置wsCur=