2017-10-20 20 views
0

Besoin de votre expertise VBA dans l'exécution de la tâche ci-dessous. J'ai besoin de faire un "MACORS" countif de villes sur une colonne et d'imprimer chaque ville à côté du numéro. J'ai ce code:COUNTIF et imprimez la chaîne comptée

Public Sub CountLocation() 

Range("V2").Select 

Selection.End(xlDown).Select 
lastcell = ActiveCell.Address 

ActiveCell.Offset(2, 0).Value = "=countif(V2:" + lastcell + ", ""Zurich"")" 
ActiveCell.Offset(2, 1).Value = "Zurich" 
ActiveCell.Offset(3, 0).Value = "=countif(V2:" + lastcell + ", ""Armonk"")" 
ActiveCell.Offset(3, 1).Value = "Armonk" 
ActiveCell.Offset(4, 0).Value = "=countif(V2:" + lastcell + ", ""Hong Kong"")" 
ActiveCell.Offset(4, 1).Value = "Hong Kong" 
ActiveCell.Offset(5, 0).Value = "=countif(V2:" + lastcell + ", ""London"")" 
ActiveCell.Offset(5, 1).Value = "London" 
ActiveCell.Offset(6, 0).Value = "=countif(V2:" + lastcell + ", ""Madrid"")" 
ActiveCell.Offset(6, 1).Value = "Madrid" 

End Sub 

Mon problème est que j'ai environ 90 villes « possibles » dans une feuille et diffère des autres feuilles. Mon code ci-dessus imprime une ville qui ne figure pas dans une feuille spécifique.

Merci pour vous aider

+0

Votre code fonctionne avec tout ce qui est le ActiveSheet au moment où vous exécutez votre code . Essayez-vous de spécifier une ou plusieurs feuilles pour l'exécuter? – QHarr

+0

Utilisez également Option Explicit en haut de votre code afin que les variables soient vérifiées pour l'orthographe et la déclaration. – QHarr

+0

Merci QHarr, oui ça marche mais ça renvoie le nom de cette ville qui n'est pas inscrite dans une colonne. par exemple: 2 Zurich 0 Hong kong. Je ne veux pas que Hong Kong soit imprimé car il n'a aucune valeur. – Jonathan

Répondre

1

Mettez les villes dans un tableau et une boucle ce tableau. Aussi, avoir la gamme de comptage comme une gamme. Il y a un test If pour plus de 0 donc n'écrira pas la ville si elle n'est pas présente.

Tous ensemble:

Option Explicit 

Public Sub CountLocation() 

    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim countRange As Range 

    Set wb = ThisWorkbook 
    Set ws = wb.ActiveSheet 'Change as appropriate 

    Dim lastRow As Long 
    lastRow = ws.Range("V2").End(xlDown).Row 'Update: Extracted this into a variable 

    Set countRange = ws.Range(ws.Cells(2, "V"), ws.Cells(lastRow, "V")) 

    Dim Cities() 
    Cities = Array("Zurich", "Armonk", "Hong Kong", "London", "Madrid") 

    Dim city As Long 
    Dim counter As Long 
    Dim startRange As Range 

    Set startRange = ws.Cells(lastRow, "V").Offset(2, 0) 

    counter = 2 

    For city = LBound(Cities) To UBound(Cities) 
     If Application.WorksheetFunction.CountIf(countRange, Cities(city)) > 0 Then 
     startRange.Offset(counter, 0) = Application.WorksheetFunction.CountIf(countRange, Cities(city)) 
     startRange.Offset(counter, 1) = Cities(city) 
     counter = counter + 1 
     End If 

    Next city 

End Sub 

Remarques sur les différentes parties:

Ce qui suit récupère la dernière ligne utilisée avant une cellule vide dans la colonne V à partir de V2. Si vous avez des cellules vides avant la dernière cellule utilisée, vous obtiendrez une dernière ligne incorrecte.

lastRow = ws.Range("V2").End(xlDown).Row, "V") 

régler la plage de compter sur de V2 à la dernière ligne utilisée en V avec:

Set countRange = ws.Range(ws.Cells(2, "V"),ws.Cells(lastRow, "V")) 

Définir où vous allez commencer à écrire les résultats avec:

Set startRange = ws.Cells(lastRow, "V").Offset(2, 0) 

Boucle le tableau des villes en comptant les occurrences d'une ville particulière dans la plage de comptage avec:

Application.WorksheetFunction.CountIf(countRange, Cities(city)) 

Retourne dans une instruction IF pour voir si count est> 0.

If Application.WorksheetFunction.CountIf(countRange, Cities(city)) > 0 

écrire à la feuille de compensation de la première position de la pâte par une ligne à chaque fois à l'aide d'une variable compteur:

startRange.Offset(counter, 0) = Application.WorksheetFunction.CountIf(countRange, Cities(city)) 
startRange.Offset(counter, 1) = Cities(city) 
+0

Vous êtes un génie! Je dois étudier votre code merci! – Jonathan

+1

J'ai ajouté quelques explications supplémentaires pour vous aider. Il peut y avoir des façons plus efficaces d'écrire ceci, mais c'est un moyen d'atteindre ce que vous voulez. – QHarr

+0

wow! En passant, j'ai couru le code et ça ne marche pas maintenant, ça dit: La méthode 'Range' de object'_Worksheet 'a échoué.Il met en surbrillance Set countRange = ws.Range (Cellules (2, "V"), Cellules (ws.Range ("V2"). End (xlDown) .Row, "V")) – Jonathan