Bonjour à tous
Avant toute chose je suis débutant en VBA mais c'est en forgeant que l'on devient forgerons !
J'ai un fichier issu de résultats d'un questionnaire que je cherche à structurer afin de pouvoir l'utiliser en BdD
Il s'agit d'une transposition mais par groupe de colonnes. Pour mieux comprendre je pense que le fichier en annexe doit faire l'affaire.
Il faut noter que les groupes de colonne sont variables c'est à dire qu'une ligne peux avoir l'info de jusqu'à 5 enfants. Dans l'exemple la struture du groupe à transposer est fixe mais j'ai un autre ficher ou cette structure peut être variable.
Pour compliquer le tout, du moins pour moi, il n'y a pas toujours de l'info pour les conjoints (Cf exemple)
J'ai essayé de jouer avec l'info de la discussion ci dessous mais je pense que je suis trop débutant pour maîtriser les modifications nécessaires
Cette solution de vgendron est celle que j'ai essayé de travailler sans grands résultats
Sub Tab1toTab2()
Dim tabInit() As Variant
Dim tabFinal() As Variant
With Sheets("Feuil1")
'on détecte les données du tableau à exporter
NbLignes = .Range("A" & .Rows.Count).End(xlUp).Row 'nb de lignes du tableau initial
NbCol = .Range("A2").End(xlToRight).Column 'nb de colonnes du tableau initial
tabInit = .Range("A1").Resize(NbLignes, NbCol).Value 'on récupère toutes les infos dans un tablo VBA "TabInit"
End With
NbToIgnore = CInt(Application.InputBox("donnez le nombre de colonnes à ""ignorer"" EN PLUS de la première colonne des noms")) 'message pour demander le nombre de colonnes à ignorer (sans compter la première colonne des noms)
'!! les colonnes à transposer DOIVENT OBLIGATOIREMENT ETRE A LA FIN DU TABLEAU
NbToTranspose = NbCol - NbToIgnore - 1 'calcul le nombre de colonnes qui seront donc à transposer
NbLignesFinal = (UBound(tabInit, 1) - 1) * (UBound(tabInit, 2) - NbToIgnore - 1) 'calcul du nombre de lignes du tableau final
ReDim tabFinal(1 To NbLignesFinal, 1 To NbToIgnore + 3) 'on définit les dimensions du tableau final
IndLFinal = 1
IndLInit = 2
x = 1
For IndLFinal = 1 To NbLignesFinal 'on parcourt toutes les lignes du tableau final
For col = 1 To NbToIgnore + 1 'remplissage des colonnes ignorées
tabFinal(IndLFinal, col) = tabInit(IndLInit, col)
Next col
tabFinal(IndLFinal, NbToIgnore + 2) = WorksheetFunction.Substitute(tabInit(1, col + x - 1), "Day", "") 'on met la date
tabFinal(IndLFinal, NbToIgnore + 3) = tabInit(IndLInit, col + x - 1) 'et sa quantité
If x < NbToTranspose Then 'si on a pas encore transposé les NbTOTranspose
x = x + 1 'on se déplace de 1 vers la droite pour prendre la date suivante au prochain tour
Else: x = 1 'sinon on revient à la première date
End If
If IndLFinal Mod NbToTranspose = 0 Then IndLInit = IndLInit + 1 'si on a pas fini de transposer on reste sur la ligne, sinon on prend la suivante
Next IndLFinal
With Sheets("Feuil3") 'dans la feuille de destination (première cellule du tabInit)
.UsedRange.Offset(1, 0).ClearContents 'on efface juste le contenu des cellules
.Range("A2").Resize(UBound(tabFinal, 1), UBound(tabFinal, 2)) = tabFinal
End With
End Sub
Votre aide sera fortement appréciée
Merci beaucoup par avance
Avant toute chose je suis débutant en VBA mais c'est en forgeant que l'on devient forgerons !
J'ai un fichier issu de résultats d'un questionnaire que je cherche à structurer afin de pouvoir l'utiliser en BdD
Il s'agit d'une transposition mais par groupe de colonnes. Pour mieux comprendre je pense que le fichier en annexe doit faire l'affaire.
Il faut noter que les groupes de colonne sont variables c'est à dire qu'une ligne peux avoir l'info de jusqu'à 5 enfants. Dans l'exemple la struture du groupe à transposer est fixe mais j'ai un autre ficher ou cette structure peut être variable.
Pour compliquer le tout, du moins pour moi, il n'y a pas toujours de l'info pour les conjoints (Cf exemple)
J'ai essayé de jouer avec l'info de la discussion ci dessous mais je pense que je suis trop débutant pour maîtriser les modifications nécessaires
Transposer certaine colonne en ligne VBA
Bonjour à tous:), Je cherche a créer une base de donnée exploitable pour pouvoir générer des TCD. Sauf que dans la base de donnée que j'ai à disposition j'ai plusieurs colonne "nom dates" que je cherche à mettre sous forme de ligne. Certaines colonnes doivent aussi rester sous forme de colonne...
www.excel-downloads.com
Cette solution de vgendron est celle que j'ai essayé de travailler sans grands résultats
Sub Tab1toTab2()
Dim tabInit() As Variant
Dim tabFinal() As Variant
With Sheets("Feuil1")
'on détecte les données du tableau à exporter
NbLignes = .Range("A" & .Rows.Count).End(xlUp).Row 'nb de lignes du tableau initial
NbCol = .Range("A2").End(xlToRight).Column 'nb de colonnes du tableau initial
tabInit = .Range("A1").Resize(NbLignes, NbCol).Value 'on récupère toutes les infos dans un tablo VBA "TabInit"
End With
NbToIgnore = CInt(Application.InputBox("donnez le nombre de colonnes à ""ignorer"" EN PLUS de la première colonne des noms")) 'message pour demander le nombre de colonnes à ignorer (sans compter la première colonne des noms)
'!! les colonnes à transposer DOIVENT OBLIGATOIREMENT ETRE A LA FIN DU TABLEAU
NbToTranspose = NbCol - NbToIgnore - 1 'calcul le nombre de colonnes qui seront donc à transposer
NbLignesFinal = (UBound(tabInit, 1) - 1) * (UBound(tabInit, 2) - NbToIgnore - 1) 'calcul du nombre de lignes du tableau final
ReDim tabFinal(1 To NbLignesFinal, 1 To NbToIgnore + 3) 'on définit les dimensions du tableau final
IndLFinal = 1
IndLInit = 2
x = 1
For IndLFinal = 1 To NbLignesFinal 'on parcourt toutes les lignes du tableau final
For col = 1 To NbToIgnore + 1 'remplissage des colonnes ignorées
tabFinal(IndLFinal, col) = tabInit(IndLInit, col)
Next col
tabFinal(IndLFinal, NbToIgnore + 2) = WorksheetFunction.Substitute(tabInit(1, col + x - 1), "Day", "") 'on met la date
tabFinal(IndLFinal, NbToIgnore + 3) = tabInit(IndLInit, col + x - 1) 'et sa quantité
If x < NbToTranspose Then 'si on a pas encore transposé les NbTOTranspose
x = x + 1 'on se déplace de 1 vers la droite pour prendre la date suivante au prochain tour
Else: x = 1 'sinon on revient à la première date
End If
If IndLFinal Mod NbToTranspose = 0 Then IndLInit = IndLInit + 1 'si on a pas fini de transposer on reste sur la ligne, sinon on prend la suivante
Next IndLFinal
With Sheets("Feuil3") 'dans la feuille de destination (première cellule du tabInit)
.UsedRange.Offset(1, 0).ClearContents 'on efface juste le contenu des cellules
.Range("A2").Resize(UBound(tabFinal, 1), UBound(tabFinal, 2)) = tabFinal
End With
End Sub
Votre aide sera fortement appréciée
Merci beaucoup par avance