Partage
  • Partager sur Facebook
  • Partager sur Twitter

[VBA] Sélectionner plusieurs colonnes d'un coup ?

Sujet résolu
24 juillet 2015 à 9:22:30

Bonjour à toutes/tous !

Je suis en train de créer une petite macro sur Excel qui me permettrais de colorer une colonne sur deux en une couleur, l'autre en une autre couleur. Cependant, pour qu'elle puisse s'adapter à toutes les longueurs de tableau, j'aimerais qu'elle s'arrête dès qu'elle trouve une case vide. J'ai donc défini une variable (compt) qui vaut 5 (le tableau commence à 5) et j'ai indiqué ensuite que je voulais sélectionner la cellule Cells(compt,1). Seulement, j'aimerais savoir s'il est possible de mettre plusieurs colonnes dans ce bout de code, quelque chose du style Cells(compt,1;3;5;7;9).

Voilà mon code (qui d'ailleurs ne fonctionne pas, Excel m'indique "Erreur de compilation : Do sans boucle") :

Sub Code()


    Dim compt As Integer

'le tableau commence en A5'

        compt = 5
        Do While Cells(compt, 1).Value <> ""
                Columns("A:A").Select
            With Selection.Interior
                .Pattern = xlSolid
                .PatternColorIndex = xlAutomatic
                .ThemeColor = xlThemeColorDark1
                .TintAndShade = -0.349986266670736
                .PatternTintAndShade = 0
            End With
End Sub


Des idées pour m'aider (je débute en VBA, désolé si certaines choses paraissent évidentes pour vous et pas moi ...) ?

Merci d'avance !

-
Edité par Roadie ! 24 juillet 2015 à 9:23:20

  • Partager sur Facebook
  • Partager sur Twitter
24 juillet 2015 à 10:27:45

Hello Roadie.

1./ Pour faire une sélection discontinue utilise la propriété Range plutôt que Cells.
Exemple : Range("A1:B4,N3").Select te permettra de sélectionner la plage A1:B4 et la cellule N3.

2./ Il manque le Loop pour fermer ton Do While.

Cordialement,
Kochii. 

  • Partager sur Facebook
  • Partager sur Twitter

Le Kansas City Shuffle.. c’est quand tout le monde regarde à gauche et que tu vas à droite.

24 juillet 2015 à 10:32:58

Merci pour la réponse !

Mais du coup j'ai une question : la fonction range est elle compatible avec ce que je veux faire, c'est à dire qu'elle s'arrête quand elle rencontre un vide ? Parce qu'il faudrait que je mette quelque part le numéro de la cellule de la colonne choisie pour lui dire "quand ta cellule est vide, arrête toi" :)

  • Partager sur Facebook
  • Partager sur Twitter
24 juillet 2015 à 11:20:47

Techniquement, elle est compatible avec ce que tu souhaites faire.
Sans en être sûr à 100% il me semble que les propriétés Range et Cells ont les mêmes caractéristiques du coup tu peux très bien te servir de l'une comme de l'autre.

Et sinon rien à voir, mais dans ton code, il ne manquerait pas la ligne incrémentant la variable de ton compteur ?
Car sinon je ne vois pas l'intérêt de passer par une variable compteur si cette dernière reste tout le temps à 5.  

:o 

  • Partager sur Facebook
  • Partager sur Twitter

Le Kansas City Shuffle.. c’est quand tout le monde regarde à gauche et que tu vas à droite.

24 juillet 2015 à 11:31:23

Mince, je l'ai supprimée en copiant le code x) Ne t'inquiète pas, il y en a une !

Et merci de ta réponse, je vais tester ça x)
  • Partager sur Facebook
  • Partager sur Twitter
24 juillet 2015 à 13:40:49

J'ai modifié un peu mon code, il marche ;)
  • Partager sur Facebook
  • Partager sur Twitter
13 février 2019 à 2:18:35

salut les génies qui puissent m'aider à decortiquer ce programme vba etape par etape car je suis a la maternelle de excel vbba.
Sub essai()
Dim myDate, myNom, myPrenom, mytTarget As Worksheet, mySource As Worksheet, myArray, myArraySize As Long, myCompVar, myCompteur As Long, bb As Long, i As Variant, j As Long
On Error Resume Next
Set mytarget = Sheets("Projet")
Set mySource = Sheets("Saisie")
mytarget.Activate
mytarget.Select
myDate = Range("D2") 'non déclarée pour permettre le fonctionnement correct d'IsDate
myNom = Range("D3")
myPrenom = Range("D4")
myCompVar = myNom & myPrenom 'myComVar devient la ref unique de chaque employe au cas ou plusieurs employés auraient le même nom
myCompteur = 1
If Not IsDate(myDate) Then 'la fonction IsDate ne fonctionne pas correctement si elle vérifie une variable déclarée
    MsgBox "La plage 'Premier jour du mois' n'a pas été renseignée ou contient une erreur !"
End
End If
If Not WorksheetFunction.IsText(myNom) Or Not WorksheetFunction.IsText(myPrenom) Then
    MsgBox "Les plages 'NOM' et/ou 'Prénom' n'ont pas été renseignées ou contiennent des erreurs !"
    End
End If
mySource.Activate
Range("B2").Select
For a = 2 To 9 ' 8 itérations - Controle des colonnes B à I non vides
    Range(Selection, Cells(Rows.Count, a).End(xlUp)).Select
    If Selection.Cells.Count = 2 Then ' 2 :compte la cellule active + la cellule de la ligne 1
        MsgBox " la colonne No " & a & " de votre base de données sur la Feuille 'Saisie' est vide !"
        End
    End If
    ActiveCell.Offset(0, 1).Select
Next a
Range("B2", Range("B" & Rows.Count).End(xlUp)).Select 'etablit la plage de référence
'myArraySize = Selection
ReDim myArray(31, 3) 'dimensionne l'array
bb = 1
For Each a In Selection
    aa = a & a.Offset(0, 1) 'referencce unique dans le tableau de chaque employé
        If aa = myCompVar And Val(Month(a.Offset(0, 3))) = Month(myDate) Then 'si ref unique est celle requise et le mois est le même que le mois indiqué
            myArray(bb, 1) = a.Offset(0, 3) 'enregistre le jour
            myArray(bb, 2) = a.Offset(0, 6) 'heure début
            myArray(bb, 3) = a.Offset(0, 7) 'heure fin de l'employé
            bb = bb + 1
        End If
Next a
mytarget.Activate
j = 1
Range("D8:J23").Select ' recopie les données dans le tableau cible
For Each i In Selection
    If i = myArray(j, 1) Then 'si la date du tableau cible = la date de l'array
        i.Offset(1, 0) = myArray(j, 2) 'recopie heure de début
        i.Offset(2, 0) = myArray(j, 3) 'recopie heure de fin
        j = j + 1
    End If
Next i
Range("A1").Select
End Sub
  • Partager sur Facebook
  • Partager sur Twitter
13 février 2019 à 10:15:07

Salut,

Pas de déterrage, crée ton propre sujet, utilise le bouton de code </> pour poster du code. Et le code a l'air d'être commenté donc explique où tu coinces (dans ton sujet).

  • Partager sur Facebook
  • Partager sur Twitter
20 février 2019 à 0:28:58

c'est vrai mais je suis un grand bleu en macro vba excel, donc j'essay partiellement:

On Error Resume Next
Set mytarget = Sheets("Projet")
Set mySource = Sheets("Saisie")
mytarget.Activate
mytarget.Select
myDate = Range("D2") 'non déclarée pour permettre le fonctionnement correct d'IsDate
myNom = Range("D3")
myPrenom = Range("D4")
myCompVar = myNom & myPrenom 'myComVar devient la ref unique de chaque employe au cas ou plusieurs employés auraient le même nom
myCompteur = 1
If Not IsDate(myDate) Then 'la fonction IsDate ne fonctionne pas correctement si elle vérifie une variable déclarée
          MsgBox "La plage 'Premier jour du mois' n'a pas été renseignée ou contient une erreur !"
           End
End If
If Not WorksheetFunction.IsText(myNom) Or Not WorksheetFunction.IsText(myPrenom) Then
               MsgBox "Les plages 'NOM' et/ou 'Prénom' n'ont pas été renseignées ou contiennent des erreurs !"
                End
End If
  • Partager sur Facebook
  • Partager sur Twitter
20 février 2019 à 12:15:28

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)