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_task
和name_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会告诉你在正确的线路上有什么问题,故障排除变得更容易。