rabouter 2 matrices alphanumeriques

dmc

XLDnaute Occasionnel
Bonjour à tout le forum.
Partant d'une matrice matr1 = {AA;AB;AC} et d'une matrice matr2 = {BA;BB;BC;BD}
comment obtenir, par formule et non pas par VBA, une matrice matr3 = {AA;AB;AC;BA;BB;BC;BD} ?

j'ai eu beau chercher dans tous les tutoriels, je sèche !!!

d'avance merci pour vos conseils

DMC
 

david84

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Re

juste une idée par rapport à la possibilité de placer dans ta fonction un argument optionnel pour choisir l'onglet à traiter (on peut faire plus concis mais c'est juste un essai pour voir).
A+
 

Pièces jointes

  • MARABOUT(4).xls
    46 KB · Affichages: 29
  • MARABOUT(4).xls
    46 KB · Affichages: 27
  • MARABOUT(4).xls
    46 KB · Affichages: 27

dmc

XLDnaute Occasionnel
Re : rabouter 2 matrices alphanumeriques

re-bonjour david84 et job 75
J'ai profité de la mi-journée pour étudier la formule de job75, qui a parfaitement compris mon besoin :
PHP:
Je pense que ce que veut dmc est simple dans son principe.
A partir de matrices nommées matr1, matr2, matr3... il veut créer une matrice nommée
marabout= F(matr1,matr2,matr3...).
mais les matrices matr1 à matr4 doivent être définies en dur, alors que les miennes sont dynamiques (décaler etc...).
J'ai joint une version "plantée" du fichier dans laquelle je décris le résultat désiré. Merci d'avance
 

Pièces jointes

  • rabouter_matrices_alphanum_bad.xls
    40 KB · Affichages: 28

job75

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Bonjour dmc,

Il faut suivre le fil dmc...

J'ai bien dit qu'avec cette solution les matrices doivent être définies en dur, entre accolades.

Si vous utilisez des plages, prenez la solution par formule (2) ou (2 bis) ou l'une de mes solutions VBA.

A+
 

david84

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Re
ci-joint une version plus compacte de MARABOUT comportant l'argument optionnel onglet :
Code:
Function MARABOUT(Optional onglet As String)
Dim nom, mat, t, tablo(), n&
Application.Volatile
For Each nom In ThisWorkbook.Names 'noms définis dans le classeur
    If nom.Name Like onglet & "*" Then
        mat = Evaluate(nom.RefersTo)
        If Application.CountA(mat) > 1 Then
            For Each t In mat
                ReDim Preserve tablo(n)
                tablo(n) = t
                n = n + 1
            Next
        End If
    End If
Next
MARABOUT = tablo 'vecteur ligne
End Function

@dmc : je pense que la solution à ta demande se trouve déjà parmi les solutions proposées.
Les as-tu testées ?
A+
 

david84

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Re
Si l'on ne veut pas voir apparaître les valeurs d'erreur et éviter par là-même le Preserve :
Code:
Function MARABOUT(Optional onglet As String)
Dim nom, mat, t, tablo(), n&
Application.Volatile
ReDim tablo(0 To Application.Caller.Rows.Count)
For Each nom In ThisWorkbook.Names 'noms définis dans le classeur
    If nom.Name Like onglet & "*" Then
        mat = Evaluate(nom.RefersTo)
        If Application.CountA(mat) > 1 Then
            For Each t In mat
                tablo(n) = t
                n = n + 1
            Next
        End If
    End If
Next
MARABOUT = tablo 'vecteur ligne
End Function
Pour toutes les matrices du classeur :
Code:
=TRANSPOSE(MARABOUT())&""
Pour toutes les matrices de l'onglet "Feuil2":
Code:
=TRANSPOSE(MARABOUT("Feuil2"))&""
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Re,

Bien noté dans le fichier du post #32 :

2) l'objectif étant d'obtenir une matrice classée sans doublons regroupant ces 4 matrices sans VB et sans colonne supplémentaire

A force d'être trop gourmand dmc vous allez vous étouffer.

En tout cas pour moi ça suffit.

Avec VBA on fait tout sans problème, si vous virez votre cuti dites-le nous.

A+
 

job75

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Re,

Une solution VBA pour créer la matrice marabout classée sans doublon.

Ici j'utilise une procédure Sub lancée par un bouton.

Edit : pour le classement j'utilise la macro Quick sort de Jacques Boisgontier.

A+
 

Pièces jointes

  • rabouter_matrice classée sans doublon par VBA(1).xls
    46.5 KB · Affichages: 25
Dernière édition:

david84

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Re
par formule c'est possible à condition que les différentes matrices soient incrémentées dans la feuille de calcul :
créer la plage zone et rentrer en C2, valider en matriciel et tirer la formule vers le bas :
Code:
=SI(LIGNES($1:1)<=SOMME(SI(zone<>"";1/NB.SI(zone;zone)));INDIRECT(ADRESSE(MOD(MIN(SI((zone<>"")*(NB.SI(C$1:C1;zone)=0);NB.SI(zone;"<"&zone)*10^5+LIGNE(zone)));10^5);MOD(MOD(MIN(SI((zone<>"")*(NB.SI(C$1:C1;zone)=0);NB.SI(zone;"<"&zone)*10^5+LIGNE(zone)*10^2+COLONNE(zone)));10^5);10^2)));"")
Mais la plage créée n'est pas à proprement parler une matrice.

Sinon, la macro proposée par Job75 fait le travail. Je pense que l'on peut d'ailleurs la simplifier :
Code:
Sub marabout()
Dim d As Object, i&, mat, t, tablo(), n&
Set d = CreateObject("Scripting.Dictionary") 'pour éliminer les doublons
For i = 1 To 1000 'jusqu'à 1000 noms...
  On Error Resume Next
  mat = Evaluate(ThisWorkbook.Names("matr" & i).RefersTo)
  If Err = 0 Then
    For Each t In mat
        d(t) = d(t)
    Next
  End If
Next
tablo = d.keys
Call tri(tablo, LBound(tablo), UBound(tablo))
ThisWorkbook.Names.Add "marabout", tablo 'vecteur ligne
End Sub
A+
Et là tu créés tu vraie matrice à partir de matrices qui n'ont pas besoin d'êtres inscrites dans la feuille de calculs.
A+
 

job75

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Re,

Sinon, la macro proposée par Job75 fait le travail. Je pense que l'on peut d'ailleurs la simplifier (...)

Tout à fait, merci David, et on peut même simplifier encore :

Code:
Sub marabout()
Dim d As Object, i&, mat, t, tablo
Set d = CreateObject("Scripting.Dictionary") 'pour éliminer les doublons
On Error Resume Next
For i = 1 To ThisWorkbook.Names.Count
  mat = Evaluate(ThisWorkbook.Names("matr" & i).RefersTo)
  For Each t In mat
    d(t) = t
  Next
Next
tablo = d.keys
Call tri(tablo, LBound(tablo), UBound(tablo))
ThisWorkbook.Names.Add "marabout", tablo 'vecteur ligne
End Sub
Fichier (2).

A+
 

Pièces jointes

  • rabouter_matrice classée sans doublon par VBA(2).xls
    54 KB · Affichages: 30
Dernière édition:

dmc

XLDnaute Occasionnel
Re : rabouter 2 matrices alphanumeriques

Bonjour Job75 et David84
Merci pour vos recherches... et pour vos réponses.
m'étouffer n'est sans doute pas le mot. Peut-être un vertige (admiratif) lorsque je tente de comprendre le fin fond de vos formules.
Virer ma cuti ? ce n'était pas à l'ordre du jour, mais je pense que je vais devoir y penser.
L'inconvénient des macros, en particulier, est qu'elles interdisent le retour en arrière de l'utilisateur (le UNDO).
Tant pis, j'interdirai dorénavant le droit à l'erreur, en commençant par moi bien entendu.
Amicalement
 

job75

XLDnaute Barbatruc
Re : rabouter 2 matrices alphanumeriques

Bonsoir dmc, David,

L'inconvénient des macros, en particulier, est qu'elles interdisent le retour en arrière de l'utilisateur (le UNDO).

Si l'on veut pouvoir annuler la création du nom marabout :

Code:
Application.OnUndo "Annuler", "Annuler"
Fichier (3), voir la macro Annuler.

A+
 

Pièces jointes

  • rabouter_matrice classée sans doublon par VBA(3).xls
    55.5 KB · Affichages: 28

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 505
Messages
2 089 071
Membres
104 020
dernier inscrit
Mzghal