VBA从dynamic范围的范围值

我试图做一个范围值“粘贴”,而不使用复制/粘贴function。 我相当新的VBA,不明白为什么我的代码不起作用。 对不起,如果这是一个已经回答的问题,但我不能把我的问题与其他职位。

我可以select我想要我的值复制和粘贴的范围

name_task = [code].select name_task_2 = [code].select 

但是我不能将值写入name_task_2

 name_task_2 = name_task.value 

这是有效的,对我来说,我写的是相同的更复杂的,但因为它不工作,显然是不一样的:D

 sht2.Range("C2:D12") = sht1.Range("A8:B18").value 

Excel工作表1

 Sub Time_Estimate() Application.ScreenUpdating = False Dim name_task As Variant Dim name_task_2 As Variant Dim R_count As Double Dim C_count As Double Dim sht1 As Worksheet Dim sht2 As Worksheet Set sht1 = Sheet1 'Sheets("Tekla_2016") name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)) R_count = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)).Rows.Count 'Debug.Print name_task.Rows.Count 'Debug.Print name_task.Columns.Count Debug.Print R_count Set sht2 = Sheet2 'Sheets("Timeforbruk_2016 - UFERDIG") name_task_2 = sht2.Range("C2:D2", sht2.Range("C2:D2").Offset(R_count - 1, 0)) 'name_task_2 = name_task.value 'Why doesn't this work??? 'sht2.Range("C2:D12") = sht1.Range("A8:B18").value 'This works but it's not dynamic Application.ScreenUpdating = True End Sub 

编辑:此代码现在工作,因为我想:

 Sub Time_Estimate() Application.ScreenUpdating = False Dim name_task As Range Dim name_task_2 As Range Dim rng_sht1 As Range Dim rng_sht2 As Range Dim R_count As Double Dim C_count As Double Dim sht1 As Worksheet Dim sht2 As Worksheet Set sht1 = Sheet1 'Sheets("Tekla_2016") Set sht2 = Sheet2 'Sheets("Timeforbruk_2016 - UFERDIG") Set name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)) R_count = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)).Rows.Count Set name_task_2 = sht2.Range("C2:D2", sht2.Range("C2:D2").Offset(R_count - 1, 0)) name_task_2 = name_task.value Application.ScreenUpdating = True End Sub 

 someRange.Select 

select范围someRange并返回布尔值True (您通常不会注意到,因为您不试图将其分配给某些东西)。 那意味着之后

 name_task = [code].select name_task_2 = [code].select 

name_taskname_task_2都是布尔值( True ),而不是范围。

在你贴的你有另一个问题:

 name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)) 

因为你没有指定name_task是什么(除Variant ,基本上没有什么意思),vba将使用范围的Value作为默认属性, name_task将是一个包含sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)).Value 。 要分配一个范围对象,你需要使用Set

 Set name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown)) 

来自MSDN / 这个答案 :

设置关键字 。 在VBA中,必须使用Set关键字来区分对象的赋值和赋值对象的默认属性。 由于默认属性在Visual Basic .NET中不受支持,因此不需要Set关键字并且不再支持。

这实际上是一个很好的例子,为什么使用Option Explicit是一个好主意(或者在你的情况下正确地声明variables)。 如果你声明Dim name_task As Range VBA会告诉你在正确的线路上有什么问题,故障排除变得更容易。