VBA recherchev + si

8classeur1.xlsx (21.08 Ko)

Bonjour,

j'aimerais créer un code vba qui me permet de déterminer le siren du transporteur en fonction du type et du nom du transporteur. Mon exemple est court mais je souhaite l'appliquer à un tableau de 8500 valeur c'est pour cela que le code vba est plus simple que faire la formule en cellule.

Pour cela je souhaite faire un code vba qui ressemble à ça :

Dim i as integer

Dim r as variant

Le i va me permettre de compter les lignes.. mais je ne sais pas comment l'appliquer

tant que A est différent de ensemble vide alors

if sheets("suivi").range("A"&i).value = "inopiné" then

r = application.worksheetfunction.vlookup(sheets("suivi").range("B"&i),sheets("frs_moso".range("Tableau2"),2, false)

else

if sheets("suivi").range("A"&i).value = "régulier" then

r = application.worksheetfunction.vlookup(sheets("suivi").range("B"&i),sheets("frs_reg".range("Tableau24"),2, false)

sheets("suivi").range("c"&i).value = r

end if

end if

Pouvez vous m'aider à structurer mon code en fonction de mon fichier s'il vous plait ?

Hello,

C'est mieux d'utiliser les balises pour insérer du code.

Ton exemple n'est pas terrible ... tu ne prends pas la peine d'aller au bout de ta demande ...

Ceci étant dit, tu veux ajouter dans ta feuille "suivi" un type + un transporteur et tu veux récupérer le siren associé à ce transporteur ?

Dans ton post ce n'est pas expliqué clairement non plus ... mais si j'ai suivi le type "inopiné" correspond à la 2eme feuille, "regulier" correspond à la 3eme et "hors_moso" bah j'en sais absolument rien ... ???

Bonjour,

j'ai rajouté la feuille hors_moso.

En effet en fonction du type, il faut aller chercher dans la feuille associée.

Un début de mon code mais celui est long et la boucle ne se termine pas ....

Merci pour votre retour

Sub recherchesiren()
Dim i As Integer
Dim r As Variant
Dim d1 As Long

d1 = Sheets("suivi").Range("A" & Rows.Count).End(xlUp).Row

i = 1
For i = 1 To d1
    If Sheets("suivi").Range("A" & i).Value = "inopiné" Then
    r = Application.VLookup(Sheets("suivi").Range("B" & i), Sheets("frs_moso").Range("A1:B4"), 2, False)
    Sheets("suivi").Range("C" & i).Value = r
    Else
      If Sheets("suivi").Range("A" & i).Value = "régulier" Then
      r = Application.VLookup(Sheets("suivi").Range("B" & i), Sheets("frs_reg").Range("A1:B4"), 2, False)
      Sheets("suivi").Range("C" & i).Value = r
      Else
        If Sheets("suivi").Range("A" & i).Value = "hors_moso" Then
        r = Application.VLookup(Sheets("suivi").Range("B" & i), Sheets("frs_hors_moso").Range("A1:B4"), 2, False)
        Sheets("suivi").Range("C" & i).Value = r
        End If
      End If
      i = i + 1
     End If
Next i
End Sub
8classeur1.xlsm (30.58 Ko)

Tu étais pas loin.

3s pour 10 000 lignes.

10olb-classeur1-1.xlsm (176.72 Ko)

Bonjour,

Je te remercie pour tes ajustement.

En effet ce code fonctionne bien mais seul bémol, imaginons que je change la valeur de TYPE ou la valeur TRANSPORTEUR, la valeur SIREN ne change pas et donc ne se calcule pas automatiquement.

Qu'est ce qu'il faut changer dans le code pour que si j'insère une ligne ou si je change une valeur le siren se calcule automatiquement et non grâce à un bouton quand je le souhaite.

Merci pour ton retour

Il faut que tu ajoutes ton code dans un évènement de feuille, en particulier un évènement "change" dans ton besoin.

Il faudra aussi faire quelques verifs avant de lancer ton code.

Une chose encore, si tu parviens à faire ça, il faudra aussi t'interroger sur : "Est ce que lorsque je change une valeur je veux mettre à jour mes 10 000 lignes ou juste la ligne en cours.

Tu sauras faire ça ?

Bonjour,

En effet mettre le code sous un évènement "change", c'est ce à quoi je pensais mais justement je veux que ça actualise que la ligne en cours. Et ça je ne sais pas faire ....

Aurais tu la solution ?

Bonjour, Rag02700,

Excusez moi d'intervenir pour proposer une solution "VBA".

Une proposition "globale" avec un temps de 0.3 seconde... EN fait je passe par des tableaux sous VBA pour une exécution plus rapide, cela évite les accès feuille et les fonctions feuille utilisées sous VBA. Le fichier :

10olb-classeur1-1.xlsm (186.50 Ko)

@ bientôt

LouReeD

Bonjour LouReeD,

En effet, ta méthode me semble super mais toujours le même problème si je change la valeur de TYPE ou la valeur TRANSPORTEUR, la valeur SIREN ne change pas et donc ne se calcule pas automatiquement.

Lorsque je change une valeur, j'aimerais que la valeur siren se mette à jour et seulement pour la ligne concernée.

Saurais tu faire ?

Merci pour ton aide

De plus, imaginons que je veuille rajouter le N°CONTRAT associé au type et au siren comment faire ?

if sheets("suivi").range("A"&i).value = "inopiné" then
Sheets("suivi").Range("D" & i).Value = Application.VLookup(Sheets("suivi").Range("C" & i), Sheets("frs_moso").Range("A1:B4"), 3, False)

fichier joint

L'idée était de passer en VBA afin de gagner du temps, mais pour le reste il faut évidemment mrttre en place une surveillance événementielle pour le déclenchement du code.

Ensuit pour l'histoire de l'ajout, cela implique une modification du code pour s'adapter sur les données en sortie et les rechrrche en entrée.

Mais le principe de jouer avec les noms des tableaux structuré sous excel, lors de leur importation sous VBA peu importe le nombre de lignes et de colonnes c'est automatique, par contre les boucles et les données de sorties elles sont fixes donc si changement alors modif du code.

Sinon il y a la formule indirect, mais là aussi il y aura des adaptations à faire en fonctiondes modifications futures...

Je suis sur téléphone donc je ne peux pas voir le fichier joint...

@ bientôt

LouReeD

Je comprends ce que vous me dites mais je n'arrives pas à me rendre compte de comment procéder ..... POurriez vous m'aider à le faire sur mon fichier s'il vous plait ?

Rechercher des sujets similaires à "vba recherchev"