2017-10-19 5 views
0

Voici donc ma situation. Voir l'image pour une meilleure compréhension. Example tableRemplissage de valeurs avec condition IF et en-têtes

Donc ce que je suis en train de faire est que, IF cellule columnn C est pas vide, Excel renseignera 3 premières lettres de la colonne B à D. columnn je macro suivante pour le faire:

Sub FillCountryCode() 

Sheets("Sheet1").Range("D2:D20").Formula = "=IF(C2 <> """", LEFT(B2,3), """")" 

End Sub 

J'ai donc 2 problèmes avec cette solution.

1er) Si je déplace la colonne Country Code, disons à la colonne F, la macro ne fonctionnera plus car elle ne réalise pas que la colonne a été déplacée. Alors quel est le moyen le plus simple de changer la macro pour travailler afin qu'il recherche les bonnes colonnes selon nom de l'en-tête (par exemple Pays Code) et passe ensuite toutes les lignes (dans mon fichier Excel réel il y a des centaines de lignes, quand la table d'exemple a seulement 8). Donc, cela n'a pas vraiment d'importance, dans quelle colonne se trouvent les en-têtes et les cellules pertinents pour la macro.

2ème) Au moment où je détermine manuellement la plage pour la macro, quelle est la commande correcte pour faire macro vérifier toutes les lignes dans le fichier. (Toutes les lignes ont des valeurs dans Marque de voitures et Pays)

Voici la solution que je suis venu, en essayant de résoudre ce problème.

Sub FillCountryCode() 


Worksheets("Sheet1").Activate 
Rows(3).Select 

Set CountRY = Selection.Find(What:="COUNTRY", After:=ActiveCell, LookIn:=xlFormulas, _ 
          LookAt:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 

Set ENGINE = Selection.Find(What:="ENGINE", After:=ActiveCell, LookIn:=xlFormulas, _ 
          LookAt:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 

Set COUNTRYCODE = Selection.Find(What:="COUNTRYCODE", After:=ActiveCell, LookIn:=xlFormulas, _ 
          LookAt:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 

Dim LastItemRow As Long 

LastItemRow = Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row 

For pointer = 4 To LastItemRow 

    If Cells(pointer, ENGINE.Column) <> "" Then 

     Cells(pointer, COUNTRYCODE.Column).Value = Sheets("Sheet1").Left(Cells(pointer, COUNTRY.Column), 3) 

    End If 

Next pointer 

End Sub 

En essayant cette solution, il y a un problème dans la condition IF, mais je ne comprends pas ce qu'il est. Est-ce que quelqu'un peut m'aider? L'erreur que j'obtiens est: Erreur 438: L'objet ne supporte pas cette propriété ou méthode.

+0

1) Vous pouvez utiliser la méthode Application.Match ou Find pour trouver la colonne correcte, puis la référence dans votre code. 2) Il existe d'innombrables exemples en ligne montrant comment trouver la dernière ligne/colonne. Avez-vous vraiment essayé et n'avez pas été en mesure d'appliquer quoi que ce soit? – SJR

+0

Ne serait-il pas préférable de le formater en tant que table et d'utiliser les propriétés intrinsèques de la table? –

+1

Bonjour @SJR. J'ai collé ma solution actuelle, si cela aide à répondre. – Bradi

Répondre

0

Je pense que vous méritez les points que vous avez fait la plupart du travail. Je ne fais que poster votre code avec quelques modifications pour le rendre un peu plus efficace et éviter les messages d'erreur. J'ai ajouté quelques commentaires pour expliquer les changements

Sub FillCountryCode() 

Dim COUNTRY As Range, ENGINE As Range, COUNTRYCODE As Range 'declared all your variables 
Dim LastItemRow As Long, pointer As Long 

With Worksheets("Sheet1") 'removes Selects and need to repeat sheet reference elsewhere 
    Set COUNTRY = .Rows(3).Find(What:="COUNTRY", LookIn:=xlFormulas, _ 
          LookAt:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 'remove ActiveCell reference as will error if not in search range 
    Set ENGINE = .Rows(3).Find(What:="ENGINE", LookIn:=xlFormulas, _ 
          LookAt:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 
    Set COUNTRYCODE = .Rows(3).Find(What:="COUNTRYCODE", LookIn:=xlFormulas, _ 
          LookAt:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 

    If Not COUNTRY Is Nothing And Not COUNTRYCODE Is Nothing And Not ENGINE Is Nothing Then 'avoids error if text not found 
     LastItemRow = .Cells(Rows.Count, "A").End(xlUp).Row 
     For pointer = 4 To LastItemRow 
      If .Cells(pointer, ENGINE.Column) <> "" Then 
       .Cells(pointer, COUNTRYCODE.Column).Value = Left(.Cells(pointer, COUNTRY.Column), 3) 
      End If 
     Next pointer 
    End If 
End With 

End Sub 
+0

Merci beaucoup pour la réponse et les commentaires aussi. Je ne savais pas que je peux éviter de répéter le même mot. :) – Bradi