Ecriture ligne de code : variable (cellule et feuille)
Bonjour
Ma demande concerne uniquement une inconpréhension d'une erreur, pas plus :)
hauteur = Cells(num, 3)Si vous souhaitez le contexte :
Dans un fichier Excel, il m'a été demander de créer une facture auquel en indiquant des (références produits => nom de feuille) ainsi que la (taille du produit => hauteur : colonne A, largeur : colonne B).
Étant donné que les feuilles sont rangé de manière assez désordonné, jamais le même nombre de ligne, .. Je ne peux pas effectué de RechercheV (sauf erreur de ma part), du coup, je me suis dis que cela ne pouvais se faire que par VBA. L'idée étant que : Si en tel cellule on ne retrouve pas celui du bas, alors + 1 vers le bas et si "" alors rebelotte pour colonne g.
Private Sub CommandButton1_Click()
'dans un tableau de reference de produit à facturer
Dim ref As Worksheet 'aller chercher dans la feuille spécifique au produit
Dim hauteur As Integer
Dim largeur As Integer
Dim num As Byte
Dim num2 As Byte
Dim num3 As Byte
Dim num4 As Byte
num = 5 'dans le tableau que je complète auquel après j'appuie sur le bouton pour retrouver les éléments
num2 = 5 'dans le tableau où retrouver la bonne taille, ça commence en ligne 5
Do While Cells(num, 6) <> "" 'si les éléments ont déjà été complété : suivant
num = num + 1
hauteur = Cells(num, 3) 'récupération de la taille du produit
largeur = Cells(num, 3)
ref = Cells(num, 3)
'dans les données où il y a deux colonnes pour trouver la bonne taille
Do While ThisWorkbook.Worksheets(ref).Cells(num2, num3).Value <> ""
num3 = num3 + 7 'soit en colonne A ou en G
num2 = 5 'Après être aller en colonne G, retour à la ligne 5
Do While Worksheets(ref).Cells(num2, num3).Value >= hauteur 'jusqu'à ce qu'on trouve la bonne taille ou presque
num2 = num2 + 1
Loop
Loop
Loop
'Simple vérification de ce qu'on trouvés les variables
Range("a1") = ref
Range("a2") = hauteur
Range("a3") = largeur
Range("a4") = num
Range("a5") = num2 & "numéro de ligne"
Range("a6") = num3 & "numéro de colonne"
End SubEn lisant les cours de VBA, je ne comprend pas mon soucis.
En tout cas, je serai très heureux si quelqu'un venait à me dire quel est le soucis.
Merci d'avance !!
Bonjour,
supprimé
A+
Bonjour,
Étant donné que les feuilles sont rangé de manière assez désordonné, jamais le même nombre de ligne, .. Je ne peux pas effectué de RechercheV (sauf erreur de ma part)
Si tu recherches une valeur exacte ça ne devrait pas poser de problème.
Mais sans fichier ni exposé du problème...
eric
Bonjour
Merci de vos retours, je ne pensais que dans ce contexte vous auriez eu besoin que je mette le fichier, du coup, je m'en excuse.
En relisant mon VBA, j'ai pu tout de même rectifier quelques erreurs dans mon code, le voici de nouveau :
Private Sub CommandButton1_Click()
'dans un tableau de reference de produit à facturer
Dim ref As Worksheet 'aller chercher dans la feuille spécifique au produit
Dim hauteur As Integer
Dim largeur As Integer
Dim num As Byte
Dim num2 As Byte
Dim num3 As Byte
Dim num4 As Byte
Dim résultat1 As Double, résultat2 As Double, résultat3 As Double, résultat4 As Double
num = 5 'dans le tableau que je complète auquel après j'appuie sur le bouton pour retrouver les éléments
num2 = 5 'dans le tableau où retrouver la bonne taille, ça commence en ligne 5
Do While Cells(num, 6) <> "" 'si les éléments ont déjà été complété : suivant
num = num + 1
num3 = 1
hauteur = Cells(num, 5) 'récupération de la taille du produit
largeur = Cells(num, 4)
ref = Cells(num, 3)
'dans les données où il y a deux colonnes pour trouver la bonne taille
Do While Worksheets(ref).Cells(num2, num3).Value = ""
If Worksheets(ref).Cells(5, 5) = "" Then 'soit la 2e colonne est en F ou en H, donc la colonne précédente est vide
num3 = 6
num2 = 5 'Après être aller en colonne G, retour à la ligne 5
Else
num3 = 8
num2 = 5 'Après être aller en colonne G, retour à la ligne 5
End If
Do While Worksheets(ref).Cells(num2, num3).Value >= hauteur 'jusqu'à ce qu'on trouve la bonne taille ou presque
num2 = num2 + 1
Loop
Loop
Loop
résultat1 = Worksheets(ref).Cells(num2, num3).Value
résultat2 = Worksheets(ref).Cells(num2, num3 + 1).Value
If Worksheets(ref).Cells(5, 5) = "" Then
résultat3 = 0
résultat4 = 0
Else
résultat3 = Worksheets(ref).Cells(num2, num3 + 2).Value
résultat4 = Worksheets(ref).Cells(num2, num3 + 3).Value
End If
'Simple vérification de ce qu'on trouvés les variables
Range("a2") = hauteur
Range("a3") = largeur
Range("a4") = num
Range("a5") = num2 & "numéro de ligne"
Range("a6") = num3 & "numéro de colonne"
Range("a7") = résultat1
Range("a8") = résultat2
Range("a9") = résultat3
Range("a10") = résultat4
End SubDu coup, je sens que je suis tout proche de la fin.
Et comme demandé, je vous mets la pièce jointe le fichier, étant donné ce sont des éléments confidentiels, je ne pouvais pas le mettre en ligne, ainsi j'ai créer un fichier en reprenant la mise en forme et quelques données. Dans le fichier original, il y a une vingtaine de feuilles et c'est pour cela que je ne peux pas naviguer facilement, d'où mon besoin pour le vba.
Dans le fichier, j'ai mis de la couleurs, j'ai essayer d'être le plus possible.
Et merci encore pour vos retour, ça m'aide énormement !!
Bonjour,
Dans ton exemple la feuille ref n'existe pas
Si l'on suppose qu'il s'agit de la feuille "ref AB" :
set ref = Worksheets( "ref AB")Je rajoute un
set ref = Worksheets( "ref AB")Je n'entre pas dans la boucle
Cells(num, 6)car la colonne F est vide...
donc la ligne :
résultat1 = Worksheets(ref).Cells(num2, num3).Valueplante car num3 = 0
Du coup j'ai arrêté là car après pour moi ça ne veut plus rien dire...
Nota : l'indentation est à revoir !
Voir les commentaires dans la macro...
A+
Bonjour
Merci beaucoup d'avoir pris du temps pour m'aider !!
Je me suis surement mal expliqué : Il y a beaucoup de feuille qui ont chacune leur référence, du coup, le vba doit d'abord rechercher dans quelle feuille rechercher la référence, d'où le fait que je n'avais pas mis le :
Set ref = Worksheets("ref AB")Car il y en a une vingtaine. Et il faut qu'il soit une variable modifiable
Ensuite, une fois dans la bonne feuille, il doit rechercher la hauteur qui est supérieur ou égal (le prix se fixera là dessus).
Et juste après la largeur (mais vue que cela fonctionnera pareil, quand je verrai l'outil fonctionner pour la hauteur, je serai comment faire pour la largeur).
Une fois la bonne ligne, le code place les valeurs dans ma grille de base et passe à la ligne suivante pour la référence suivante et ainsi de suite.
Lorsque je n'avais pas préciser d'où allait cherchait les " Cells " sans les indication " Worksheets " c'était pour la feuille actuel (la grille où je retrouver les montants des références produits).
Encore merci et bon dimanche !
A+
Salut Hamaterasu,
Salut Eriiic, Galopin,
comme je comprends l'affaire, ça devrait être pas loin de ceci.
Évidemment, sans autres feuilles pour tester, cela reste de la haute voltige sans filet !
SI la structure de tes feuilles 'Ref..." est régulière ET permanente de feuille en feuille, etc..., bla, bla, bla...
Private Sub CommandButton1_Click()
'
Dim rCel As Range, iHT%, iLG%, iOK%
'
On Error Resume Next
For x = 3 To Range("C" & Rows.Count).End(xlUp).Row
iOK = 0
iHT = (Fix(Cells(x, 5) / 100) + 1) * 100
iLG = Cells(x, 4)
With Worksheets(CStr(Cells(x, 3)))
For y = 1 To .Cells(4, Columns.Count).End(xlToLeft).Column Step 7
Set rCel = .Columns(y).Find(what:=iHT, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext)
If Not rCel Is Nothing Then
For Z = rCel.Row To .Range(fctCol(y) & Rows.Count).End(xlUp).Row
If .Cells(Z, y).MergeArea.Cells(1, 1) = iHT And .Cells(Z, y + 1) >= iLG Then
For k = 1 To 4
Cells(x, 5).Offset(0, k) = .Cells(Z, y + 1).Offset(0, k).MergeArea.Cells(1, 1)
Next
iOK = 1
Exit For
End If
Next
End If
If iOK = 1 Then Exit For
Next
End With
Next
On Error GoTo 0
'
End Sub
A+
INCROYABLE, merci infiniment, je m'aperçois que j'ai tellement à apprendre, je vais essayer de comprendre au mieux ton code.
Merci !