2016-09-23 288 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