VBA想要比较2个日期列和2个值列以创建其中一个

时间:2013-04-03 01:26:40

标签: excel vba excel-vba

我想比较行中的每个日期,取最高点,按最近的距离对它们进行排序,然后对值进行相同的操作。

有我的代码

Sub Intersection()

Dim nombre As Integer
Dim tableauDate(1 To 130) As Date
Dim tableauValeur(1 To 130) As String
Dim incrementeurForeach As Integer

nombre = 115
incrementeurForeach = 1

For incrementeur = 0 To nombre
    If Range("A" & incrementeur).Value = Range("C" & incrementeur).Value Then
        tableauDate(incrementeur) = Range("A" & incrementeur).Value
        If Range("B" & incrementeur).Value > Range("D" & incrementeur).Value Then
            tableauValeur(incrementeur) = Range("B" & incrementeur).Value
        Else
            tableauValeur(incrementeur) = Range("D" & incrementeur).Value
        End If
    Else
        If Range("A" & incrementeur).Value > Range("C" & incrementeur).Value Then
            tableauDate(incrementeur) = Range("A" & incrementeur).Value
        Else
            tableauDate(incrementeur) = Range("C" & incrementeur).Value
        End If
    End If

Next incrementeur

For Each valeur In tableauDate

    Range("A", incrementeurForeach).Value = tableauDate(incrementeurForeach)
    Range("B", incrementeurForeach).Value = tableauValeur(incrementeurForeach)

    incrementeurForeach = incrementeurForeach + 1

Next valeur
End Sub

表格中有一部分

         A                  B               C               D
1        Date A         Prix A          Date B          Prix B
2        2000-01-31         34,84 $     2000-01-31  48,07 $ 
3        2000-05-31         29,22 $     2000-02-29  39,15 $ 
4        2000-06-30         29,00 $     2000-03-31  43,46 $ 
5        2000-07-31         30,25 $     2000-04-30  43,62 $ 
6        2000-08-31         33,27 $     2000-05-31  47,27 $ 

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我尝试稍微清理你的代码,这可能对你或其他人有所帮助。

有一些错误,例如incrementeur必须从1开始,因为如果Range("A" & incrementeur) incrementeur = 0会出错。这需要在代码中的其他地方进行一些小的更改。

我不确定具体问题是什么,但是我注意到,如果日期A =日期B,您只填充tableauValeur

Sub Intersection()

Dim nombre As Integer
Dim tableauDate(1 To 130) As Date
Dim tableauValeur(1 To 130) As String
Dim valeur as Variant
Dim incrementeurForeach As Integer
Dim dateA As Date
Dim dateB As Date
Dim prixA As Variant
Dim prixB As Variant

nombre = 115
incrementeurForeach = 1  

For incrementeur = 2 To nombre  'change to "2"'
    'Add some variables to make the code more legible.'
    dateA = Range("A" & incrementeur).Value
    dateB = Range("c" & incrementeur).Value
    prixA = Range("B" & incrementeur).Value
    prixB = Range("D" & incrementeur).Value

    'Rewrite the expressions using the variables'.
    ' Also favor a Select Case instead of nested IF/Then.'
    Select Case dateA
        Case Is = dateB
            tableauDate(incrementeur) = dateA
            If prixA > prixB Then
                tableauValeur(incrementeur - 1) = prixA
            Else
                tableauValeur(incrementeur - 1) = prixB
            End If

        Case Is > dateB
            tableauDate(incrementeur - 1) = dateA

        Case Else:
            tableauDate(incrementeur - 1) = dateB

    End Select

Next incrementeur


Sheets.Add After:=ActiveSheet  'I add a new worksheet to debug, you can remove this if necessary'

For Each valeur In tableauDate

'I also change the way you specify the Ranges, to use OFFSET.
    Range("A1").Offset(incrementeurForEach,0).Value = tableauDate(incrementeurForeach)
    Range("B1").Offset(incrementeurForEach,0).Value = tableauValeur(incrementeurForeach)

    incrementeurForeach = incrementeurForeach + 1

Next valeur

End Sub