【问题标题】:Calling/Referring to a named Range from another Sub从另一个 Sub 调用/引用命名范围
【发布时间】:2018-11-20 05:03:48
【问题描述】:

我设法编写了来自不同线程的代码和来自网络的代码示例。这是反复试验和大量复制粘贴。

我在我的 subs 中定义了几个范围:

Define range names:
X.Sheets("Sheet1").Range("B4").Name = "Type1"
X.Sheets("Sheet1").Range("B9").Name = "SubTotal1"
X.Sheets("Sheet1").Range("A6:F8").Name = "Data1"

X.Sheets("Sheet1").Range("B11").Name = "Type2"
X.Sheets("Sheet1").Range("B16").Name = "SubTotal2"
X.Sheets("Sheet1").Range("A13:F15").Name = "Data2"

X.Sheets("Sheet1").Range("B18").Name = "Type3"
X.Sheets("Sheet1").Range("B23").Name = "SubTotal3"
X.Sheets("Sheet1").Range("A20:F22").Name = "Data3"

Y.Sheets("Sheet1").Range("A4:A6").Name = "Period"
Y.Sheets("Sheet1").Range("B4:B6").Name = "Name"
Y.Sheets("Sheet1").Range("D4:D6").Name = "Code"
Y.Sheets("Sheet1").Range("E4:E6").Name = "Type"
Y.Sheets("Sheet1").Range("F4:K4").Name = "Data"

这个名称范围用于每个子(我大约有 15 个,还需要大约 165 个)用于将信息从工作簿 X 复制和插入到工作簿 Y。

由于重复使用代码是多余的,我想将这些 Ranges 放在一个单独的 Sub 中,并在每个新的 Sub 中调用它。

我也想对下面的代码做同样的事情,它指的是上面定义的范围:

'Insert Type1 Data from X:

If X.Sheets("Sheet").Range("SubTotal1").Value > 0 Then
Range("Type1").Copy
Y.Sheets("Sheet1").Range("Type").Insert xlShiftDown
Range("Data1").Copy
Y.Sheets("Sheet1").Range("Data").Insert xlShiftDown

'Insert Period:
X.Sheets("Sheet1").Range("C3").Copy
Y.Sheets("Sheet1").Range("Period").Insert xlShiftDown

'Insert Name:
X.Sheets("Sheet1").Range("C12").Copy
Y.Sheets("Sheet1").Range("Name").Insert xlShiftDown

'Insert Code Type:
X.Sheets("Sheet1").Range("C10").Copy
Y.Sheets("Sheet1").Range("Code").Insert xlShiftDown
End If

这段代码,以及更多类似的代码(类型 1-6)在其他 Subs 中也是多余的,所以理想情况下,我会将它放在一个单独的 sub 中,并在必要时也调用它。我在 subs 的开头使用它来定义 X 和 Y 表:

Dim X As Workbook
Dim Y As Workbook

'Define workbooks:
Set X = Workbooks.Open("C:\Users\user\Folder\File.xlsx")
Set Y = ThisWorkbook

编辑:为了更好地说明我的意思,我想 Subs 会这样:

Sub Sub1

Call Sub "RangeNames"
Call Sub "Insert Type1 Data while referring to RangeNames"
Call Sub "Insert Type2 Data while referring to RangeNames"

End Sub

和/或

Sub Sub2

Call Sub "RangeNames"
Call Sub "If RangeName 'SubTotal 3' > 0 then Insert Type3 Data while referring to RangeNames"

End Sub

编辑 2:

对于@SJR:

Sub Sub1
Dim X As Workbook
Dim Y As Workbook

Set X = Workbooks.Open("C:\Users\user\Folder\File.xlsx")
Set Y = ThisWorkbook

X.Sheets("Sheet1").Range("B4").Name = "Type1"
X.Sheets("Sheet1").Range("B9").Name = "SubTotal1"

Y.Sheets("Sheet1").Range("E4:E6").Name = "Type"

Sub2

End Sub

子 2 是:

Sub Sub2

If X.Sheets("Sheet").Range("SubTotal1").Value > 0 Then <- ERROR HAPPENS HERE
Range("Type1").Copy
Y.Sheets("Sheet1").Range("Type").Insert xlShiftDown

End If

End Sub

【问题讨论】:

  • 基本上,您要做的是将相同种数据从一个工作簿复制并插入到另一个工作簿。对吗?
  • 嗨@libzz!对,那是正确的。确切地说,将有几个工作簿 - 大约 10 个,但它们都将包含相同类型的工作表/数据,所有数据都位于固定位置,因此行/工作表名称不会更改,只会更改值。它基本上是月度报告,所有信息都需要从中复制并根据报告信息插入到不同工作表的主文件中的行中。希望这是有道理的。
  • 您的问题究竟是什么?您是在问如何传递参数?
  • 我不确定我是否理解,但是一旦您在一个 sub 中定义了命名范围,您就可以在其他 sub 中自动引用它们(因为您可以直接通过工作表访问它们)。您可能想阅读此cpearson.com/excel/writingfunctionsinvba.aspx
  • @Libzz,事实证明我不需要参数,因为这个解决方案也很有效。不过还是谢谢你的努力!

标签: excel vba


【解决方案1】:

你需要的是参数(又名参数)。

例如

Sub CopyAndInsertStuff(sourceLocation as String, destinationLocation as String)

    Set wbSrc = Workbooks(sourceLocation)
    Set wbDst = Workbooks(destinationLocation)

    'Do your copying and inserting logic here...

End Sub

然后通过以下方式调用该函数:

Call CopyAndInsertStuff("C:\path\to\source\File.xlsx", "C:\path\to\destination\File.xlsx")

【讨论】:

  • 感谢您的提示,我会尝试一下,看看它是否有效。可能需要先修修补补。
【解决方案2】:

如果您正在考虑添加另外 165 个潜艇,我建议您看看 loops 和/或 arrays

开发它可能会花费您几乎相同的时间(考虑到学习曲线),但代码将缩短大约 150 倍(在 1-2-3 次中完成所有操作),并且更容易维护。这与建议的参数结合使用从其他子程序或函数调用类似功能会更有效。

以下是 Google 关于循环和数组的第一批结果,快速浏览后,它们确实满足了基本需求:

最后的建议,请记住,您与 VBA 工作簿的交互越少,宏运行的速度就越快。即:将您的全部范围加载到一个数组中,执行您想要的转换,然后将其放回工作簿中 - 您只需根据需要访问工作簿 2 次。另一方面,如果您使用 vba 将单元格 A 复制到单元格 B,则几十/数十万次......它会更慢。

【讨论】:

  • 你好 DarXyde!感谢您的链接!我以前见过提到循环和数组,但到目前为止我找不到修改我的代码以包含它们的方法。一旦我的代码完成并且我确定正在执行哪些任务,我肯定会考虑优化并用更复杂的东西替换长代码。现在,不幸的是,那些东西让我的大脑发疯了......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多