Excel VBA:使用不同的单元格值循环使用相同的函数

时间:2017-09-19 14:00:24

标签: excel vba excel-vba excel-formula

我的工作簿有3张。

  1. 主要
    enter image description here

  2. RawImport
    enter image description here

  3. PullData
    enter image description here

  4. 我正在输入主页B2:B5单元格上的输入。取决于此输入,我正在进行一些计算并将结果保存在我的工作表RawImport A8:G8单元格中。现在最后,RawImport A8:G8单元格值,执行不同的函数和最终结果将保存在PullData A:L列上。在此版本中,用户只能在B2:B5上使用Main单元格表(通常是单个数据集)。

    现在作为下一版本的一部分,我希望有多个数据集,即C2:C5D2:D5E2: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
    

1 个答案:

答案 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