VBA范围值来自动态范围

时间:2016-09-23 07:57:41

标签: excel vba range

我试图在不使用复制/粘贴功能的情况下使范围值“粘贴”。我是VBA的新手,不明白为什么我的代码不起作用。对不起,如果这是一个已经回答的问题,但我无法用其他帖子解决我的问题。

我可以选择我希望我的值复制的范围,也可以用

粘贴
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 sheet1

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

1 个答案:

答案 0 :(得分:3)

someRange.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 / this answer

  

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

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