我的工作簿有3张。
我正在输入主页B2:B5
单元格上的输入。取决于此输入,我正在进行一些计算并将结果保存在我的工作表RawImport A8:G8
单元格中。现在最后,RawImport A8:G8
单元格值,执行不同的函数和最终结果将保存在PullData A:L
列上。在此版本中,用户只能在B2:B5
上使用Main
单元格表(通常是单个数据集)。
现在作为下一版本的一部分,我希望有多个数据集,即C2:C5
,D2:D5
,E2:E5
等。但我在其他工作表上运行的功能将与第一组完全相同。对于C2:C5,我必须使用我的其他工作表中的下一个可用列
主要工作表B2:B5
使用RawImport A8 :G8
(8列)和PullData A3:L3
(12列)
主要工作表C2:C5
使用RawImport H8:N8
(接下来的8列)和PullData M3:X3
(接下来的12列)
...
....
目前,我正在多次编写相同的vba脚本来运行相同的功能。即,对于B2:B5,我在我的代码中使用RawImport A8 :G8
(8列)和PullData A3:L3
,在我的另一张表中使用C2:C5下一组列。每组数据使用的列数在所有工作表上都相等。
我现在遵循的逻辑是,在B2:B5结束时,我将检查C2是否为空,如果它为空,我将在那里结束我的代码,否则我将调用为C2编写的代码; C5
无论如何,我可以使用一种简单的方法来实现这一点而不是多次编写代码吗?
下面是示例代码(注意:这不是原始代码,但与原始代码类似。)
Option Explicit
Sub GetData()
Dim Main As Worksheet
Dim RawImport As Worksheet
Dim PullData As Worksheet
Dim ticker As String
Dim exchange As String
Dim interval As Integer
Dim numPastTradingDays As Integer
Dim qurl As String
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
'''''''Data Entry to Sheet Main'''''''''''''''
Set Main = Workbooks("1.xlsm").Sheets("Main")
Set RawImport = Workbooks("1.xlsm").Sheets("RawImport")
Set PullData = Workbooks("1.xlsm").Sheets("PullData")
ticker = Main.Range("B2").Value
exchange = Main.Range("B3").Value
interval = Main.Range("B4").Value * 60
numPastTradingDays = Main.Range("B5").Value
'''''''Fill RawImport sheet A to G using Main sheet B2 to B5'''''''''''''''
RawImport.Range("A8").Value = ticker
RawImport.Range("B8").Value = interval
RawImport.Range("C8").Value = 300
RawImport.Range("D8").Value = 400
RawImport.Range("E8").Value = 500
RawImport.Range("F8").Value = exchange
RawImport.Range("G8").Value = interval
'''''''PullData sheet fill using RawImport data from A8 to G8'''''''''''''''
Dim lrA As Integer
lrA = RawImport.Range("B" & Rows.Count).End(xlUp).Row
PullData.Range("A3:A" & lrA - 5).Value = RawImport.Range("G8:G" & lrA).Value
PullData.Range("A3:A" & lrA).NumberFormat = "d mmm yyyy h:mm;@"
PullData.Range("A:A").Columns.AutoFit
PullData.Range("B3:B" & lrA - 5).Value = RawImport.Range("E8:E" & lrA).Value
PullData.Range("C3:C" & lrA - 5).Value = RawImport.Range("C8:C" & lrA).Value
PullData.Range("D3:D" & lrA - 5).Value = RawImport.Range("D8:E" & lrA).Value
PullData.Range("E3:E" & lrA - 5).Value = RawImport.Range("B8:B" & lrA).Value
PullData.Range("F3:F" & lrA - 5).Value = RawImport.Range("F8:F" & lrA).Value
PullData.Range("G3:G" & lrA - 5).Formula = "=(C3+D3+E3)/3"
PullData.Range("H3:H" & lrA - 5).Formula = "=G3*F3"
PullData.Range("I3:I" & lrA - 5).Formula = "=sum(H$2:H3)"
PullData.Range("J3:J" & lrA - 5).Formula = "=sum(F$2:F3)"
PullData.Range("K3:K" & lrA - 5).Formula = "=sum(I3/J3)"
PullData.Range("L3:L" & lrA - 5).Formula = "=((E3-K3)/K3)"
PullData.Range("G3:G" & lrA - 5) = PullData.Range("G3:G" & lrA - 5).Value
PullData.Range("H3:H" & lrA - 5) = PullData.Range("H3:H" & lrA - 5).Value
PullData.Range("I3:I" & lrA - 5) = PullData.Range("I3:I" & lrA - 5).Value
PullData.Range("J3:J" & lrA - 5) = PullData.Range("J3:J" & lrA - 5).Value
PullData.Range("K3:K" & lrA - 5) = PullData.Range("K3:K" & lrA - 5).Value
PullData.Range("L3:L" & lrA - 5) = PullData.Range("L3:L" & lrA - 5).Value
PullData.Range("G3:G" & lrA - 5).NumberFormat = "0.00"
PullData.Range("K3:K" & lrA - 5).NumberFormat = "0.00"
PullData.Range("L3:L" & lrA - 5).NumberFormat = "0.00%"
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
答案 0 :(得分:1)
不是100%肯定,但这应该指向正确的方向。我们正在做的是一个循环,它将无限期地继续,直到下一列的第2行中的单元格为空。我没有把你的整个代码放在循环中,因为我不打算保证它是正确的,而且我不打算解决你可能得到的每个可能的行异常。但这是您可能需要实施的一般概念:
Dim collOffset as Long
collOffset = 0
Do While Main.Range("B2").Offset(,collOffset) <> ""
ticker = Main.Range("B2").Offset(,collOffset).Value
exchange = Main.Range("B3").Offset(,collOffset).Value
interval = Main.Range("B4").Offset(,collOffset).Value * 60
numPastTradingDays = Main.Range("B5").Offset(,collOffset).Value
'''''''Fill RawImport sheet A to G using Main sheet B2 to B5'''''''''''''''
RawImport.Range("A8").Offset(,collOffset).Value = ticker
RawImport.Range("B8").Offset(,collOffset).Value = interval
RawImport.Range("C8").Offset(,collOffset).Value = 300
RawImport.Range("D8").Offset(,collOffset).Value = 400
RawImport.Range("E8").Offset(,collOffset).Value = 500
RawImport.Range("F8").Offset(,collOffset).Value = exchange
RawImport.Range("G8").Offset(,collOffset).Value = interval
' Etc.
'
'
' You'll need to add the rest of your code,
' I'm not going to try and reverse-engineer what you did
' or how to fix every line :)
' Increment your offset index
collOffset = collOffset + 1
Loop