Problème d'adressage
Bonjour à tous,
Je suis bloqué car il y a quelquechose que je ne comprends pas dans Excel :
Je dispose de 3 feuilles ou Sheets pour les intimes.
Une s'appelle DataBase_Sheet, l'autre Calculation_Sheet, et la troisième IHM_Sheet.
Dans une procédure je veux jouer avec les données des trois feuilles simultanément. Voici le morceau de code suivant :
With Sheets(IHM_Sheet)
For Each Cell In Range(Range(CompFirst6amAddress), Range(CompFirst6amAddress).Offset(0, 23))
'Flow value is allocated to the Calculation_Sheet from the DataBase_Sheet. Offtakes are not implemented for the moment.
If (FlowDirection = "EtoW") Then
Sheets(Calculation_Sheets).Range("B17") = Sheets(DataBase_Sheet).Range(Cells(1, 2), Cells(65536, Range("B65536").End(xlUp).Column)).Find(what:="06:00:00 AM").Offset(0, 2)
Else
Sheets(Calculation_Sheets).Range("AP33") = Sheets(DataBase_Sheet).Range(Cells(1, 2), Cells(65536, Range("B65536").End(xlUp).Column)).Find(what:="06:00:00 AM").Offset(0, 2)
End If
'Minimum pressure profile Calculation
Call ReverseCalculation(Pconstraint_1, OMP, CellCalculation_Start, FlowDirection)
'Minimum pressure value copy from the Calculation_Sheet to the DataBase_Sheet
Call AllocateCalcSheetToDataBase(DataBase_Sheet, Calculation_Sheet, 3000, Cell.Value, FlowDirection, 5)
'Line-pack value copy from the Calculation_Sheet to the DataBase_Sheet
Call AllocateCalcSheetToDataBase(DataBase_Sheet, Calculation_Sheet, 3001, Cell.Value, FlowDirection, 7)
Next Cell
End WithA vrai dire je crois que je n'ai pas bien compris le processus d'allocation avec les With, .Activate, etc.
Pourriez vous m'expliquer comment faire une allocation propre et nette en m'indiquant rapidement les règles pour bien adresser les variables ??
Merci beaucoup !
Bonjour,
2 remarques :
1 - lorsque tu utilises la commande with, il faut que les objets, méthodes, et propriétés se rapportant à l'objet pour lequel tu mets en place ta commande with soient précédés d'un point . afin de lier ces objets, méthodes etc... à l'objet en question.
Autrement dit, ici, voici comment tu devrais écrire ton code :
With Sheets(IHM_Sheet)
For Each Cell In .Range(.Range(CompFirst6amAddress), .Range(CompFirst6amAddress).Offset(0, 23))
End Withvoilà, comment ici, tu "lies" ta plage de cellules à ta feuille IHM_Sheet, sans cela, Excel traite la plage de la feuille active et non plus de la feuille désirée, avec des résultats inattendus !
A noter qu'entre les "balises" with, tu peux faire référence à d'autres feuilles en précisant le nom de la feuille : par exemple
With Sheets(IHM_Sheet)
.Range("A1").copy Destination:=Sheets("Feuil2").Range("B5")
End WithDans l'exemple ci-dessus, la cellule A1 appartenant à la feuille IHM_Sheet va être recopiée dans la cellule B5 de Feuil2.
2 - L'utilisation de la fonction Find set fait de la façon suivante :
commence par adresser la cellule dans laquelle tu vas trouver le résultat de ta recherche
dim myRange as Range
set myRange = 'résultat à trouver dans une plage donnéePrécise la plage dans laquelle tu fais ta recherche et paramètre ta fonction Find
dim myRange as Range
set myRange = Range("A1:A5").Find(what:="AA",Lookin:=xlValues, Lookat:=xlWhole)ici, la recherche se fait pour la chaine de caractères AA, par valeur (xlValues) et AA doit représenter la totalité de la chaîne de caractères trouvée (xlWhole), par opposition à la commande xlPart qui validera une chaine de caractères qui contient AA.
dim myRange as Range
set myRange = Range("A1:A5").Find(what:="AA",Lookin:=xlValues, Lookat:=xlWhole)
If not myRange Is Nothing Then
myRange.Select
End IfIci, la macro demande de sélectionner la cellule dans laquelle se trouve le résultat de la recherche dans le cas où celui-ci existe.
A noter que s'il existe d'autres occurences de AA dans la plage de recherche, le code s'allonge un petit peu.
Il faut, entre autres, faire appel à la fonction FindNext et créer une boucle du type Do.... Loop Until.
Je te suggère de consulter la page de référence suivante pour la fonction Find - FindNext...
http://boisgontierjacques.free.fr/
voilà, j'espère que ça te sera utile.
Merci beaucoup pour ta réponse !
J'ai fait les choses proprement cette fois ci et obtient le code suivant .
With Sheets(Calculation_Sheet)
If (FlowDirection = "EtoW") Then
Set CellCalculation_Start = .Range("AN22")
Else
Set CellCalculation_Start = .Range("C38")
End If
End With
With Sheets(IHM_Sheet)
For Each c In .Range(.Range(CompFirst6amAddress), .Range(CompFirst6amAddress).Offset(0, 23))
'Flow value is allocated to the Calculation_Sheet from the DataBase_Sheet. Offtakes are not implemented for the moment.
'Because the offtakes are not implemented it is not necessary to create an AllocateDataBaseToCalcSheet procedure. Therefore one search is undertaken
'in order to find for each hour the corresponding flow
'PBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
With Sheets(DataBase_Sheet)
Dim CellResult As Range
Set CellResult = .Range(.Cells(1, 2), .Cells(.Range("B65536").End(xlUp).Row, 2)).Find(What:="6:00:00 AM", After:=.Cells(1, 2), LookIn:=xlValue, Lookat:=xlWhole)
If Not CellResult Is Nothing Then
If (FlowDirection = "EtoW") Then
Sheets(Calculation_Sheet).Range("B17") = CellResult.Offset(0, 2)
Else
Sheets(Calculation_Sheet).Range("AP33") = CellResult.Offset(0, 2)
End If
End If
End With
'PBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Next c
End WithLa ligne suivante ne fonctionne pas ...
Set CellResult = .Range(.Cells(1, 2), .Cells(.Range("B65536").End(xlUp).Row, 2)).Find(What:="6:00:00 AM", After:=.Cells(1, 2), LookIn:=xlValue, Lookat:=xlWhole)et ceci provient du FInd. En effet si j'enleve le code avec le find et que j'active CellResult , je peux dès lors voir le bon range s'afficher. Par contre quand je rajoute le Find , il me met " Subscript out of out of Range" et j'avoue ne pas trop comprendre.
Une idée ?
mets un s à la fin de xlValues
... C'est incroyable. On passe toujours plus de temps sur les trucs les plus simples plutôt que sur les problèmes vraiment complexes.
Merci beaucoup