Excel 动态范围中的VBA范围值

Excel 动态范围中的VBA范围值,excel,vba,range,Excel,Vba,Range,我试图在不使用复制/粘贴功能的情况下创建范围值“粘贴”。我对VBA相当陌生,不明白为什么我的代码不能工作。我很抱歉,如果这是一个已经回答过的问题,但我无法通过其他帖子解决我的问题 我可以选择要从中复制和粘贴值的范围 name_task = [code].select name_task_2 = [code].select 但是我不能用值来命名任务2 name_task_2 = name_task.value 这是可行的,对我来说,我写的东西是一样的,只是更复杂,但既然它不起作用,显然就不一样

我试图在不使用复制/粘贴功能的情况下创建范围值“粘贴”。我对VBA相当陌生,不明白为什么我的代码不能工作。我很抱歉,如果这是一个已经回答过的问题,但我无法通过其他帖子解决我的问题

我可以选择要从中复制和粘贴值的范围

name_task = [code].select
name_task_2 = [code].select
但是我不能用值来命名任务2

name_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 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
,并返回布尔值
True
(您通常不会注意到这一点,因为您没有尝试将其分配给某个对象)。也就是说

name_task = [code].select
name_task_2 = [code].select
name_task
name_task_2
都是布尔值(
True
),而不是范围

在您发布的sub中,您还有另一个问题:

name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown))
由于您没有指定
name\u task
是什么(除了
Variant
,它基本上没有任何意义),vba将使用范围的
值作为默认属性,
name\u task
将是包含
sht1.range(“A8:B8”,sht1.range(“A8”).End(xlDown)).Value的变量数组。要指定范围对象,您需要使用
Set

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

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


这实际上是一个很好的例子,说明了为什么使用
选项Explicit
(或者在您的情况下正确声明变量)是一个好主意。如果您将
Dim name\u任务声明为Range
VBA将告诉您右行出现错误,故障排除将变得更加容易。

那么,到底什么不起作用呢?您发布的sub或只是第一行代码?同样重要的是错误消息。
name\u task=[code]。如果
[code]
返回范围对象,则选择
name\u task=[code]
不起作用,但
name\u task=[code]
应该起作用。就像在另一个例子中一样:
sht2.Range(“C2:D12”)=sht1.Range(“A8:B18”).value
起作用,但是
sht2.Range(“C2:D12”).Select=sht1.Range(“A8:B18”).value
不起作用-它没有意义。如果你在计算类似行的数据,你不需要一个
双精度
。最好使用整数类型。在VBA中,最好使用
Long
(4字节),因为
Integer
只有2个字节,因此上限为32767fwiw,这是我在这里读到的更好的解释之一。谢谢回复!返回键不是我在这个论坛上的朋友。我同意变体不是一个好主意,这是因为缺乏知识,对不起。如果我先将它们声明为range,然后再使用set,name_task和name_task_2,你能进一步解释一下set参数的实际作用吗?我启用了Option Explicit,但我认为声明为variant可以节省我的时间。@Grohl我从MSDN中添加了一个关于
set
的解释。将其声明为变量可以避免一个错误;)在某些情况下,您需要一个变体,例如使用数组。不过,大多数情况下,最好将变量声明为其实际类型。
name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown))
Set name_task = sht1.Range("A8:B8", sht1.Range("A8").End(xlDown))