2013-04-23 386 views
1

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

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

+0

可以使用公式属性,只需将单元格引用添加到第二你的第一张。您可能需要遍历范围内的每个单元格。 – NickSlash 2013-04-23 12:29:12

+0

那么,为什么你不使用'= Sheet2!A1'? – user2140261 2013-04-23 13:09:30

+0

为什么不使用'myrange.formula = myrange.formula'? http://msdn.microsoft.com/en-us/library/office/ff838835.aspx – glh 2013-04-23 13:11:24

回答

1

你可以尝试像以下:

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

更新

如果范围(NAME 1和NAME)是在不同的位置,则需要相应地调整公式:

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 
+0

你在范围{' – glh 2013-04-23 13:22:31

1

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

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

这是一个宏,因此不能作为UDF从工作表中调用。另外,由于它有争论,所以不能直接调用。

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

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 
+0

谢谢!我试图测试代码,但是在哪个对象或模块中必须放置宏? – kirk 2013-04-23 13:07:20

+1

希望更新说清楚,您可能需要将“Main”重命名为更具描述性的内容:) – NickSlash 2013-04-23 13:56:45

+0

它的确如此,感谢您的努力 – kirk 2013-04-23 14:52:18