excel - 从另一个 Sub 调用/引用命名范围

标签 excel vba

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

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

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 个)用于将信息从 Workbook X 复制和插入到 Workbook 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

这段代码,以及更多类似的 6 个(类型 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

最佳答案

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

例如

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

关于excel - 从另一个 Sub 调用/引用命名范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53386523/

相关文章:

excel - 基于按列 F1 分组的列 F2 的聚合对列 F1 进行不同计数

javascript - 无法在导出的 CSV 文件中显示变音符号

javascript - 如何使用javascript实现 "Fit sheet on one page"打印

vba - Excel VBA 中的 Like 运算符

vba - 做直到循环,如果然后 VBA Excel

excel - MS Access 找不到项目或库错误

arrays - Excel中计算两个数组相减的结果是否超过某个值

excel - 使用 excel-vba 将工作表范围导出到 csv

sql - 将 Null 从 Excel 传递到 SQL

vba - 从 Word 使用 VBA 发送 HTTP 请求