Trouver cellule non vide
Bonjour à tous,
J'ai un classeur avec un tableau qui contient des informations et je ne souhaite récupérer que les cellules non vides.
Comme un exemple vaut mieux qu'un long discours je vous joint un exemple avec l'onglet contenant le fichier de départ et une deuxième onglet qui contient ce à quoi je souhaite arriver.
La complexité (pour moi) vient du fait qu'il peut y avoir plusieurs montant par ligne et que je souhaite également récupérer le titre de la colonne.
Merci pour votre aide,
N'hésitez pas si tout n'est pas très clair.
bonjour
Dans le menu Données/Récupérer données/à partir d'un tableau : Power Query et sa fameuse possibilité de dépivoter (clic droit sur un en-tête de colonne)
voir Power Query Unpivot sur le web
surtout pas de VBA
exemple :
note : j'ai naturellement mis les données sous forme de tableau. C'est devenu la norme maintenant.
Merci pour la réponse rapide,
Je connaissais les TCD mais pas le Power Query je vais regarder cela avec attention.
Par contre, je ne suis pas sur que cela corresponde à mon besoin car cet exemple a pour but de s’intégrer dans un module VBA plus complexe.
Le but est de transformer un tableau fourni par un client en un format d'écriture comptable reconnu par notre logiciel.
L'opération étant à répéter toutes les semaines sur une dizaine de société, et faite par des collaborateurs différents et pas tous expert en Excel, je cherche à automatiser au maximum.
Je me permets de relancer.
Est ce que quelqu'un peut arriver au même que JMD résultat mais en VBA ?
Merci d'avance
Bonsoir,
Sub RécupInfos()
Dim d As Object, Tbl(), tbB, k, n&, i&, j%
With Worksheets("Initial")
n = .Cells(.Rows.Count, 1).End(xlUp).Row
tbB = .Range("A1:I" & n).Value2
End With
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To n
For j = 5 To 9
If tbB(i, j) <> "" Then
k = i & "|" & tbB(1, j)
d(k) = tbB(i, j)
End If
Next j
Next i
ReDim Tbl(d.Count, 4): n = 0
For Each k In d.keys
n = n + 1
Tbl(n, 0) = CLng(Split(k, "|")(0))
Tbl(n, 1) = tbB(Tbl(n, 0), 2)
Tbl(n, 2) = tbB(Tbl(n, 0), 3)
Tbl(n, 3) = Split(k, "|")(1)
Tbl(n, 4) = CDbl(d(k))
Next k
k = Split("Num ligne;Num facture;Date facture;Type;Montant", ";")
For j = 0 To 4
Tbl(0, j) = k(j)
Next j
With Worksheets("Résultat")
.Range("A1").CurrentRegion.ClearContents
With .Range("A1").Resize(UBound(Tbl, 1) + 1, 5)
.Value = Tbl
.Columns(3).NumberFormat = "dd/mm/yyyy"
.Columns(5).NumberFormat = "#,##0.00"
End With
.Activate
End With
End SubBouton sur feuille Initial pour tester.
Cordialement.
Bonjour,
Ah, j'suis en retard...
Sub bdd()
Dim datas, result
Dim lig As Long, col As Long, nbRubrique As Long, lig2 As Long
Dim nFact As Long, dateFact As Date
datas = [A1].CurrentRegion.Value
nbRubrique = UBound(datas, 2) - 4
ReDim result(1 To Application.Count(Columns(5).Resize(, nbRubrique)) + 1, 1 To 5)
For col = 1 To 5
result(1, col) = Choose(col, "Num Ligne", "Num facture", "Date facture", "Type", "Montant")
Next col
lig2 = 1
For lig = 2 To UBound(datas, 1)
nFact = datas(lig, 2)
dateFact = datas(lig, 3)
For col = 5 To nbRubrique + 4
If datas(lig, col) <> "" Then
lig2 = lig2 + 1
result(lig2, 1) = lig
result(lig2, 2) = nFact
result(lig2, 3) = dateFact
result(lig2, 4) = datas(1, col)
result(lig2, 5) = datas(lig, col)
End If
Next col
Next lig
With Sheets("Résultat")
.[A:E].ClearContents
.[A1].Resize(UBound(result, 1), UBound(result, 2)) = result
.Activate
End With
End SubLa macro peut être appelée sur n'importe quelle feuille d'un classeur actif. Il doit avoir une feuille Résultat.
eric
Merci beaucoup pour les deux réponses.
Je vais pouvoir regarder et comparer et surtout en apprendre un peu plus.