Récupération de la valeur d'une cellule

Résolu
Panzerz Messages postés 6 Statut Membre -  
Stellou la rebelle Messages postés 20 Statut Membre -
Bonjour à toutes et à tous,

Débutant en VBA, j'essaie de faire une macro permettant d'insérer dans une première feuille des résultats issus d'une seconde. Pour l'instant, une étape fonctionne, la voici :

Sub tri()
Dim Ligne As Single
Dim i As Integer
Dim Ligne_debut As Single
Ligne = 9
Ligne_debut = 9
i = 10
While i < 49
Sheets("Efforts_Portique").Activate
While Cells(Ligne, 4).Value <> ""
Ligne = Ligne + 1
Wend
Sheets("Max_par_elts").Activate
Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"
Cells(i + 1, 5).FormulaR1C1Local = "=MAX(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"
i = i + 2
Ligne = Ligne + 12
Ligne_debut = Ligne
Wend
End Sub
(ne prêtez pas attention à la valeur assignée à "Ligne" et "Ligne_debut")

En gros, la macro cherche dans la feuille "Efforts_Portique" le maximum et le minimum dans une plage de valeurs, et les insère où il faut dans la feuille "Max_par_elts". Ce qu'il me manque, c'est le nombre qui est dans la cellule sur la même ligne que le maximum (ou le minimum) et une colonne avant (les max et min sont recherchés colonne D, le nombre que je cherche est colonne C, sur la même ligne).

Seulement voilà, je n'arrive pas à extraire le numéro de ligne du maximum (ou minimum) trouvé par la macro afin d'atteindre l'autre cellule qui m'intéresse, et l'insérer dans la première feuille.

Si quelqu'un a compris ce que je raconte et se sent l'âme solidaire, je suis preneur de toute aide.

Merci d'avance

7 réponses

  1. Stellou la rebelle Messages postés 20 Statut Membre
     
    Bonjour,

    Excuses moi, je n'ai pas bien compris comment ta fonction chercher ton maximum ?

    Déja pour simplifier ton code tu pourrais au lieu de

    Sheets("Efforts_Portique").Activate

    écrire devant tes cells:

    Sheets("Effort_Portique").Cells(Ligne, 4).Value...etc
    ou encore
    Sheets("Max_par_elts").Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"

    Tu vois ? Boh, c'est juste pour avoir moins de ligne. :)
    0
    1. Panzerz Messages postés 6 Statut Membre
       
      Bonjour Stellou et merci de ton intérêt.

      La feuille "Efforts_Portique" contient plusieurs "salves" de valeurs, toutes dans la colonne D, parmi lesquelles la macro cherche le min et le max pour les mettre dans les cellules (i, 5) et (i +1, 5), et ce pour chaque salve. C'est d'ailleurs pour cette raison que "Ligne" et "Ligne_debut" s'incrémentent, pour passer à la salve suivante.

      Ce qui me manque ici est un moyen de faire le même "transfert" d'une feuille à l'autre pour le nombre dans la cellule à gauche de celle trouvée par la recherche. Mais comme le nombre en question n'est pas un extremum, j'imagine qu'il faut l'extraire par l'intermédiaire de la cellule contenant l'extremum correspondant. Ce qui n'est pas chose aisée pour moi, vous l'aurez compris au vu de ma façon de m'exprimer :)
      0
    2. Stellou la rebelle Messages postés 20 Statut Membre
       
      Ce n'est pas évident pour moi de bien visualiser tes feuilles et de comprendre où se trouve quoi. Pareil, j'ai du mal à comprendre comment ton programme trouve ton min et ton max. Car pour moi avec ce qu'on m'a appris, il faut pour cela comparer des nombres. Or je vois ça nulle part dans ton programme... :s Tu sais je débute dans la programmation aussi, mais j'aimerai t'aider.
      Qu'est ce que formula R1C1Local

      Sub tri()

      Dim Ligne As Single
      Dim i As Integer
      Dim Ligne_debut As Single

      Ligne = 9
      Ligne_debut = 9
      i = 10

      ' Ici tu parcours les lignes de tes cellules
      While i < 49

      Sheets("Efforts_Portique").Activate

      ' dans cette boucle tu calcule le nombre de cellule remplie de ta colonne ?
      While Cells(Ligne, 4).Value <> ""
      Ligne = Ligne + 1
      Wend

      Sheets("Max_par_elts").Activate

      'ci dessous sont les 2 lignes qui permettent de stocker ton min et ton max ?
      Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"
      Cells(i + 1, 5).FormulaR1C1Local = "=MAX(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"

      i = i + 2
      Ligne = Ligne + 12
      Ligne_debut = Ligne

      Wend

      End Sub

      Je te montre ce que j'aurais fait. Après à toi, de l'adapter à ton cas si je n'ai pas réussi à le faire :

      Sub tri()

      Dim Ligne As Integer
      Dim Ligne_debut As Integer
      Dim Max, Min, temp As Integer
      Dim indice_min, indice_max As Integer
      Ligne_debut = 9

      'Calcul du nombre de cellule remplie dans ta colonne D, et oui, il existe une fonction plus besoin de t'embeter
      Ligne = Sheets("Efforts_Portique").WorksheetFunction.CountA(Range("D:D"))

      ' Valeurs initialisées au hasard
      Max = 0
      Min = 10

      ' Ici tu parcours les lignes de tes cellules pour trouver le min et le max et avec leurs indices

      For i = 10 to Ligne

      If cells(i,4) < min then

      min = cells(i,4)
      indice_min = i

      End If

      If cells(i,4) > max

      max = cells(i,4)
      indice_max = i

      End IF

      Next

      ' Ici tu n'as plus qu'à stocker ton min et ton max que la boucle du dessus à trouver et en plus tu as la ligne sur laquelle il se trouvait

      End Sub

      Ici le seul problème est à plusieurs fois le max dans ta colonne ... Est ce que c'est le cas? Bon j'espère que ça va t'aider...
      0
    3. Panzerz Messages postés 6 Statut Membre
       
      Alors, plusieurs choses :

      - la boucle :
      While Cells(Ligne, 4).Value <> ""
      Ligne = Ligne + 1
      Wend

      permet d'incrémenter Ligne tant que la cellule (Ligne, 4) n'est pas vide, elle ne sert pas à compter le nombre de lignes, cela ne m'est d'aucune utilité.

      - la ligne :
      Cells(i, 5).FormulaR1C1Local = "=MIN(Efforts_Portique!D" & Ligne_debut & ":Efforts_Portique!D" & Ligne - 1 & ")"

      entre dans la cellule (i, 5) de la feuille "Max_par_elts" la valeur minimale trouvée dans la plage de cellules "DLigne_debut":"DLigne-1" de la feuille "Efforts_Portique". FormulaR1C1Local sert à insérer une formule dans une cellule.

      Et je suis au regret de t'annoncer que ta solution ne m'aide pas, puisque ma recherche de MIN et de MAX ainsi que leur stockage fonctionnent très bien ^^ mon problème c'est l'autre valeur.
      0
    4. Stellou la rebelle Messages postés 20 Statut Membre
       
      J'avais pas vu que quelqun tavais rép.
      0
  2. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour a vous deux,

    Quelques modif de votre code et recherche cellule C meme ligne que Min et Max.

    Boucle while wend ????????

    Sub tri()
    Dim Ligne As Single
    Dim i As Integer
    Dim Ligne_debut As Single

    Ligne = 9
    Ligne_debut = 9
    i = 10
    While i < 49
    Sheets("Efforts_Portique").Activate
    While Cells(Ligne, 4).Value <> ""
    Ligne = Ligne + 1
    Wend
    Sheets("Max_par_elts").Activate
    Cells(i, 5).FormulaLocal = "=MIN(Efforts_Portique!D" & Ligne_debut & ":D" & Ligne - 1 & ")"
    valD = Cells(i, 5)
    'recherche valeur cellule colonne C meme ligne que MIN
    With Worksheets("Efforts_Portique").Range("D" & Ligne_debut & ":D" & Ligne - 1)
    Set c = .Find(valD, LookIn:=xlValues)
    If Not c Is Nothing Then
    ValC = Worksheets("Efforts_Portique").Cells(c.Row, "C").Value
    End If
    End With
    Cells(i + 1, 5).FormulaLocal = "=MAX(Efforts_Portique!D" & Ligne_debut & ":D" & Ligne - 1 & ")"
    valD = Cells(i + 1, 5)
    'recherche valeur cellule colonne C meme ligne que MAX
    With Worksheets("Efforts_Portique").Range("D" & Ligne_debut & ":D" & Ligne - 1)
    Set c = .Find(valD, LookIn:=xlValues)
    If Not c Is Nothing Then
    ValC1 = Worksheets("Efforts_Portique").Cells(c.Row, "C").Value
    End If
    End With
    i = i + 2
    Ligne = Ligne + 12
    Ligne_debut = Ligne
    Wend
    End Sub
    0
  3. Panzerz Messages postés 6 Statut Membre
     
    Bonjour f894009,

    J'ai entré ton programme, et MIRACLE, il fonctionne à merveille ! Un grand merci donc pour ton aide si précieuse.

    Oserais-je abuser de ta science infuse pour une toute petite question bonus... Il se trouve que j'ai étendu ton programme à d'autres colonnes de mes feuilles, sans aucun souci, sauf arrivé à la colonne P, VBA n'est pas content et me sort une magnifique
    Erreur d'exécution '13' : Incompatibilité de type

    en me surlignant :
    Set p = .Find(valP, LookIn:=xlValues)

    alors que j'ai suivi le même modèle pour toutes les autres colonnes sans qu'il m'ennuie. Une dernière idée ?
    0
  4. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    il fauf un peut plus de details et les lignes de codes.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Panzerz Messages postés 6 Statut Membre
     
    Sub tri()
    Dim Ligne As Single
    Dim i As Integer
    Dim Ligne_debut As Single

    Ligne = 9
    Ligne_debut = 9
    i = 11
    While i < 50
    Sheets("Efforts_Portique").Activate
    While Cells(Ligne, 4).Value <> ""
    Ligne = Ligne + 1
    Wend
    Sheets("Max_par_elts").Activate
    Cells(i, 5).FormulaLocal = "=MIN(Efforts_Portique!D" & Ligne_debut & ":D" & Ligne - 1 & ")"
    valD = Cells(i, 5)
    Cells(i, 7).FormulaLocal = "=MIN(Efforts_Portique!F" & Ligne_debut & ":Efforts_Portique!F" & Ligne - 1 & ")"
    valF = Cells(i, 7)
    Cells(i, 9).FormulaLocal = "=MIN(Efforts_Portique!H" & Ligne_debut & ":Efforts_Portique!H" & Ligne - 1 & ")"
    valH = Cells(i, 9)
    Cells(i, 11).FormulaLocal = "=MIN(Efforts_Portique!J" & Ligne_debut & ":Efforts_Portique!J" & Ligne - 1 & ")"
    valJ = Cells(i, 11)
    Cells(i, 13).FormulaLocal = "=MIN(Efforts_Portique!N" & Ligne_debut & ":Efforts_Portique!N" & Ligne - 1 & ")"
    valN = Cells(i, 13)
    Cells(i, 15).FormulaLocal = "=MIX(Efforts_Portique!P" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"
    valP = Cells(i, 15)
    'recherche valeur cellule colonne C meme ligne que MIN
    With Worksheets("Efforts_Portique").Range("D" & Ligne_debut & ":D" & Ligne - 1)
    Set d = .Find(valD, LookIn:=xlValues)
    If Not d Is Nothing Then
    ValC = Worksheets("Efforts_Portique").Cells(d.Row, "C").Value
    End If
    End With

    With Worksheets("Efforts_Portique").Range("F" & Ligne_debut & ":F" & Ligne - 1)
    Set f = .Find(valF, LookIn:=xlValues)
    If Not f Is Nothing Then
    ValE = Worksheets("Efforts_Portique").Cells(f.Row, "E").Value
    End If
    End With

    With Worksheets("Efforts_Portique").Range("H" & Ligne_debut & ":H" & Ligne - 1)
    Set h = .Find(valH, LookIn:=xlValues)
    If Not h Is Nothing Then
    ValG = Worksheets("Efforts_Portique").Cells(h.Row, "G").Value
    End If
    End With

    With Worksheets("Efforts_Portique").Range("J" & Ligne_debut & ":J" & Ligne - 1)
    Set j = .Find(valJ, LookIn:=xlValues)
    If Not j Is Nothing Then
    ValI = Worksheets("Efforts_Portique").Cells(j.Row, "I").Value
    End If
    End With

    With Worksheets("Efforts_Portique").Range("N" & Ligne_debut & ":N" & Ligne - 1)
    Set N = .Find(valN, LookIn:=xlValues)
    If Not N Is Nothing Then
    ValM = Worksheets("Efforts_Portique").Cells(N.Row, "M").Value
    End If
    End With

    With Worksheets("Efforts_Portique").Range("P" & Ligne_debut & ":P" & Ligne - 1)
    Set p = .Find(valP, LookIn:=xlValues)
    If Not p Is Nothing Then
    ValO = Worksheets("Efforts_Portique").Cells(p.Row, "O").Value
    End If
    End With


    'idem pour le max'

    Cells(i, 4) = ValC
    Cells(i + 1, 4) = ValC1
    Cells(i, 6) = ValE
    Cells(i + 1, 6) = ValE1
    Cells(i, 8) = ValG
    Cells(i + 1, 8) = ValG1
    Cells(i, 10) = ValI
    Cells(i + 1, 10) = ValI1
    Cells(i, 12) = ValM
    Cells(i + 1, 12) = ValM1
    Cells(i, 14) = ValO
    Cells(i + 1, 14) = ValO1
    i = i + 2
    Ligne = Ligne + 12
    Ligne_debut = Ligne
    Wend
    End Sub

    J'ai très certainement fait une usine à gaz mais peu importe, ce que je ne comprends pas c'est que cette macro fonctionne très bien si j'enlève les lignes en gras, relatives à la colonne P.
    0
  7. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Re,

    MIN, MAX, MIX, MAN y a le choix

    Cells(i, 15).FormulaLocal = "=MIX(Efforts_Portique!P" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"

    Cells(i, 15).FormulaLocal = "=MIN(Efforts_Portique!P" & Ligne_debut & ":Efforts_Portique!P" & Ligne - 1 & ")"
    0
  8. Panzerz Messages postés 6 Statut Membre
     
    C'est gentil de prendre le temps de répondre à un débile... xD

    Encore merci beaucoup, problème résolu !
    0