使用VBAdynamic设置范围等于另一个范围

我想设置一个引用命名范围name1的单元格区域,该单元格的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 

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

你可以尝试如下的东西:

 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 

我只testing了一下,所以它可能不是那么强大。

注意这个子部分需要被放置在一个新的(或现有的)模块中,而不是放在任何一个工作表或这个工作簿模块中。

这是一个macros,因此不能从工作表中作为UDF调用。 而且,由于它有争议,所以不能直接调用。

要使用代码,您需要创build另一个子项来为您调用它,或直接从直接窗口调用它。

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

RunCode应该在工作簿中的macros菜单中可用。

 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 

如果你想稍微更多的定制接口的function,那么下面的代码应该帮助。 运行RunCode2macros将提示您input两个名称传递给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