Code VBA (Si <>"" then

Bonjour à vous tous,

J’ai un petit problème, j'ai essayé de chercher dans les autres sujets, mais je n'ai pas pu trouver ce qu'il me fallait, désolé si cette question a déjà été posée, je vous mets en pi`ce jointe mon fichier avec son code VBA dans le classeur.

J’ai un tableau tout simple avec la colonne A et la colonne B. Je dois inscrire un "x" dans une des 2 colonnes sur plusieurs lignes, mais il ne peut y avoir 2 "x" sur chaque ligne c.-à-d. soit il y a un "x" dans la colonne A, sois il y a un "x" dans la colonne B, mais jamais les 2 en même temps et les lignes ne peuvent pas être vide non plus.

Je cherche un code VBA qui gérerait les lignes avec les "x" sur chaque ligne jusqu'à la ligne 16 comme le ferait un bouton "radio" sur chaque ligne, mais sans mettre ce bouton puisque la personne qui reçoit le formulaire tient absolument à avoir des "x"

Je ne sais pas non plus comment écrire le code pour se rendre jusqu'à la ligne 16 sans réécrire le code 16 fois, est-ce que vous avez une idée de comment ça serait possible si toutefois ça l'est?

Merci beaucoup pour votre aide très précieuse!

Salut,

un départ de solution pour ton recopiage : utilise une boucle

For i = 1 To 16   'Pour i de 1 à 16

Range("A" & i) = 1  'La cellule Ai (avec i qui prend 1 puis 2 puis 3 donc A1 A2 A3 ...)  = 1

Next i  'Après 1 on passe a i = 2 etc.. jusqu'à la fin de la boucle qui est 16.
 

Bonjour,

Il faut apprendre un minimum de syntaxe élémentaire pour écrire quelques lignes de code...

Sub Test()
    Dim i%, n%
    With ActiveSheet
        n = .Range("A" & .Rows.Count).End(xlUp).Row
        For i = 1 To n
            If .Range("A" & i) = "x" Then
                If .Range("B" & i) = "x" Then .Range("B" & i) = ""
            Else
                If .Range("B" & i) <> "x" Then .Range("B" & i) = "x"
            End If
        Next i
    End With
End Sub

NB- Je l'ai écrite de façon proche de ce que tu avais entrepris (et non comme je l'aurais écrite spontanément...) de façon que tu puisses voir quelques unes des erreurs de syntaxe dans l'écriture.

Cordialement.

NB2- elle ne fera rien dans ton fichier ! Tout y est en ordre !

merci à Avie et MFerrand pour votre rapidité!

MFerrand: désolé je ne comprends pas tr`s bien le NB2. Vous voulez dire quoi par ça ne fera rien dans le fichier?

Comment est-ce que vous vous auriez écrit le code? Je suis un débutant dans le VBA, je ne savais pas que VBA existait dans Excel avant le mois dernier, je n'avais jamais utilisé Excel avant. Est-ce que je dois modifier une variable dans le code que vous m'avez transmis? Mes connaissances étant ce qu'elles sont en VBA, je ne comprends pas tout le code alors je ne sais pas si je dois l'adapter ou remplacer du texte

merci encore!

bonjour,

J'ai un soucis, je crée un trombinoscope mais avec la formule loadpicture car l'odre peut se modifier en fonction des grades

hors s'il s'avère que je ne possède pas encore de photo il me met un débogage et je ne trouve pas de formule qui vérifie l'existence de l'adresse du loadpicture.

quelqu'un peut il m'aider

Merci d'avance

MFerrand: désolé je ne comprends pas tr`s bien le NB2. Vous voulez dire quoi par ça ne fera rien dans le fichier?

Tu fournis un fichier où à chaque ligne il y a un "x", et un seul ! Ce qui est la situation prévue ! La macro va donc le constater, mais ne fera rien ! Tu devrais l'avoir vu !

Pour ce qui est du code, il utilise 2 variables : n qui va nous permettre de définir la dernière ligne utilisée en colonne A, ensuite on lance une boucle de 1 à n en utilisant i comme compteur de boucle. Cela permet de tester le contenu de la cellule en A à chaque ligne : si la valeur est "x", on teste la cellule en B sur la même ligne et si c'est aussi "x", on ôte le "x" ; si la valeur n'est pas "x", on teste également la cellule en B, si elle non plus n'est pas "x", on lui affecte alors la valeur "x".

Regarde surtout ce qui doit être entre guillemets et ce qui ne doit pas l'être : toute valeur texte est entre guillemets, toute valeur numérique ne l'est pas, les références d'adresses de cellules ou plages sont entre guillemets car VBA attend une valeur de type String dans ce cas, quand tu concatènes avec l'opérateur & inutile de mettre les nombres éventuels entre guillemets, le résultat sera du texte... Quand tu mets "" c'est la valeur chaîne vide (ou nulle) que tu définis, mais si tu mets " " c'est un caractère espace. Alors quand tu mets " "" " ! Si VBA s'y retrouve (ce dont je doute) il interprètera comme 2 caractères guillemets accolés, entourés d'espaces, mais s'il voit plutôt 2 espaces qu'on a voulu concaténer sans utiliser &, c'est incorrect d'où erreur...

Note aussi que quand tu écris Range ou Cells ou Rows ou Columns sans rien devant, c'est à dire sans définir la feuille où se trouve la plage qui doit être renvoyée, ou sans point devant qui réfère à la feuille mise en mémoire au moyen de With, tu écris une expression dépourvue de qualificateur d'objet. Tu demandes à VBA à chaque fois de chercher la feuille, qui par défaut sera la feuille active à ce moment-là. Outre l'aléa introduit (la feuille active peut changer en cours d'exécution selon le contexte et les actions effectuées), cette façon de coder est toujours moins rapide à l'exécution, du fait des recherches supplémentaires demandées à VBA...

Cordialement.


pimpon62, tu es dans un autre sujet qui, de plus, n'a rien à voir avec ce que tu demandes ! Pratique pour le moins incorrecte...

Merci pour les explications. Oui j'avais vu que la macro constatait bien qu'il y ait seulement un x par ligne sauf que si je met un x dans la colonne B alors qu'il y en a un dans la colonne A, ce dernier ne s’efface pas tout seul lors de l'écriture dans la colonne B. En gros, la colonne A s'intitulerait "VRAI" et la colonne B s'intitulerait "FAUX". Je mets le X dans la colonne "VRAI" ou dans la colonne "FAUX" mais pas les 2 en même temps et c'est uniquement un ou l'autre, les 2 ne peuvent être vides.

Si le x est présent en A11 donc dans la colonne VRAI, si j'inscris un x également en B11, celui du A11 reste présent

Il sera effacé si tu lances la macro !

ce dernier ne s’efface pas tout seul lors de l'écriture dans la colonne B.

Une macro qui se lance toute seule est un type particulier de procédure, que l'on nomme évènementielle. Elle est lancée automatiquement lorsque survient un évènement préalablement défini (dans VBA), par exemple changement de valeurs dans un feuille.

d'accord et quel serait le code pour cette macro qui serait évènementielle pour que ça puisse fonctionner comme je le voudrais? Concernant le fait de devoir exécuter une macro, ce formulaire doit être rempli par diverses personnes qui ne savent pas du tout comment utiliser Excel alors le fait de leur demander d'exécuter une macro manuellement c'est trop difficile pour eux, c'est pour ça que je cherchais un code qui s’exécuterait à la saisie direct des x dans le tableau

Vois avec ça :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i%
    If Target.Column > 2 Then Exit Sub
    i = Target.Row
    If Me.Cells(i, 1) <> "" Or Me.Cells(i, 2) <> "" Then
        Application.EnableEvents = False
        Select Case Me.Cells(i, 1).Value
            Case ""
                If Me.Cells(i, 2) <> "x" Then Me.Cells(i, 1) = "x"
            Case "x"
                If Me.Cells(i, 2) = "x" Then Me.Cells(i, 2) = ""
            Case Else
                If Me.Cells(i, 2) <> "x" Then Me.Cells(i, 2) = "x"
        End Select
        Application.EnableEvents = True
    End If
End Sub

Procédure à placer dans le module de la feuille concernée.

(Par contre les macros ordinaire sont à placer dans un module standard, contrairement à ce que tu avais fait.)

La déclaration de procédure (1re ligne) est imposée pour une évènementielle. Ne pas la modifier.

Cordialement.

Re-bonjour,

j'ai essayé le dernier code que vous m'avez donné et on s'approche du but. Si la case B a un x et que j'en met un autre dans la colonne A, celui de la colonne B s'efface (exactement ce que je voulais) mais à l'inverse, si le x est déjà dans la colonne A et que j'en met un autre dans la colonne B, c'est ce dernier qui s'efface au lieu d'effacer celui de la colonne A. Est-ce que vous savez où est l'erreur?

Merci encore pour l'acharnement que vous mettez sur mon problème, j'apprécie énormément

C'est pas une erreur !

Tu n'as défini aucune règle en la matière (voir ton premier post), j'ai donc accordé une priorité à la première colonne et opère l'ajustement sur la seconde.

A toi de définir des règles détaillés (couvrant tous les cas de saisies sans faire aucune impasse)...

Cordialement.

assez difficile d'opérer sur la seconde quand je comprends pas comment est-ce que ça peut marcher sur la première colonne, mes connaissances en VBA ne sont pas assez solide pour comprendre le code que vous m'avez écrit, c'est ma 2e expérience en VBA donc je part à zéro

J'ai essayé néanmoins ceci mais sans succès...

Private Sub Worksheet_Change(ByVal Target As Range)

Dim i%

If Target.Column > 2 Then Exit Sub

i = Target.Row

If Me.Cells(i, 1) <> "" Or Me.Cells(i, 2) <> "" Then

Application.EnableEvents = False

Select Case Me.Cells(i, 1).Value

Case ""

If Me.Cells(i, 2) <> "x" Then Me.Cells(i, 1) = "x"

Case "x"

If Me.Cells(i, 2) = "x" Then Me.Cells(i, 2) = ""

Case Else

If Me.Cells(i, 2) <> "x" Then Me.Cells(i, 2) = "x"

Select Case Me.Cells(i, 2).Value

Case ""

If Me.Cells(i, 1) <> "x" Then Me.Cells(i, 2) = "x"

Case "x"

If Me.Cells(i, 1) = "x" Then Me.Cells(i, 1) = ""

Case Else

If Me.Cells(i, 1) <> "x" Then Me.Cells(i, 1) = "x"

End Select

End Select

Application.EnableEvents = True

End If

End Sub

Où est mon erreur?

Je dois distribuer ce fichier à mes collègues cette semaine et il me reste encore 286 pages à lire dans mon livre en VBA, sans doute que lorsque j'aurai fini de le lire je vais comprendre tout ce que vous avez écrit et que je vais voir mon erreur mais d'ici là ça dépasse de beaucoup mes compétences..

Il y a une fin d'instruction Select Case (End Select) qui n'est pas à sa place...

Mais ton ajout sera sans effet, la première instruction aura réglé les discordances...

Il faut prendre en compte l'emplacement de la saisie pour opérer...

Essaie plutôt ainsi :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i%, a%, b%
    If Target.Column > 2 Then Exit Sub
    i = Target.Row: a = Target.Column: b = (a Mod 2) + 1
    If Me.Cells(i, 1) <> "" Or Me.Cells(i, 2) <> "" Then
        Application.EnableEvents = False
        Select Case Me.Cells(i, a).Value
            Case ""
                If Me.Cells(i, b) <> "x" Then Me.Cells(i, a) = "x"
            Case "x"
                If Me.Cells(i, b) = "x" Then Me.Cells(i, b) = ""
            Case Else
                If Me.Cells(i, b) <> "x" Then Me.Cells(i, b) = "x"
        End Select
        Application.EnableEvents = True
    End If
End Sub

Pour ta lecture du code : le signe deux-points (:) est un séparateur, permettant d'écrire plusieurs lignes de code sur la même ligne.

Si a = 1, b = 2, et vice-versa. En utilisant ces variables, la même instruction opèrera selon ta première instruction Select Case (a=1) ou selon la seconde (a=2) [selon que la saisie a lieu en A ou en B].

C'est bien d'utiliser la balise Code, mais il faut qu'elle encadre le code pour avoir un effet !

wow merci ça fonctionne dans mon premier example:)

Mon patron vient de me demander d'ajouter des colonnes dans mon tableau, si la colonne A et B de mon exemple deviennent respectivement E et F et qu'au total j'ai 6 colonnes, est-ce que je dois modifier autre chose que les lettres a et b?

Je te joint le fichier que le patron veut désormais avoir...il aurait pu le dire avant celui-là.....

J'ai essayé de me débrouiller seul et de modifier les variables mais ça ne semble pas fonctionner Vraiment désolé je l'avais pas vu venir celle-là.

merci encore|

Bonjour,

Modifications liées aux changements de colonne (pour que si une =5, l'autre =6, et vice-versa).

Vu ton nouveau contexte, le cadrage de l'action doit être précisée : à partir de la ligne 4, et il devient judicieux de ne rien faire si la modification affecte plusieurs cellules simultanément, de même n'intervenir que si la colonne C est servie. Dans ce cas la suite peut être simplifiée puisqu'il n'y a plus qu'une alternative...

Cordialement.

excellent merci tout fonctionne très bien, un très grand merci pour votre patience et pour vos explications

Rechercher des sujets similaires à "code vba then"