【问题标题】:For/While cycle with double condition in excel在excel中具有双重条件的For/While循环
【发布时间】:2018-11-13 13:37:26
【问题描述】:

我有一个列表,其中包含与这些时间间隔相关的日期间隔和货币换算。请参见下面的示例:

Start Date  Close Date  EUR
30/03/2013  26/04/2013  1.18
30/03/2013  26/04/2013  1.18
27/04/2013  24/05/2013  1.19
25/05/2013  28/06/2013  1.17
29/06/2013  26/07/2013  1.17
27/07/2013  23/08/2013  1.16
24/08/2013  27/09/2013  1.16 
28/09/2013  25/10/2013  1.19
26/10/2013  22/11/2013  1.17
23/11/2013  27/12/2013  1.2
28/12/2013  24/01/2014  1.2
05/01/2014  21/02/2014  1.21
22/02/2014  28/03/2014  1.21
29/03/2014  25/04/2014  1.21
26/04/2014  23/05/2014  1.21
04/05/2014  27/06/2014  1.24
08/06/2014  25/07/2014  1.25
26/07/2014  22/08/2014  1.26
23/08/2014  25/09/2014  1.25
26/09/2014  23/10/2014  1.28

我需要将每个日期间隔转换为单行,包括该间隔内所有可能的日期,并保持各自的转换率。因此,对于第一个日期间隔,它将是:

30/03/2013  1.18
31/03/2013  1.18
01/04/2013  1.18
02/04/2013  1.18
03/04/2013  1.18
04/04/2013  1.18
05/04/2013  1.18
06/04/2013  1.18
07/04/2013  1.18
08/04/2013  1.18
09/04/2013  1.18
10/04/2013  1.18
11/04/2013  1.18
12/04/2013  1.18
13/04/2013  1.18
14/04/2013  1.18
15/04/2013  1.18
16/04/2013  1.18
17/04/2013  1.18
18/04/2013  1.18
19/04/2013  1.18
20/04/2013  1.18
21/04/2013  1.18
22/04/2013  1.18
23/04/2013  1.18
24/04/2013  1.18
25/04/2013  1.18
26/04/2013  1.18

无论如何,这对于所有日期范围都很容易吗?我在excel中想出了这样的东西:

=IF(AND(A1>='Sheet1'!$A$1, A1<='Sheet1'!$B$1), 'Sheet1'!$C$1), A1=当前单元格包含一个日期; Sheet1!A1=开始日期; Sheet1!B1=关闭日期; C1=欧元兑换

问题是,每当条件不适用时,我都需要它移动到下一行。意思是,每次分析的日期超出相关区间时,我需要在 Sheet1 中将行位置增加一。任何帮助,将不胜感激。 VBA就好了。

最好, 安东尼奥

【问题讨论】:

    标签: excel vba for-loop if-statement while-loop


    【解决方案1】:

    像这样?

    Option Explicit
    
    Sub GenerateAllInfo()
    
        Dim inputArr()
        inputArr = Worksheets("Sheet1").Range("A2:C21").Value 'Exludes header
    
        Dim i As Long, y As Long, rowCounter As Long
        Application.ScreenUpdating = False
    
        For i = LBound(inputArr, 1) To UBound(inputArr, 1)
            For y = inputArr(i, 1) To inputArr(i, 2)
                rowCounter = rowCounter + 1
                With Worksheets("Sheet2")
                    .Cells(rowCounter, 1) = y
                    .Cells(rowCounter, 2) = inputArr(i, 3)
                End With
            Next y
        Next i
        ActiveSheet Columns("A:A").NumberFormat = "dd/mm/yyyy"
        Application.ScreenUpdating = True
    End Sub
    

    如果日期数量太大,Transpose 无法处理,否则可以使用数组完成整个操作并直接写入工作表:

     Option Explicit
    
    Sub GenerateAllInfo()
    
        Dim inputArr()
        inputArr = Worksheets("Sheet1").Range("A2:C21").Value 'Exludes header. 
        Dim outputArr
        ReDim outputArr(1 To 2000, 1 To 2)
    
        Dim i As Long, y As Long, rowCounter As Long
        Application.ScreenUpdating = False
    
        For i = LBound(inputArr, 1) To UBound(inputArr, 1)
            For y = inputArr(i, 1) To inputArr(i, 2)
                rowCounter = rowCounter + 1
                outputArr(rowCounter, 1) = y
                outputArr(rowCounter, 2) = inputArr(i, 3)
            Next y
        Next i
    
        outputArr = Application.WorksheetFunction.Transpose(outputArr)
    
        ReDim Preserve outputArr(1 To 2, 1 To rowCounter)
        outputArr = Application.WorksheetFunction.Transpose(outputArr)
    
        With Worksheets("Sheet2")
            .Range("A2").Resize(UBound(outputArr, 1), UBound(outputArr, 2)).Value = outputArr
            .Columns("A:A").NumberFormat = "dd/mm/yyyy"
        End With
    
        Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

    • 嗨 QHarr,可能是,对 VBA 的了解还不够:P 时间太长了。我看到了双循环,所以它可能是这样的。我已将代码添加到 sheet1,将日期格式更改为“dd/mm/yyyy”,但找不到激活并填写 sheet2。它是否应该自动创建另一个工作表并填写值?
    • 我选择它是为了添加一张新工作表并在那里填写。您希望它在表 2 中的哪个位置?
    • 代码在标准模块中,不在工作表代码窗格中。我已根据您的 cmets 更新了两个版本。
    【解决方案2】:

    两个代码的小改动。

    ActiveSheet Columns("A:A").NumberFormat = "m/d/yyyy"

    ActiveSheet.Columns("A:A").NumberFormat = "m/d/yyyy"

    【讨论】:

    • 这应该是对QHarr的回答的评论。
    • 我已经尝试过更正,但无法填写值。我是否应该期望当我添加另一张工作表时,值会填写在 A 列中?
    • 很抱歉,由于缺乏声誉,我无法发表评论。在我获得必要的声誉之前,我不会做出任何改变。问候。
    • @antoniogouveia 代码将自行创建一个新工作表并填写值。确保将代码粘贴到模块中
    • 还有一件事,如果我现在想将该代码应用于我的整个数据集,我需要进行哪些更改?对于不同的 68 个日期范围,我有 68 行和 5 列的不同货币换算。
    猜你喜欢
    • 2012-10-20
    • 2021-08-18
    • 2016-02-26
    • 2014-02-11
    • 1970-01-01
    • 2022-11-04
    • 2013-07-25
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多