2013-07-25 4 views
1

J'écris actuellement une macro qui va lire une colonne de dates, vérifier le mois de chaque élément, enregistrer le nombre dans une variable, et mettre le nombre final dans une cellule. Le programme regarde à travers une colonne de 2999 articles. La colonne n'est pas complètement pleine. Le nombre a été choisi parce que le nombre d'articles pourrait être aussi élevé.else if instruction par défaut à la dernière condition vba

La boucle pour chaque boucle vérifie le mois de chaque cellule et augmente la variable du mois de 1. Cependant, à la fin, la variable de décembre est d'environ 2500. Il n'y a qu'environ 500 lignes remplies. La somme des mois vient à 2999 (le nombre de lignes recherchées). Je ne sais pas pourquoi c'est ce qu'il fait. J'ai essayé d'ajouter une condition "else". Ce n'est même pas si loin. A15 n'est jamais rempli de "Batman". Je dois manquer quelque chose de simple. Aidez-moi?

Dim rng3 As Range 
Dim JanCount As Integer 
Dim FebCount As Integer 
Dim MarCount As Integer 
Dim AprCount As Integer 
Dim MayCount As Integer 
Dim JunCount As Integer 
Dim JulCount As Integer 
Dim AugCount As Integer 
Dim SepCount As Integer 
Dim OctCount As Integer 
Dim NovCount As Integer 
Dim DecCount As Integer 
Dim dateValue As Date 
Dim monthInt As Integer 

Set rng3 = Sheets("Sheet2").Range("K2:K3000") 

For Each cell In rng3 
dateValue = cell.Value 
monthInt = month(dateValue) 

If monthInt = 1 Then 
    JanCount = JanCount + 1 

ElseIf monthInt = 2 Then 
    FebCount = FebCount + 1 

ElseIf monthInt = 3 Then 
    MarCount = MarCount + 1 

ElseIf monthInt = 4 Then 
    AprCount = AprCount + 1 

ElseIf monthInt = 5 Then 
    MayCount = MayCount + 1 

ElseIf monthInt = 6 Then 
    JunCount = JunCount + 1 

ElseIf monthInt = 7 Then 
    JulCount = JulCount + 1 

ElseIf monthInt = 8 Then 
    AugCount = AugCount + 1 

ElseIf monthInt = 9 Then 
    SepCount = SepCount + 1 

ElseIf monthInt = 10 Then 
    OctCount = OctCount + 1 

ElseIf monthInt = 11 Then 
    NovCount = NovCount + 1 

ElseIf monthInt = 12 Then 
    DecCount = DecCount + 1 

Else 
    Sheets("Sheet1").Range("A15") = "Batman" 

End If 

Next cell 

Sheets("Sheet1").Range("A10") = "Bugs in Jan" 
Sheets("Sheet1").Range("B10") = "Bugs in Feb" 
Sheets("Sheet1").Range("C10") = "Bugs in Mar" 
Sheets("Sheet1").Range("D10") = "Bugs in Apr" 
Sheets("Sheet1").Range("E10") = "Bugs in May" 
Sheets("Sheet1").Range("F10") = "Bugs in Jun" 
Sheets("Sheet1").Range("G10") = "Bugs in Jul" 
Sheets("Sheet1").Range("H10") = "Bugs in Aug" 
Sheets("Sheet1").Range("J10") = "Bugs in Oct" 
Sheets("Sheet1").Range("K10") = "Bugs in Nov" 
Sheets("Sheet1").Range("L10") = "Bugs in Dec" 

Sheets("Sheet1").Range("A11") = JanCount 
Sheets("Sheet1").Range("B11") = FebCount 
Sheets("Sheet1").Range("C11") = MarCount 
Sheets("Sheet1").Range("D11") = AprCount 
Sheets("Sheet1").Range("E11") = MayCount 
Sheets("Sheet1").Range("F11") = JunCount 
Sheets("Sheet1").Range("G11") = JulCount 
Sheets("Sheet1").Range("H11") = AugCount 
Sheets("Sheet1").Range("I11") = SepCount 
Sheets("Sheet1").Range("J11") = OctCount 
Sheets("Sheet1").Range("K11") = NovCount 
Sheets("Sheet1").Range("L11") = DecCount 
+0

A15 Cell n'est pas Batman! JE SUIS BATMAN! – mattboy

+0

Si vous postez votre contribution nous pouvons avoir plus de travailler avec @AndyArduesser –

+0

pouvez-vous placer un 'MsgBox cell.Value' au-dessus de la ligne' dateValue = cell.Value'? exécutez le code et s'il vous plaît dites-nous ce que la boîte de message a montré –

Répondre

-1

remplacer la ligne

Set rng3 = Sheets("Sheet2").Range("K2:K3000") 

avec

Set rng3 = Sheets("Sheet2").Range("K2:K" & Sheets(2).Cells(Rows.Count, 11).End(xlUp).Row) 

Fondamentalement comme S. Wirth dit, il est à cause des cellules vides. Donc, dans le code ci-dessus, au lieu de faire en boucle jusqu'à 3000, je suis juste en train de le faire jusqu'à ce que toutes les données sont là.

Espérons que cela aide.

+1

Un avertissement: Cela suppose qu'il n'y a pas de cellules vides entre la première et la dernière cellule. S'il y en aura, les cellules vides doivent toujours être ignorées. – mattboy

+1

cela aurait dû être un conseil ou un commentaire. ça ne résout pas le problème. pourquoi l'afficherais-tu comme une réponse? –

+0

Ceci n'est pas une tentative de répondre à la question. –

0

On dirait que le mois des cellules vides est toujours retourné comme 12 pour une raison quelconque. Essayez de changer la ligne de décembre à:

ElseIf monthInt = 12 And cell.value <> "" Then 
+0

est-ce une réponse ou une suggestion? si c'est une réponse est fausse ... –

+0

Évidemment une réponse, car il a été testé et fonctionne. Et oui, je suis passé par là. – mattboy

1

si votre cellule est vide, la valeur de la date de la cellule est 0. La valeur de date 0 est définie comme 0 Janvier 1900 et ainsi vous obtenez 1 résultat de la fonction mois(). Tout d'abord, vérifiez si la valeur cell.Value est nulle.

Stephan ce qui concerne

+0

J'ai effectivement eu 12 à la suite du mois() lors du test – mattboy

+0

Je recevais le nombre inhabituel des cellules vides. Ils doivent avoir par défaut 12 pour une raison quelconque. Je ne suis pas sûr. Les données sont exportées à partir d'une base de données et peuvent avoir été formatées étrangement. –

5

Essayez de vérifier d'abord avec IsDate() si la valeur de la cellule peut être interprétée comme une date.

Et .. juste une suggestion de faire la chose un peu plus facile:

Dim Rng3 As Range 
Dim BugCount(1 To 12) 


Set Rng3 = Sheets("Sheet2").Range("K2:K3000") 

For Each cell In Rng3 
    If IsDate(cell.Value) Then 
     BugCount(Month(cell.Value)) = BugCount(Month(cell.Value)) + 1 
    End If 
Next 

For monthctr = 1 To 12 
    Sheets("Sheet1").Range("A10").Offset(0, monthctr - 1).Value = "Bugs in " & Format(DateSerial(2013, monthctr, 1), "MMM") 
    Sheets("Sheet1").Range("A11").Offset(0, monthctr - 1).Value = BugCount(monthctr) 

Next 
+1

+1 pour une solution très efficace. –