La mise à jour de la feuille ne provoque pas d'action jusqu'à ce que je lance deux fois le module vba

Nouveau sur VBA Je suis confus pour savoir pourquoi j'ai besoin d'exécuter mon module deux fois pour que cela me permette de mettre à jour mes cellules. Mon code:

Option Explicit Sub m_Range_End_Method() Dim lRow As Long Dim lCol As Long Dim currentRow As Long Dim i As Integer Dim rng As Range Set rng = ActiveCell Range("B:B").Select lRow = Cells(Rows.Count, 1).End(xlUp).Row lCol = Cells(1, Columns.Count).End(xlToLeft).Column Sheets("MySheet").Select ' Loop Through Cells to set description in each cell Do While rng.Value <> Empty currentRow = ActiveCell.Row If InStr(rng.Value, "PETROL") = 0 Then Set rng = rng.Offset(1) rng.Select Else Worksheets("MySheet").Cells(currentRow, 5) = "Shopping" Worksheets("MySheet").Cells(currentRow, 6) = "Car" Set rng = rng.Offset(1) rng.Select End If Loop End Sub 

Sur la première course, ce qui se passe dans Excel 2016, c'est que la colonne B est mise en surbrillance et c'est tout. Je dois ensuite appuyer sur "Exécuter" dans l'éditeur de notions de base visuel pour qu'il mette à jour toutes les inputs à quel point la colonne B n'est pas sélectionnée. Tout ce que je veux faire est de mettre à jour les cellules à l'actualité d'une feuille de calcul spécifiée. J'ai lu mais je me suis mis dans une certaine confusion, quelqu'un a dit que je devrais utiliser le

 Range("B:B").Select 

et, pour une raison quelconque, la mise à jour de la feuille de calcul fonctionne, mais seulement si je l'exécute deux fois. Sans cette command Range, pour des raisons que je ne comprend pas, la feuille de calcul ne se met pas à jour – tout ce qui se passe, c'est que la sélection de la boîte se déplace vers les inputs avec Petrol et rest là avec le programme en cours d'exécution mais pas en cours de mise à jour.

Le but du programme est de find dans une feuille toutes les occurrences d'un mot dans la colonne B, dans ce premier cas, c'est PETROL (je vais m'envelopper pour y inclure beaucoup d'autres). Pour cette correspondance sur la même ligne, je souhaite qu'elle mette à jour les colonnes 5 et 6 avec des descriptions. La feuille de calcul Excel aura des centaines de lignes d'inputs avec différentes descriptions dans la colonne B.

Toute aide serait très appréciée.

Je suppose que vous devez l'exécuter deux fois parce que la première fois que vous l'exécutez, ActiveCell pourrait être n'importe quoi, et votre boucle dépend du fait qu'elle n'est pas vide pour commencer, mais après la première exécution, vous avez sélectionné la colonne B (et d'autres choses) …

Lisez cette réponse précédente en évitant l'utilisation de Select and Activate , elle rendra votre code plus robuste: comment éviter d'utiliser des macros VBA sélectionnées dans Excel


Code révisé

Consultez les commentaires pour plus de détails, voici une version plus propre de votre code qui devrait fonctionner première fois / à chaque fois!

 Sub m_Range_End_Method() Dim col As Range Dim rng As Range Dim currentRow As Long ' Use a With block to 'Fully Qualify' the ranges to MySheet With ThisWorkbook.Sheets("MySheet") ' Set col range to the intersection of used range and column B Set col = Intersect(.UsedRange, .Columns("B")) ' Loop through cells in col to set description in each row For Each rng In col currentRow = rng.Row ' Check upper case value match against upper case ssortingng If InStr(UCase(rng.Value), "PETROL") > 0 Then .Cells(currentRow, 5) = "Shopping" .Cells(currentRow, 6) = "Car" End If Next rng End With End Sub