使用VBA动态设置范围等于另一个范围

时间:2013-04-23 11:57:43

标签: excel vba reference

我想设置一个单元格范围,参考命名范围name1,等于另一个Excel工作表上同样大小的单元格范围,同样引用命名范围name2。我希望Sheet1中的单元格等于Sheet2当前等于的相应单元格,因此我不能使用.value属性。

Sheets("Sheet1").Range("name1").Offset(0, 1).Resize(15, 5) = Sheets("Sheet2").Range("name2").Offset(0, 1).Resize(15, 5).value

除此之外,我不想使用价值。有这么简单的方法来做我需要的吗?我搜索了一些论坛,但找不到一个很好的方法来做到这一点。我是否需要使用For eachR1C1命名?重申一下 - sheet1上的单元格应该等于sheet2上相对单元格的值(范围大小相同)。所以,例如。单元格Sheet1!A1的公式为=Sheet2!A1

2 个答案:

答案 0 :(得分:1)

您可以尝试以下内容:

Sheets("Sheet1").Range("name1").Offset(0, 1).Resize(15, 5).FormulaR1C1 = "=Sheet2!R[0]C[0]"

<强>更新

如果范围(name1和name2)位于不同的位置,则需要相应地调整公式:

Dim nRowOffset As Long
Dim nColOffset As Long
Dim sFormula As String
nRowOffset = Sheets("Sheet2").Range("name2").Row - Sheets("Sheet1").Range("name1").Row
nColOffset = Sheets("Sheet2").Range("name2").Column - Sheets("Sheet1").Range("name1").Column
sFormula = "=Sheet2!R[" & nRowOffset & "]C[" & nColOffset & "]"
Sheets("Sheet1").Range("name1").Offset(0, 1).Resize(15, 5).FormulaR1C1 = sFormula

答案 1 :(得分:1)

我只是对此进行了一些测试,因此它可能不那么强大。

注意此子需要放在新的(或现有的)模块中,而不是放在任何工作表或本工作簿模块中。

这是一个宏,因此无法从工作表中调用为UDF。此外,由于它有参数,因此无法直接调用。

要使用您需要的代码来创建另一个sub来为您调用它,或者直接从即时窗口调用它。

Sub RunCode()
    Main "Name1", "Name2" ' you could run this line in the immediate/debug window
End Sub

RunCode应该可以在工作簿的宏菜单中找到。

Sub Main(ByVal Name1 As String, ByVal Name2 As String)
Dim Cell As Long
Dim Range1 As Range: Set Range1 = ThisWorkbook.Names(Name1).RefersToRange
Dim Range2 As Range: Set Range2 = ThisWorkbook.Names(Name2).RefersToRange
' check to make sure Name1 and Name2 are the same size
If Range1.Cells.Count = Range2.Cells.Count Then 
    If Range1.Rows.Count = Range2.Rows.Count Then
        If Range1.Columns.Count = Range2.Columns.Count Then
            ' populate the cells with the formula
            For Cell = 1 To Range1.Cells.Count
                Range2.Cells(Cell).Formula = "=" & Range1.Worksheet.Name & "!" & Range1.Cells(Cell).Address
            Next Cell
        End If
    End If
End If

End Sub

如果您想要更多可自定义的函数接口,那么以下代码应该有所帮助。运行RunCode2宏将提示您输入要传递给Main

的两个名称
Public Function nameExists(ByVal Name As String) As Boolean
Dim Result As Boolean: Result = fasle
Dim Item As Variant
For Each Item In ThisWorkbook.Names
    If Item.Name = Name Then
        Result = True
        Exit For
    End If
Next Item
nameExists = Result
End Function

Sub RunCode2()
Dim Response As Variant
Dim Name1, Name2 As String
Response = Application.InputBox(Prompt:="Name 1", Type:=2)
If VarType(Response) = vbBoolean Then
    Debug.Print "RunCode2 - User Canceled Name 1 Selection"
    Exit Sub
Else
    If nameExists(Response) = False Then
        MsgBox "Name [" & Response & "] Not Found", vbOKOnly
        Exit Sub
    Else
        Name1 = Response
    End If
End If
Response = Application.InputBox(Prompt:="Name 2", Type:=2)
If VarType(Response) = vbBoolean Then
    Debug.Print "RunCode2 - User Canceled Name 2 Selection"
    Exit Sub
Else
    If nameExists(Response) = False Then
        MsgBox "Name [" & Response & "] Not Found", vbOKOnly
        Exit Sub
    Else
        Name2 = Response
    End If
End If
Main Name1, Name2
End Sub