VBA .range(“公式可以在这里?”)

我的最终目标是让用户从下拉列表中select想要复制的范围,然后点击“添加”button将粘贴到表单上。

我的范围以WorkSheet_RangeName的forms命名,例如“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很新,所以如果所有的这些似乎都拼凑在一起,那是因为它是! 感谢您的帮助!

编辑 – 解决scheme

又名一个范围内不能有一个公式,我需要解决我的设置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 

你有错误吗? 我会认为你的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 ,所以我删除了。 另外,除非你打算扩展这个macros, pasteSheetaddSection增加了混淆,所以我试图保持简单。

在您的数据input工作表上,我们希望获得在单元格C3中列出的命名范围。

指定的范围在“添加额外部分”工作表,单元格C3中列出。 采取该string,并删除空格。 然后,将“DataInput_”添加到开头。 这是...Formula =行。 (向后看公式,Excel将首先replace空格,然后将其与“DataInput_”连接)。

然后,最后,采取“DataInput_ [NAMED RANGE]”string,并将其放在“添加额外部分”的最后一行+1。

编辑2:对不起,但考虑到这一点,更好的办法是避免使用工作表,并在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