我试图在不使用复制/粘贴功能的情况下使范围值“粘贴”。我是VBA的新手,不明白为什么我的代码不起作用。对不起,如果这是一个已经回答的问题,但我无法用其他帖子解决我的问题。
我可以选择我希望我的值复制的范围,也可以用
粘贴name_task = [code].select
name_task_2 = [code].select
但是我不能用
将值写入name_task_2name_task_2 = name_task.value
这是有效的,对于我来说,我所写的东西在某种程度上更复杂,但由于它不起作用,它显然不一样:D
sht2.Range("C2:D12") = sht1.Range("A8:B18").value
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
答案 0 :(得分:3)
someRange.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 / this answer:
设置关键字。在VBA中,必须使用 Set 关键字来区分对象的赋值和对象的默认属性的赋值。由于Visual Basic .NET不支持默认属性,因此不再需要 Set 关键字,并且不再支持该关键字。
这实际上是一个很好的例子,为什么使用Option Explicit
(或者在你的情况下正确地声明变量)是个好主意。如果您声明Dim name_task As Range
VBA会告诉您在正确的位置出现问题并且故障排除变得更加容易。