2014-09-09 3 views
0

j'ai données est similaire à:Vérifiez si la date se situe entre une plage

A1: ID 
B1: Start date 
C1: End Date 

J'ai une autre feuille de calcul (appeler New) qui a

A1: ID and 
B1: Date 

J'ai besoin de savoir si le date de l'ID dans Nouvelle feuille de calcul était déjà dans la feuille de calcul précédente. Si la date est la date de début, la date de fin ou n'importe quoi d'autre, je veux qu'il montre qu'il existe déjà un enregistrement.

Répondre

0

Donc, vous avez 3 problèmes:

1) Prendre la valeur d'une autre feuille de calcul:

Dim startDate As Date 
startDate = ActiveWorkbook.worksheets("OtherSheetName").cells(row,col).Value 

2) Comparer les données:

If startDate <= actualDate And actualDate <= endDate Then 
    ... 
Else 
    ... 
End If 

3) Réglage de la valeur de la cellule:

ActiveWorkbook.worksheets("SheetName").cells(row,col).Value = something 

Combinez ces étapes et vous obtiendrez une solution pour votre problème.

+0

La seule question est ici qu'il pourrait y avoir plusieurs ID différents avec le même Date de début et de fin et j'ai plusieurs ID et dates dans la nouvelle feuille de calcul. La date devrait regarder la combinaison Date/ID en quelque sorte. – hushim

+0

Je ne sais pas comment poster une capture d'écran, sinon je le ferais. Merci pour l'aide! – hushim

0

J'ai un peu aimé cette question ...

La façon dont je le ferais serait d'utiliser la fonction SUMPRODUCT() pour vérifier les critères multiples (il y a beaucoup de références à la fois sur ce site et Google expliquant comment cela fonctionne)

dans votre feuille de calcul New, en supposant que la première ligne est pour les en-têtes, dans la cellule C2 mettre dans la formule suivante:

=SUMPRODUCT(--(Sheet1!$A$2:$A$180=A2),--((B2-Sheet1!$B$2:$B$180)>=0),--((Sheet1!$C$2:$C$180-B2)>=0)) > 0 

Et faites-le glisser vers le bas pour votre gamme (Obvio isa nt, le réglage de la référence de ligne 180 en fonction de vos ensemble de données)

Fondamentalement, ce que vous dites est:

Give me a TRUE only if there is at least one row in my other sheet where: 
- The IDs match 
- [My Date] minus row's [Start date] >= 0 
- Row's [End Date] - [My Date] >= 0 

espoir qui fait sens!

+0

Merci John, je l'ai essayé et il m'a donné tous 0. – hushim

+0

@hushim, je n'ai aucune idée pourquoi ... Cela a fonctionné sur le mien très bien ... Et vous ne devriez jamais avoir 0, vous devriez obtenir VRAI/FAUX .. Etes-vous sûr que vous avez copié la formule en corrcetly ?? –

1

Solution ici en supposant quelque chose de plus pratique:

  • Une feuille de maître avec ID, Date de début, date de fin (plusieurs lignes)
  • Autres feuilles avec ID et la date (plusieurs lignes)
  • Utilise utilisateur Fonction définie (UDF) et la cellule d'identification comme entrée
  • Un inconvénient est que vous aurez besoin « Calculer feuille » si d'autres feuilles a été mis à jour

captures d'écran Exemples:
Formula pour Sheet1 D2: =FindDuplicates(A2)

Sheet1Sheet2Sheet3

code dans un module:

Option Explicit 

Function FindDuplicates(oRngID As Range) As String 
    Dim sID As String, dStart As Date, dEnd As Date, lCount As Long, sWhere As String 
    Dim oWS As Worksheet, oRngFound As Range, dFound As Date, sFirstFound As String 

    sID = oRngID.Text 
    dStart = oRngID.Offset(0, 1).Value 
    dEnd = oRngID.Offset(0, 2).Value 
    lCount = 0 
    sWhere = "" 
    For Each oWS In ThisWorkbook.Worksheets 
     ' Find all IDs in other worksheeets 
     If oWS.Name <> oRngID.Worksheet.Name Then 
      sFirstFound = "" 
      Set oRngFound = oWS.Cells.Find(What:=sID) 
      If Not oRngFound Is Nothing Then 
       sFirstFound = oRngFound.Address 
       ' Keep searching until the first found address is met 
       Do 
        ' Check the dates, only add if within the dates 
        dFound = oRngFound.Offset(0, 1).Value 
        If dStart <= dFound And dFound <= dEnd Then 
         lCount = lCount + 1 
         If lCount = 1 Then 
          sWhere = sWhere & lCount & ") '" & oWS.Name & "'!" & oRngFound.Address 
         Else 
          sWhere = sWhere & vbCrLf & lCount & ") '" & oWS.Name & "'!" & oRngFound.Address 
         End If 
        End If 
        Set oRngFound = oWS.Cells.Find(What:=sID, After:=oRngFound) 
       Loop Until oRngFound.Address = sFirstFound 
      End If 
     End If 
    Next 
    If lCount = 0 Then sWhere = "Not Found" 
    FindDuplicates = Replace(sWhere, "$", "") ' Removes the $ sign in Addresses 
End Function 
+0

Merci, je vais essayer ça demain. Mon VBA est limité. Des suggestions sur les livres, les ressources? Vous avez les feuilles complètement mises en place. – hushim

+0

Cela a fonctionné. Une autre question, et si j'ai la date dans la feuille 2 et la feuille 3 dans le même format que la feuille 1 avec la date de début et la date de fin et je veux regarder toutes les valeurs entre les deux. – hushim

+0

Vous n'avez pas dit comment vous comparer et l'action à effectuer ... Essayez de modifier le bloc ** IF ** à l'intérieur de la boucle ** Do ** et postez probablement une nouvelle question si elle est bloquée. – PatricK

Questions connexes