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
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.
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.
4 « J'aime »
@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.
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,
1 « J'aime »
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.
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 ......