2016-09-23 169 views
1

我试图使范围值“粘贴”而不使用复制/粘贴功能。我对VBA相当陌生,不明白为什么我的代码不起作用。对不起,如果这是一种已经回答的问题,但我无法通过其他帖子找出问题。动态范围内的VBA范围值

我能选择我想我的价值观中复制并粘贴过与

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

的范围,但我不能写值与

name_task_2 = name_task.value 

这工作name_task_2,对于我来说,我写了一些相同的东西,但是因为它不起作用,所以它显然不一样: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 
+0

那究竟是什么不起作用?您发布的子版本或仅仅是第一行代码?错误信息也很重要。 – arcadeprecinct

+0

'name_task = [code] .select'不工作,但'name_task = [code]'应该可以工作,如果'[code]'返回一个范围对象。就像你的另一个例子:'sht2.Range(“C2:D12”)= sht1.Range(“A8:B18”).value' works,but'sht2.Range(“C2:D12”)。Select = sht1 .Range(“A8:B18”)。value不起作用 - 它没有任何意义。 – vacip

+0

如果你正在计算类似行的东西,你不需要'Double'。最好使用整数类型。在VBA中,最好使用'Long'(4个字节),因为'Integer'只有2个字节,因此它的上限为32767 – arcadeprecinct

回答

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会告诉您在正确的线路上出现问题,故障排除变得更加容易。

+0

fwiw,这是我在这里读到的更好的解释之一。 [始终使用Option Explicit](http://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/3554/always-use-option-explicit#t=201609230832250056933) – Jeeped

+0

感谢您的回复!返回键不是我在这个论坛上的朋友。 我同意变体不是一个好主意,那是因为缺乏知识,对不起。 如果我宣布他们为范围我得到它与两个前集,name_task和 name_task_2 工作,你能解释一下什么进一步的设定参数实际上呢? – Grohl

+0

我有Option Explicit,但我认为声明为变体会救我。 – Grohl