【发布时间】: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,事实证明我不需要参数,因为这个解决方案也很有效。不过还是谢谢你的努力!