VBA.范围("Can a formula go here?")

VBA .range("Can a formula go here?")

我的最终目标是让用户 select 从下拉列表中复制他们想要复制的范围,然后在单击 "add" 按钮后,它将粘贴到 sheet.

我的范围以 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, "" "", """")"

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)"

我是 VBA 的新手,所以如果所有这些看起来像是胡乱拼凑的猜测...那是因为它是!感谢您提供的所有帮助!

编辑 - 解决方案

a.k.a 范围内不能有公式,我需要修复我的 set 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() 之前添加 sheet 名称的?您也应该始终使用 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, "" "", """")"

认为应该为你做。另外一个快速说明,如果你正在做 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, "" "", """")"

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, "" "", """")"

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

我们从未真正使用过 copySheet,所以我删除了它。另外,除非你打算扩展这个宏,否则 pasteSheetaddSection 会增加混乱,所以我尽量保持简单。

在您的数据输入 sheet 上,我们想要获取单元格 C3 中列出的命名范围。

命名范围列在 "Add Extra Section" sheet 单元格 C3 中。获取该字符串并删除空格。然后,将 "DataInput_" 添加到开头。这就是 ...Formula = 行的作用。 (从后面看公式,Excel会先把空格替换掉,然后再和"DataInput_"拼接)。

最后,将 "DataInput_[NAMED RANGE]" 字符串放入 "Add Extra Section" 的最后一行 +1。

Edit2:抱歉,但考虑到这一点,更好的方法是避免使用工作sheet,并在 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