Excel VBA-从另一个Sub

时间:2018-11-20 05:03:49

标签: excel vba excel-vba

这是我关于StackOverflow的第一篇文章,所以,如果我错过了什么,请告诉我!

上下文:我是第一次将VBA代码组合在一起,到目前为止,我们设法从大量不同的线程中编写了代码,并在网上编写了代码示例。由于我是新手,所以我还不完全了解VBA代码的工作原理-基本上是反复试验和大量复制粘贴,直到我正确为止。结果,我认为代码要长得多,而且效率不高。但是,由于我是新手,所以高级代码对我来说几乎没有意义,因此我坚持使用更基本的解决方案,因为我必须先了解代码,并能够根据情况以各种可能的方式对其进行集成,并使之成为现实。必要时,其他人容易阅读。我之所以这么说,是为了让您了解我的经验水平以及对我了解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复制和插入到WorkbookY。因为重复使用每个子项的代码是多余的,我希望能够将这些范围放在单独的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中并在必要时调用它,因为它将使我的代码无限较短。我在子代码的开头使用它来定义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

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

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

如果您要添加另外165个潜艇,我是否建议看看循环和/或阵列

开发它可能需要花费几乎相同的时间(考虑学习曲线),但是代码将缩短大约150倍(在1-2-3子代码中完成所有操作),并且更易于维护。这样,再加上建议的参数来从其他子功能中调用类似的功能,将会更有效率。

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

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