Contrôler nbr colonne et renvoyer no

ya_v_ka

XLDnaute Impliqué
Salut tout le monde

Je sèche sur un détail pour un projet assez complexe, dans lequel je souhaiterais pouvoir fusionner 2 colonnes choisies. Pour ce faire il me faudrait :

1. Vérifier qu'il n'y a bien que 2 colonnes sélectionnées (indifféremment contigüe ou non)
.....p.ex. if 'nombre de colonnes sélectionnées' <> 2 then
2. Renvoyer en variable la référence de chacune de ces colonnes (au mieux sous forme numérique)
.....p.ex. ColGauche = 5 (ou E) et ColDroite = 7

Le reste de la macro se fera sur des boucles et des renvois que je devrais maitriser, mais je peine à débuter pour la cause signalée...

Si quelqu'un a une piste à me proposer je suis preneur...

Merci d'avance

Ya'v
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Contrôler nbr colonne et renvoyer no

Bonjour Ya_v_ka :),
Si tu décris toutes tes cellules et que tu en extrais la colonne, en stockant dans 2 variables et en incrémentatnt une troisième pour t'arrêter si tu as plus de 2 colonnes. Ç'est pas forcément très rapide, mais c'est une piste...
Du style : For Each Cellule... If Cellule.Column <> A And Cellule.Column <> B Then
Tu vérifie si A = 0, alors t'affectes ta colonne à A. Idem pour B. A chaque fois que tu as un N° de colonne différent, tu dis que I = I + 1 et si I vaut 3, c'est que tu as plus de 2 colonnes... Sinon, il ne te reste qu'à récupérer A et B en fin de description.
Bon courage :cool:
 

JNP

XLDnaute Barbatruc
Re : Contrôler nbr colonne et renvoyer no

Bonsoir Ya_v_ka :),
Je suis surpris que tu chutes là dessus, alors que tes réponses sont généralement très adéquates, mais les meilleurs ont leurs faiblesses :D.
Voici le code issu de ma première proposition, testé et qui fonctionne :
Code:
Sub test()
Dim Cellule As Range
Dim A As Integer, B As Integer, I As Integer
For Each Cellule In Selection
If Cellule.Column <> A And Cellule.Column <> B Then
    If A = 0 Then
        A = Cellule.Column
        I = I + 1
    Else
        If B = 0 Then
            B = Cellule.Column
            I = I + 1
        Else: I = I + 1
        End If
    End If
    If I > 2 Then
        MsgBox ("Vous avez sélectionné plus de 2 colonnes")
        Exit Sub
    End If
End If
Next
MsgBox ("1ère colonne : " & A & " : 2ème colonne : " & B)
End Sub
Très content de te rendre service.
Bon courage pour la suite :cool:
 

ya_v_ka

XLDnaute Impliqué
Re : Contrôler nbr colonne et renvoyer no

Salut JNP

Merci un vrai bonheur, ça fonctionne à merveille...

Par contre je ne comprends même pas la mise en oeuvre de :

If Cellule.Column <> A And Cellule.Column <> B Then
If A = 0 Then

Je comprends ce que ça fait, mais n'arrive pas à saisir pourquoi ?
Mais ce n'est pas grave...

D'autre part tu signalais que ça serait long comme ça, d'où ma question :
Pourquoi ne pas faire le même test que sur la première ligne des colonnes du style:
for each cellule in "première ligne de la" selection...

Dans tous les cas MERCI pour ce bout de code qui me dépanne bien.

Ya'v
 

JNP

XLDnaute Barbatruc
Re : Contrôler nbr colonne et renvoyer no

Salut Ya_v_ka :),
Si tu veux tester sur la première ligne uniquement (mais j'avais tenu compte de sélection de cellules non contigues et pas forcément sur la bonne ligne...), tu peux faire appel à Selection.Row qui te donnera la première ligne de la sélection. J'ai repensé au fait que j'ai oublié de sortir s'il n'y a qu'une seule colonne, il faut rajouter entre Next et MsgBox
Code:
    If I < 2 Then
        MsgBox ("Vous avez sélectionné 1 seule colonne")
        Exit Sub
    End If
Sinon, quand tu va faire appel à B (= 0), tu va avoir un bug.
Pour les tests, admettont que tu ai sélectionné A1:C1, la macro regarde A1, qui est en colonne 1, A et B sont à 0, A du coup est passé à 1 et I vaut 1. Boucle. B1, qui est en colonne 2, A = 1 et B = 0, comme A est <> 0, c'est B qui prends 2 et I passe à 2. Boucle. C1, qui est en colonne 3, A = 1 et B = 2, comme B <> 0, I passe à 3 d'où sortie de la macro.
Bon courage :cool:
 

Gael

XLDnaute Barbatruc
Re : Contrôler nbr colonne et renvoyer no

Salut Ya_v_ka, Salut JNP,

Une autre solution, un peu en retard mais comme j'ai réfléchi, je l'envoie quand même:

Code:
Sub essai()
Dim col1 As Integer, col2 As Integer, i As Integer
Dim nbcol As Boolean
 
nbcol = True
    For i = 1 To Selection.Areas.Count
        For j = 1 To Selection.Areas(i).Columns.Count
            col = Selection.Areas(i).Cells(1, j).Column
            If col1 <> 0 And col2 <> 0 And col <> col1 And col <> col2 Then
            nbcol = False
            ElseIf col1 <> 0 And col2 = 0 And col <> col1 Then col2 = col
            ElseIf col1 = 0 Then col1 = col
            End If
        Next j
    Next i
If nbcol Then
    If col2 = 0 Then
    MsgBox ("Vous n'avez sélectionné qu'une colonne")
    Else
    MsgBox ("1ère colonne : " & col1 & " : 2ème colonne : " & col2)
    End If
Else
MsgBox ("Vous avez sélectionné plus de 2 colonnes")
Exit Sub
End If
End Sub

@+

Gael
 

ya_v_ka

XLDnaute Impliqué
Re : Contrôler nbr colonne et renvoyer no

Salut

Alors pour la gestion de l'erreur en cas de colonne isolée, ça j'avais rajouté, mais j'ai du faire 3 essais pour la positionner au bon endroit pffffff.
Donc grace à votre aide la macro fonctionne déjà à merveille. Et avec l'explication de toutes ces vérif sur 0, je comprends mieux l'idée de base. Merci.

Maintenant je cherche encore à renvoyer mon no de colonne sous la forme alphabétique existante (27 = AA, 5 = E, 78 = CA...) pas évident avec XL07...

En tout cas merci encore

Ya'v
 

JNP

XLDnaute Barbatruc
Re : Contrôler nbr colonne et renvoyer no

Re Ya_v_ka, bonsoir Gael :),
pour la colonne en 2003 :
Code:
Dim A As Integer, B As Integer, C As String, D As String
A = Int(Selection.Column / 26)
B = Selection.Column Mod 26
If A = 0 Then C = "" Else C = Chr(A + 64)
D = Chr(B + 64)
MsgBox (C & D)
Pour du 2007, il faudrait faire un test pour voir si on atteint AAA et changer le mode de calcul, mais celui qui utilise AAA, c'est déjà un sacré fichier...
Bonne soirée :cool:
 

ya_v_ka

XLDnaute Impliqué
Re : Contrôler nbr colonne et renvoyer no

Hello

Waooow j'ai même pas eu le temps d'essayer de chercher, trop fort.

Pour te répondre : oui, 2007 atteint XFD donc une première division par 26 au carré... ça je devrais y arriver.

Par contre pour 1 seule colonne, j'avais essayer avec "if I < 2 then" et aussi avec "if I = 1 then" et ça passait à chaque fois dessus, même avec 2 colonnes... j'ai résolu le problème avec "if B = 0 then" qui fonctionne... les aléas de la science ????

Merci encore pour le coup de main extraordinaire

Ya'v
 

JNP

XLDnaute Barbatruc
Re : Contrôler nbr colonne et renvoyer no

Salut le forum :),
Pour le test 1 colonne, je penses que tu ne l'avais pas mis au bon endroit (comme indiqué dans mon post). Chez moi, ça marche nickel.
Code:
Sub test()
Dim Cellule As Range
Dim A As Integer, B As Integer, I As Integer
For Each Cellule In Selection
If Cellule.Column <> A And Cellule.Column <> B Then
    If A = 0 Then
        A = Cellule.Column
        I = I + 1
    Else
        If B = 0 Then
            B = Cellule.Column
            I = I + 1
        Else: I = I + 1
        End If
    End If
    If I > 2 Then
        MsgBox ("Vous avez sélectionné plus de 2 colonnes")
        Exit Sub
    End If
End If
Next
[COLOR=red]If I < 2 Then[/COLOR]
[COLOR=red]   MsgBox ("Vous avez sélectionné 1 seule colonne")[/COLOR]
[COLOR=red]   Exit Sub[/COLOR]
[COLOR=red]End If[/COLOR]
MsgBox ("1ère colonne : " & A & " : 2ème colonne : " & B)
End Sub
Pour accélérer la macro, l'idéal serait de déselectionner chaque colonne répertoriée, vu que tu n'en as plus besoin lorsque tu as son N°.
Bonne journée :cool:
 

Statistiques des forums

Discussions
312 331
Messages
2 087 356
Membres
103 528
dernier inscrit
hplus