tableau inversé

jeep90

XLDnaute Nouveau
Bonjour tous,

J'ai un tableau à 2 entrées (150 lignes x 95 colonnes) et je voudrais transformer ce tableau en "données brutes", c'est à dire, sur 2 colonnes...
La fonction "copier/coller transposé" est proche de ma réponse mais pas exactement.. Je pense qu'on ne peut échapper à une macro :eek:
Ci joint, je vous adresse un fichier pour explication..
En vous remerciant vivement par avance
Sincères salutations
 

Pièces jointes

  • test tableau inversé.xls
    23.5 KB · Affichages: 90
  • test tableau inversé.xls
    23.5 KB · Affichages: 89
  • test tableau inversé.xls
    23.5 KB · Affichages: 88

ROGER2327

XLDnaute Barbatruc
Re : tableau inversé

Bonjour à tous
A essayer :
Code:
[COLOR="DarkSlateGray"][B]Sub deux_colonnes()
Dim oDat, sDat, l As Long, c As Long, i As Long, j As Long
   oDat = WorksheetFunction.Transpose(Sheets("Feuil1").[A6].CurrentRegion.Value)
   l = UBound(oDat, 1)
   c = l * (UBound(oDat, 2) - 1)
   ReDim sDat(1 To c, 1 To 2)
   For i = 0 To UBound(oDat, 2) - 2
      For j = 1 To l
         sDat(j + i * l, 1) = oDat(j, 1)
         sDat(j + i * l, 2) = oDat(j, i + 2)
      Next j
   Next i
   With Sheets("Feuil1").[I20]
      .CurrentRegion.ClearContents
      .Resize(c, 2).Value = sDat
   End With
End Sub[/B][/COLOR]
Les nombres de colonnes et de lignes sont quelconques.​
ROGER2327
#2109
 

jeep90

XLDnaute Nouveau
Re : tableau inversé

un grand merci à HOERWIND et à ROGER2327, c'est exactement cela que je voulais... Vous êtes des cracks !!!;)
Finalement, je vais me rabattre sur la prog en VBA car tout se fait d'un coup d'un seul ..
Par contre, pourrais-je à nouveau faire appel à vos connaissances sur deux points SVP ?

1) Comment faut-il modifier la prog justement dans le cas où j'ai une plage de cellules bien définie (dans mon exemple a6:d11 et rien d'autre) ?

2) Ne pas tenir compte des lignes générées, si des cellules sont vides dans le tableau initiale ?

je vous joins à nouveau le tableau d'exmple...
Je vous renouvelle par avance tout mes remerciements
 

Pièces jointes

  • test tableau inversé.zip
    20.7 KB · Affichages: 30

ROGER2327

XLDnaute Barbatruc
Re : tableau inversé

Re...
Code:
[COLOR="DarkSlateGray"][B]Sub tableau_inverse()
Dim oDat, sDat, l As Long, c As Long, i As Long, j As Long[COLOR="DarkRed"], k As Long[/COLOR]
   oDat = WorksheetFunction.Transpose(Sheets("Feuil1").[COLOR="DarkRed"][A6:D11][/COLOR].Value)
   l = UBound(oDat, 1)
   c = l * (UBound(oDat, 2) - 1)
   ReDim sDat([COLOR="DarkRed"]1 To 2, 1 To c[/COLOR])
   For i = 0 To UBound(oDat, 2) - 2
      For j = 1 To l
         [COLOR="DarkRed"]If IsEmpty(oDat(j, i + 2)) Then
            k = k + 1
         Else[/COLOR]
            sDat(1, j [COLOR="DarkRed"]- k[/COLOR] + i * l) = oDat(j, 1)
            sDat(2, j [COLOR="DarkRed"]- k[/COLOR] + i * l) = oDat(j, i + 2)
         [COLOR="DarkRed"]End If[/COLOR]
      Next j
   Next i
   [COLOR="DarkRed"]ReDim Preserve sDat(1 To 2, 1 To c - k)[/COLOR]
   With Sheets("Feuil2")
      .Activate [COLOR="SeaGreen"]'Facultatif[/COLOR]
      With .[A5]
         .CurrentRegion.ClearContents
         .Resize(c [COLOR="DarkRed"]- k[/COLOR], 2).Value = [COLOR="DarkRed"]WorksheetFunction.Transpose(sDat)[/COLOR]
      End With
   End With
End Sub[/B][/COLOR]
devrait faire l'affaire.​
ROGER2327
#2111
 

ROGER2327

XLDnaute Barbatruc
Re : tableau inversé

Re...
Ca fonctionne parfaitement !!! ... et m'évite de générer manuellement 7000 lignes ;) .. Je vous remercie sincèrement ROGER2327 d'y avoir consacré de votre temps et votre week end à mon problème.
Ravi que cela vous convienne. A mon tour de vous demander quelque chose : j'aimerais savoir combien de temps est nécessaire pour obtenir votre résultat sur 7000 lignes dans les conditions réelles d'utilisation.
Merci d'avance.
ROGER2327
#2113
 

JCGL

XLDnaute Barbatruc
Re : tableau inversé

Bonjour à tous,
Salut Roger,





Le terme de Conversion est impropre mais le le temps de réalisation est "sincère et véritable"... à un moment donné (l'utilisation du processeur pouvant varié...)

Pour 9 colonnes :
Une colonne Nom
Une colonne Prénom
Une colonne CP
Six colonnes de Data

Soit environ 63 000 cellules (dans les limites d'XL2003 pour le transpose en lignes)

A+ à tous
 

JCGL

XLDnaute Barbatruc
Re : tableau inversé

Bonjour à tous,

Avec la formule d'HoerWnd "arrangée" :
Code:
=SI(LIGNE()-1>NBVAL($A$2:$I$63009);"";DECALER(A$1;ENT((LIGNE()-2)/NBVAL($A$1:$I$1))+1;MOD(LIGNE()-2;NBVAL($A$1:$I$1))))
Le temps de "recalcul" est d'environ 5 minutes

A+ à tous
 

ROGER2327

XLDnaute Barbatruc
Re : tableau inversé

Bonjour JCGL, bonjour à tous
Merci pour ces informations. Comme les temps de réaction des procédures dépendent pour partie de l'environnement et que l'on teste nos propositions dans des conditions souvent assez différentes des conditions réelles d'exploitation, ce genre de renseignement est utile pour nous orienter vers une voie plutôt qu'une autre. Sans connaître l'environnement réel, il est par exemple difficile de savoir s'il vaut mieux recourir à une formule intégrée ou à une procédure particulière.​
Cordialement,
ROGER2327
#2114
 

jeep90

XLDnaute Nouveau
Re : tableau inversé

Désolé, ROGER2327, je n'avais pas vu votre question concernant la durée de calcul selon votre macro . Effectivement, cela m'a pris environ un peu moins de 3 secondes !! autant dire, une broutille !! :)
Puis-je à nouveau SVP vous solliciter votre aide concernant toujours le même probleme ? J'ai appris que les valeurs du tableau transposé, doivent être arrondi à l'entier le plus proche..
J'ai utilisé une fonction du type : If IsNumeric(oDat(j, i + 2)) Then oDat(j, i + 2) = Round(oDat(j, i + 2), 0)

mais cela ne fonctionne pas (je sais, j'ai beaucoup de mal en VBA:( ) Je vous joins à nouveau le même tableau
Je vous remercie vivement par avance.
 

Pièces jointes

  • test tableau inversé.xls
    33 KB · Affichages: 68
  • test tableau inversé.xls
    33 KB · Affichages: 61
  • test tableau inversé.xls
    33 KB · Affichages: 64

ROGER2327

XLDnaute Barbatruc
Re : tableau inversé

Re...
C'est le tableau sDat qui est finalement renvoyé dans la feuille "Feuil2". Donc :
Code:
[COLOR="DarkSlateGray"][B]If IsNumeric([COLOR="Red"]sDat(2, j - k + i * l)[/COLOR]) Then [COLOR="Red"]sDat(2, j - k + i * l)[/COLOR] = Round([COLOR="Red"]sDat(2, j - k + i * l)[/COLOR], 0)[/B][/COLOR]
Merci pour le renseignement sur la vitesse d'exécution.​
ROGER2327
#2171
 

jeep90

XLDnaute Nouveau
Re : tableau inversé

Un grand merci cher ROGER2327 pour votre aide, tout fonctionne très bien et j'arrive presque à finaliser ce tableau qui sera par la suite converti en texte (cette partie est quasi terminée).. J'ai juste encore un petit soucis de formats de cellules et si vous voulez bien, pourrais-je à nouveau solliciter vos lumières ? par avance tous mes remerciements
 

jeep90

XLDnaute Nouveau
Re : tableau inversé

Cher ROGER2327, il ne me reste plus que 2 obstacles à surmonter et je m'adresse à nouveau à vous parce que vous avez tout traité dès le début..

Dans les post précédents, je vous avais demander le moyen d'arrondir à l'entier des nombres dans un module VBA.. et vous savez à quel point l'Administration déteste les nombres à virgule :D

Le problème en utilisant IsNumeric, c'est que quelque soit le format de la cellule dans lequel se trouve une valeur numérique, ladite fonction "supprime" le format en question.
Par exemple, dans le tableau joint, j'ai des cellules au format personnalisé 0# et d'autres au format nombre .. Ce que je souhaiterais, c'est un calcul d'arrondi à l'entier que pour les cellules avec un format nombre uniquement..

J'ai essayé dans le module, à la place de "If IsNumeric..." quelque chose du genre If NumberFormat ..." etc, mais bien sur ca plante !!:confused:

Je vous joins à nouveau le tableau-test et vous remercie sincèrement.
 

Pièces jointes

  • test tableau inversé.xls
    39 KB · Affichages: 59
  • test tableau inversé.xls
    39 KB · Affichages: 61
  • test tableau inversé.xls
    39 KB · Affichages: 59

Discussions similaires

Statistiques des forums

Discussions
312 505
Messages
2 089 070
Membres
104 016
dernier inscrit
Mokson