2016-11-30 31 views
0

我的最終目標是讓用戶從下拉列表中選擇想要複製的範圍,然後單擊「添加」按鈕時,它將粘貼到表格。VBA .range(「公式可以在這裏?」)

我的範圍以WorkSheet_RangeName的方式命名,因此例如「Oil Furnace」的部分將具有名爲「DataInput_OilFurnace」的範圍。因此,我所有的範圍將以「DataInput_」開頭,並且需要刪除空格。

Sub AddExtraSection() 

Dim copySheet As Worksheet 
Dim pasteSheet As Worksheet 
Dim addSection As Range 

Set copySheet = Worksheets("Data Input") 
Set pasteSheet = Worksheets("Add Extra Section") 
Set addSection = Worksheets("Add Extra Section").Range("C3").Formula = _ 
"=""DataInput_""&SUBSTITUTE($C$3, "" "", """")" 

copySheet.range(addSection).Copy 
pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial 

End Sub 

如果我不能用一個公式,可我有範圍的名稱是特定細胞(如,我有一個與該範圍的名稱來填充我的下拉下面的公式)?

Set addSection = Worksheets("Add Extra Section").ActiveCell.Offset(1, 0).Formula = "=INDIRECT($C$4)" 

我對VBA很新,所以如果所有這些似乎都像拼湊在一起的半猜猜......那是因爲它!感謝您的幫助!

編輯 - 解決方案:

a.k.a範圍可以不必在它的公式,我需要解決我的一套Addsection的

Sub AddExtraSection() 

Dim copySheet As Worksheet 
Dim pasteSheet As Worksheet 
Dim addSection As range 

Set copySheet = Worksheets("Data Input") 
Set pasteSheet = Worksheets("Add Extra Section") 
Set addSection = copySheet.range("C3") 
addSection.Formula = "=""DataInput_""&SUBSTITUTE('Add Extra Section'!C3,"" "","""")" 

copySheet.range(addSection).Copy 
pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial 

End Sub 
+2

在'範圍的字符串文字(「東西」) '可以是任何Excel可以理解爲引用一系列單元格:''A1「',''A1:B12」','「$ A:$ B」',「SomeNamedRange」',無論如何。但是,不,不是一個公式。 –

+0

Phooey。感謝您澄清! – Haley

回答

1

你得到一個錯誤?我認爲你的pasteSheet.Cells(...行可能會引發錯誤。看看你如何在.Cells()之前添加表單名稱?您應該始終使用Rows()Columns()這樣做,因此該行應爲:pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial。另外,您不能做mySheet.Range([formula])。這需要分解。你反而會想要做

Set addSection = Worksheets("Add Extra Section").Range("C3") 
addSection.Formula = "=""DataInput_""&SUBSTITUTE($C$3, "" "", """")" 

認爲應該爲你做。另外一個快速的注意,如果你正在做PasteSpecial只是爲了獲得價值粘貼,稍微更快的方法是設置等於海誓山盟的範圍內,從而避免了使用剪貼板:

Range([destination range]).Value = Range([range to copy]).Value

所以,儘量這個:

Sub AddExtraSection() 

Dim copySheet As Worksheet 
Dim pasteSheet As Worksheet 
Dim addSection As Range 

Set copySheet = Worksheets("Data Input") 
Set pasteSheet = Worksheets("Add Extra Section") 
Set addSection = pasteSheet.Range("C3") 
addSection.Formula = "=""DataInput_""&SUBSTITUTE($C$3, "" "", """")" 

pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = addSection.Value 
End Sub 

編輯:通過下面的註釋,我們可以收緊代碼並使其更加清晰。

Sub AddExtraSection() 

Dim pasteSheet As Worksheet 

Set pasteSheet = Worksheets("Add Extra Section") 
'Next line will put "DataInput_[RANGE NAME]" in cell C3 of "Data Input" worksheet 
Worksheets("Data Input").Range("C3").Formula = "=""DataInput_""&SUBSTITUTE('Add Extra Section'!$C$3, "" "", """")" 

pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = _ 
    Worksheets("Data Input").Range("C3").Value 
End Sub 

我們從來沒有真正使用過copySheet,所以我刪除了它。此外,除非您計劃擴展此宏,否則pasteSheetaddSection會增加混淆,因此我儘量保持簡單。

在您的數據輸入工作表上,我們希望獲得在單元格C3中列出的命名範圍。

指定的範圍在「添加額外部分」工作表C3單元格中列出。採取該字符串並刪除空格。然後,將「DataInput_」添加到開頭。這就是...Formula =系列的功能。 (向後看公式,Excel將首先替換空格,然後將其與「DataInput_」連接)。

然後,最後採用「DataInput_ [NAMED RANGE]」字符串,並將其放入「添加額外部分」的最後一行+1。

EDIT2:很抱歉,但想着這一點,更好的方法是避免使用工作表,並做好了在VBA本身:

Sub updateNamedRange() 
Dim destinationCell As Range, inputCell As Range 

Set destinationCell = Worksheets("Add Extra Section").Cells(Worksheets("Add Extra Section").Rows.Count, 1).End(xlUp).Offset(1, 0) 
Set inputCell = Worksheets("Add Extra Section").Cells(3, 3) 

destinationCell.Value = "DataInput_" & WorksheetFunction.Substitute(inputCell, " ", "") 

End Sub 
+0

這個公式不是一個循環引用嗎? – Comintern

+0

@Comintern - 說實話,我沒有真正檢查公式,但只是注意到你會如何在VBA中做到這一點。我想也許'$ C $ 3'是指另一張表格?也許它應該是'「=」「DataInput _」「&SUBSTITUTE('Data Input'!$ C $ 3,」「」「」「」「)」'? – BruceWayne

+1

很難說出我想要的是什麼,但如果它進入'.Range(「C3」)',它不能只是'$ C $ 3'。 – Comintern