Mes questions
Vous n'avez posé aucune question.
Gagnez des points en posant votre question !
Mes contributions
Vous n'avez répondu à aucune question.
Vous pouvez gagner des points en répondant à des questions !

Lecture d'une valeur dans Excel Via SW et récupération d'une référence dans le même tableur

Mouette
106
Vues

Bonjour,

Je cherche à rédiger une macro permettant de scruter un document excel composé de deux colonnes : une colonne avec des hauteurs la seconde avec un code référence affecté à chaque hauteur (un fichier est joint en exemple).

L'utilisateur reseigne dans un UF une valeur de hauteur et je voudrais que la macro srute le fichier Excel et m'affiche dans une autre case de l'UF la référence affectée à cette hauteur. Jusque là j'arrive à ouvrir excel mais lorsque j'essaie de faire les opérations de comparaison : valeur renseignée dans le UF par l'utilisateur EGALE à la valeur de la colonne scrutée, ça ne fonctionne pas.

J'ai vérifié et mon programme scrute bien toutes les valeurs (j'ai fait afficher des msgbox pour chaque boucle testées : if, while, for, etc.) mais la comparaison ne fonctionne pas. Comme si il ne trouvait jamais de valeur égale.

Je suis sous SW 2012

Private Sub MAJCmd_Click()

Dim xlApp           As Excel.Application
Dim xlWB            As Excel.Workbook
Dim exSheet         As Excel.Worksheet
Dim i               As Integer

'On ouvre Excel
Set xlApp = New Excel.Application
xlApp.Visible = True


'On ouvre le fichier de références des panneaux
Set xlWB = xlApp.Workbooks.Open("Y:\PDM\NAVIRES\TEST VALIDATION\CAO\TEST-Standards\Hauteurs Panneaux.xlsx")
Set exSheet = xlWB.ActiveSheet
xlApp.Visible = True


For i = 1 To 50 Step 1
    If exSheet.Cells(i, 2).Value <> oCabinHigh Then
    Else
    oCodeHigh = Val(exSheet.Cells(i, 3))
    End If
Next
        
MsgBox oCodeHigh
        
xlWB.Close
xlApp.Quit

Set exSheet = Nothing
Set xlWB = Nothing
Set xlApp = Nothing

End Sub

Merci d'avance.

Une Mouette en détresse

hauteurs.xlsx

Il y a 18 jours
Modélisation volumique 3D, SO ...
Cyril.f
Meilleure réponse

Bonjour,

Le problème provient de la boucle for.

Lorsque la valeur est trouvée il faut sortir de la boucle sinon le code continue de s'exécuter et écrase la valeur trouvée. En gros:

For i = 1 To 50
    If exSheet.Cells(i, 2).Value = oCabinHigh Then
         oCodeHigh = Val(exSheet.Cells(i, 3))
         Exit For
    End If
Next

Et pour les cellules et colonne dans excel ça part de 1. En gros Colonne A ligne 1 = Cells(1,1) en l'occurence dans ton code tu scrutes B et renvoi C soit une valeur vide.

Il y a 18 jours
Roub25

Salut Mouette,

Vu le code que tu affiche c'est du Vba excel or je m'y connais en vba SW mais ça doit être similaire. Si je comprends bien ce que tu VEUX écrire c'est qu'il recherche dans la colonne A et dans la ligne i, i étant la variable de ta boucle pour faire toutes les lignes ? 

Or pour moi tu ECRIS que tu veux chercher dans la colonne i donc 1=A, 2 =B etc dans la ligne 2 donc tu ne te déplaces pas dans la bonne direction. Revois tes conditions car du coup pour scruter toutes les lignes tu dois partir de 2 et revois l'ordre dans ta désignation de cellule car une Cellule c'est une lettre et un nombre.

De plus je ne sais pas en vba excel mais sur solidworks il faut convertir les nombre en caractères pour avoir la lettre de la colonne.

Il y a 18 jours
Cyril.f

Bonjour,

Le problème provient de la boucle for.

Lorsque la valeur est trouvée il faut sortir de la boucle sinon le code continue de s'exécuter et écrase la valeur trouvée. En gros:

For i = 1 To 50
    If exSheet.Cells(i, 2).Value = oCabinHigh Then
         oCodeHigh = Val(exSheet.Cells(i, 3))
         Exit For
    End If
Next

Et pour les cellules et colonne dans excel ça part de 1. En gros Colonne A ligne 1 = Cells(1,1) en l'occurence dans ton code tu scrutes B et renvoi C soit une valeur vide.

Il y a 18 jours

@Roub25

Au temps pour moi, j'ai fait un copier/coller de mon code, sur mon excel d'origine je suis bien sur la colonne B en lecture et je récupère une valeur colonne C, je sais que pour ça je n'ai pas de souci. comme je disais j'avais testé les boucles en faisant apparaitre des MsgBox pour valider que j'arrivais bien à lire les données du tableur.

J'éai donc bien écrit un Code VBA sous SW pour lire Excel j'ai modifié ma boucle For comme indiqué par @Cyril.f et je demande de rechercher la valeur 2110 (qui existe dans les 50 premières valeurs avec la référence 0) mais la correspondance n'est pas reconnue.

For i = 3 To 20 Step 1
    MsgBox exSheet.Cells(i, 2).Value & "....." & exSheet.Cells(i, 3).Value
    If exSheet.Cells(i, 2).Value = oCabinHigh.Value Then
        oCodeHigh = Val(exSheet.Cells(i, 3))
        Exit For
    End If
Next

J'ai peut-être une erreur dans la déclaration des variables qui causerait problème ? ou la formule Val(...) ne fonctionne pas ou ... ?

La boucle scrute toutes les cellules de B3 à B20 (testée par l'affichage des msgbox) mais c'est tout je n'ai rien de plus.

 

Il y a 18 jours
d.roger

Bonjour,

Après un test sur le fichier Excel joint, changement dans le numéro des colonnes :

For i = 1 To 50 Step 1
    If exSheet.Cells(i, 1).Value <> oCabinHigh Then
    Else
    oCodeHigh = Val(exSheet.Cells(i, 2))
    End If
Next

Cordialement,

Il y a 18 jours

Merci à tous en faisant des cumuls de toutes les réponses j'ai trouvé la solution (qui à l'air de fonctionner pour le moment)

    If Val(exSheet.Cells(i, 2)) = Val(oCabinHigh) Then
        oCodeHigh = exSheet.Cells(i, 3)
        Exit For
    Else

C'était donc, a priori, la manière d'identifier la valeur de mes variables qui n'était pas correcte.

Merci encore à tous pour la rapidité de vos réponses.

Il y a 18 jours

Alors des fois il faut savoir faire simple et utiliser les outils natifs d'excel :

tu sélectionnes ta première ligne, tu vas dans 'données' 'filtre automatique'

Du coup en cliquant sur le nom de ta colonne tu peux faire un magnifique filtre avec des options poussées.

Si le but est juste de trouver le code associé à la longueur c'est plus que largement suffisant sans se prendre la tête ......

Il y a 10 jours