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 With

A 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 With

voilà, 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 With

Dans 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ée

Pré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 If

Ici, 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 With

La 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

Rechercher des sujets similaires à "probleme adressage"