Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 从另一个子系统调用/引用命名范围_Excel_Vba - Fatal编程技术网

Excel 从另一个子系统调用/引用命名范围

Excel 从另一个子系统调用/引用命名范围,excel,vba,Excel,Vba,我设法从不同的线程编写代码,并从网络上编写示例代码。这是反复试验和大量的复制粘贴 我的SUB中定义了几个范围: 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("B1

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

我的SUB中定义了几个范围:

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

因为重用代码是多余的,所以我想将这些范围放在一个单独的子部分中,并在每个新的子部分中调用它

我还想对以下代码执行同样的操作,这些代码引用了上面定义的范围:

'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)在其他sub中也是冗余的,所以理想情况下,我会将其放在一个单独的sub中,并在必要时调用它。我在SUB的开头使用它来定义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
编辑:为了给我的意思提供一个更好的例子,我想象潜艇是这样的:

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
subsub2

如果X.Sheets(“Sheet”).Range(“SubTotal1”).Value>0,那么您需要的是参数(aka参数)

e、 g

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

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

如果您正在考虑添加另外165个sub,我是否可以建议您查看循环和/或数组

开发它可能会占用您几乎相同的时间(考虑到学习曲线),但代码将缩短约150倍(以1-2-3子代码完成所有操作),并且更易于维护。这一点,再加上从其他子节点或函数调用类似功能的建议参数,将更加有效

下面是Google在循环和数组方面的第一个结果,在快速查看之后,它们确实涵盖了基本需求:

  • 循环

  • 阵列


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

基本上,您要做的是将相同类型的数据从一个工作簿复制并插入到另一个工作簿。是吗?嗨@libzz!是的,没错。确切地说,将有多个工作簿(大约10个),但它们都包含相同类型的工作表/数据,所有数据都位于固定位置,因此行/工作表名称不会更改,只有值会更改。它基本上是月度报告,所有这些信息都需要从中复制出来,并根据报告信息插入到主文件中不同页面的行中。希望这是有道理的。你的问题到底是什么?你是在问如何传递参数吗?我不太明白,但一旦你在一个子系统中定义了命名范围,你就可以在其他子系统中自动引用它们(因为你可以通过工作表直接访问它们)。你可能想读一下这个@Libzz,结果我不需要参数,因为这个解决方案同样有效。不过还是要感谢你的努力!谢谢你的提示,我会试试看是否有效。可能需要先修修补补。嗨,DarXyde!谢谢你的链接!我以前见过循环和数组,但到目前为止,我还没有找到一种方法来修改代码以包含它们。一旦我的代码完成,并且我确定正在执行哪些任务,我将非常肯定地研究优化,并用更复杂的东西替换长代码。现在,不幸的是,那些东西只会让我的大脑发疯。。
Call CopyAndInsertStuff("C:\path\to\source\File.xlsx", "C:\path\to\destination\File.xlsx")