Problème VBA

thomasmbai

XLDnaute Nouveau
Bonjour,

Je débute en VBA. J'ai utilisé l'assistant pour obtenir le code suivant :

Code:
    Range("N2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(ISBLANK(RC[-13]),"""",IF(RC[-5]=""Box"",""Box"",(RC[-2]-RC[-3])/RC[-4]))"
    Range("N2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.FillDown

Je souhaite réécrire ce code en utilisant une boucle For. Voici ce que j'ai écrit :

Code:
    Dim nb_lignes As Integer
    nb_lignes = WorksheetFunction.CountA(Range("A:A"))
    MsgBox nb_lignes
    
    For i = 2 To nb_lignes

    Range(i, n).FormulaR1C1 = "=IF(ISBLANK(RC[-13]),"""",IF(RC[-5]=""Box"",""Box"",(RC[-2]-RC[-3])/RC[-4]))"
    
    Next


Je crois avoir compris que l'erreur vient de

Code:
Range(i, n)

Pouvez vous me dire comment dois je l'écrire ? Pourquoi cela ne fonctionne pas ?


Je vous remercie de votre aide.
 

Excel-lent

XLDnaute Barbatruc
Re : Problème VBA

Bonjour Thomasmbai,

En effet, tu as un soucis dans cette partie du code :

Code:
Range(i, n)


i c'est une variable défini qui contient un nombre : jusque là, rien à redire.
n est aussi une variable? Que contient-elle?

De plus, dans ton cas, au lieu d'utiliser Range(...), je choisirais plutôt : Cells(...)

Comment fonctionne Cells(...) :
Cells(NuméroDeLaLigne, NuméroDeLaColonne)

Il ne te reste plus qu'à mettre dans ces deux variables les chiffres qui t'intéressent. Attention, contrairement à la fonction Range(), le premier élément est le numéro de la ligne, et non pas COLONNE ;)

Bonne fin de soirée
 

thomasmbai

XLDnaute Nouveau
Re : Problème VBA

Bonsoir,

D'abord merci pour tes réponses. En effet, n représent la colonne N. Grace à toi, j'ai compris qu'il faut mettre le n entre guillemets. De plus, contrairement à ce que je pensais avec range on met la colonne puis la ligne.


Quelle différence entre l'utilisation Range et Cell ?
 

Excel-lent

XLDnaute Barbatruc
Re : Problème VBA

Hello,

Fonction Range :
Dans son utilisation la plus courante, dans la référence de la colonne est indiqué par une LETTRE : colonne A, colonne B, colonne ...

Bref, pour parler de la cellule B10 tu écriras :
Range("B10")

Fonction Cells :
Alors que là, la référence de la colonne est indiqué par sa position : en CHIFFRE. Pour parler de la colonne :
-> A, tu écriras : 1
-> B, tu écriras : 2
-> AA, tu écriras : 27
-> AB, tu écriras : 28
-> ...

Bref, pour parler de la cellule B10 tu écriras :
Cells(10, 2)

Evidement, tu peux remplacer les chiffres 10 et 2 par des variables.

----------------------------------------------------
Pourquoi la plupart préfère la solution Cells()?

Imagine le cas suivant :
Je veux
-> traiter la colonne B2
-> traiter la prochaine colonne paire : D2
-> traiter la prochaine colonne paire : F2
-> ...


Il est plus facile de dire
-> colonne : 2 -> B
-> colonne suivante à traiter : colonne précédente (2) + 2 -> D
-> colonne suivante à traiter : colonne précédente (4) + 2 -> F
-> ...

Autant on peut faire des opérations avec des chiffres, comme ci-dessus alors qu'avec des "lettres"! Comment dire à excel colonne B (et non pas 2), puis colonne B + 2???

Bref, avec cells() on a le code suivant
For NuméroColonne = 2 To 10 Steep 2
----Cells(10, NuméroColonne) = ...
Next NuméroColonne

Complément :
J'ai vu que tu connaissais la boucle For... To .... Next

Dans ton exemple :

For i = 2 To nb_lignes
...
Next i

Cela signifie :
-> lorsque la boucle est réalisé pour la première fois, la valeur i contient le chiffre 2
-> arrivé au mot "Next", excel incrémente la variable "i" de 1 (c'est à dire qu'il ajoute 1 à la valeur contenu dans "i")
-> donc lorsque la boucle est réalisé la seconde fois, la valeur i contient le chiffre 3.
-> si le chiffre 3 est égale au chiffre contenu dans la variable nb_lignes, il exécutera cette boucle une dernière fois, sinon il l’exécutera encore...

Lorsque tu rajoute Steep 2 au lieu d'incrémenter le chiffre contenu dans ta variable "i" de 1, il rajoutera 2. Donc comme dans notre cas on commence au chiffre 2, ta boucle traitera toutes les colonnes PAIRES.

Si tu as besoin de plus d'explication sur un point particulier, n'hésite pas.

A demain soir
 
Dernière édition:

thomasmbai

XLDnaute Nouveau
Re : Problème VBA

Bonjour,

Tout d'abord merci pour ce cours particulier très enrichissant. Fort de ces bons conseils, je me suis lancé dans la rédaction d'un sub un peu plus compliqué où je pourrais utiliser les particularités de la fonction cells(). Voici mon code :

Code:
   Sheets("Camions_Par_Base").Select
    Dim CNUF_recherche As String
    CNUF_recherche = Range("G7")
    MsgBox CNUF_recherche
    
    Sheets("Préparation_commandes").Select
    Dim nb_lignes As Integer
    nb_lignes = WorksheetFunction.CountA(Range("A:A"))
    
 
    For i = 2 To nb_lignes
    
            If Cells(i, 2) Like CNUF_recherche And Cells(i, 1) & Cells(i, 2) = Cells(i - 1, 1) & Cells(i, 2) Then
                Cells(i, 22) = 1 And Cells(i, 23) = Cells(i, 18)
            ElseIf Cells(i, 2) Like CNUF_recherche And Cells(i - 1, 23) + Cells(i, 18) < 33 Then
                Cells(i, 22) = Cells(i - 1, 22) And Cells(i, 23) = Cells(i - 1, 23) + Cells(i, 18)
            ElseIf Cells(i, 2) Like CNUF_recherche And Cells(i - 1, 23) + Cells(i, 18) > 33 Then
                Cells(i, 22) = Cells(i - 1, 22) + 1 And Cells(i, 23) = Cells(i, 18)
            Else
            End If

Ce code ne fonctionne pas. En décortiquant étape par étape, je me suis apperçu que c'est le i-1 qui ne fonctionne pas. J'ai l'impression qu'excel prend la valeur i à la place. Savez vous pourquoi ?
Code:
If Cells(i, 2) Like CNUF_recherche And Cells(i, 1) & Cells(i, 2) = Cells(i - 1, 1) & Cells(i, 2) Then


J'espère que vos éclaircissements me permettront de devenir un grand programmeur! :)
 
Dernière édition:

thomasmbai

XLDnaute Nouveau
Re : Problème VBA

Bonsoir,

J'ai résolu mon problème en créant une nouvelle variable j=i-1.

Cependant j'aimerais comprendre pourquoi on ne peut pas opérer un calcul du type cells(i-1,2) ? Est on obligé d'utiliser une nouvelle variable à chaque fois ?

Je vous remercie pour vos réponses.
 

Excel-lent

XLDnaute Barbatruc
Re : Problème VBA

Bonsoir Thomasmbai,

Désolé pour mon absence, j'étais occupé. Me revoilà!

J'ai lu, relu et re-relu ton code :
-> il manque à mon avis une partie de ton code car ta boucle For i = 2 ... To nb_lignes ... Next i est incomplète. Car il manque la fin : "Next i"
-> je ne vois pas l'intérêt du dernier "Else" puisque tu ne met rien après
-> sinon je ne vois rien d'anormal.

Peux-tu mettre en ligne ton fichier? Du moins, la partie qui nous intéresse (en pensant à enlever les données confidentiels et inutiles au préalable)?

A demain
Bon WE
 

thomasmbai

XLDnaute Nouveau
Re : Problème VBA

Bonsoir,

D'abord merci pour cette réponse. En effet il manque le next parce que c'est un extrait de mon sub. J'ai remplacé les j par i-1 et à présent tout fonctionne.

J'aimerais bien te l'envoyer néanmoins pour que tu jettes un oeil sur mon code et que tu me dises ce que tu en penses (s'il est optimisé ou pas, si tu as des conseils...) mais le fichier fait 9mo lorsque l'on peut uploader que 976ko.


Merci en tous cas pour tes précieux conseils.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 492
Messages
2 088 936
Membres
103 987
dernier inscrit
Doctami