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

我的工作簿有3张。

  1. 主要
    在这里输入图像说明

  2. RawImport
    在这里输入图像说明

  3. PullData
    在这里输入图像说明

我正在进入我的input在主表B2:B5 cells.Depends在这个input我做了一些计算,并保存在我的工作表RawImport A8:G8细胞的结果。 现在,最后,RawImport A8:G8单元格值,做不同的function和最终结果将被保存在PullData A:L列。在此版本中,用户只能在我的Main表单上使用B2:B5单元格(通常是单个数据集)。

现在作为下一个版本的一部分,我想有多个数据集,即C2:C5D2:D5E2:E5等。但我在其他工作表上运行的function将与第一套完全相同。 对于C2:C5,我必须使用另一张表中的下一个可用列

主板B2:B5使用RawImport A8 :G8 (8列)和PullData A3:L3 (12列)

主板C2:C5使用RawImport H8:N8 (接下来的8列)和PullData M3:X3 (接下来的12列)….

目前,我正在编写相同的VBA脚本多次运行相同的function。 即对于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 

不是100%肯定,但是这应该指向正确的方向。 我们正在做的是一个循环,它将无限期地继续,直到下一列第二行的单元格为空。 我没有把你的整个代码放在循环中,因为我不会保证它是正确的,而且我不打算排除可能遇到的每一个可能的行exception。 但是这是您可能需要实现的一般概念:

 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