Tableau a classer en VBA
Bonjour
même si le titre semble simple, même les IA n'ont pas su m'aider. J'ai un tableau prevu pour plus de 22000 lignes et qui va de A a DA. Le classement se fait a partir de la colonne D (coordonnées complètes) mais qui doit se ranger qu'a partir de ce qui est entre crochet [(1a7):(1a 2999):(1a10)]. le problème c'est que toutes lignes doivent conserver et le format, les couleurs (colonne A) mais aussi la dernière colonne qui a des informations en multi-lignes. Malgré les différents principes de triage, c'est la dernière colonne qui n'arrive pas suivre, les lignes sont mélangées avec d'autres lignes ou carrément supprimées.
J'ai créer un formulaire de tri "Rangement" avec le bouton "CBRgt". Mais tous les codes fournis par l'IA a planté. Je ne sais pas coder, du moins pas assez pour faire cette partie. En bout de tableau j'avais ajouter 3 colonnes pour aider au trie mais ça n'a pas aider... j'ai mis ci dessous un petit (tres petit) modèle du tableau "Carte" (nom d'origine) pour vous donner une idée de ce a quoi je me confronte. Je rajoute le code de l'IA mais bon...
Merci de me guider et de m'aider si vous le pouvez:
(pourquoi une IA ? parce que je ne sais pas coder, tout simplement)
Private Sub CBRgt_Click()
Dim ws As Worksheet
Set ws = Sheets("Carte")
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).row
' DB à DD sont utilisés pour le tri
Dim colX As Integer, colY As Integer, colZ As Integer
colX = ws.Columns("DB").Column
colY = ws.Columns("DC").Column
colZ = ws.Columns("DD").Column
' Extraire x, y, z dans DB, DC, DD
Dim i As Long
For i = 3 To LastRow
Dim coord As String
coord = ws.Cells(i, "D").value
Dim parts() As String
parts = Split(Mid(coord, 2, Len(coord) - 2), ":") ' Supprimer les crochets et diviser
If UBound(parts) = 2 Then
ws.Cells(i, colX).value = Val(parts(0)) ' x
ws.Cells(i, colY).value = Val(parts(1)) ' y
ws.Cells(i, colZ).value = Val(parts(2)) ' z
End If
Next i
' Trier par x, y, z
With ws.Sort
.SortFields.Clear
.SortFields.Add Key:=ws.Cells(3, colX), Order:=xlAscending
.SortFields.Add Key:=ws.Cells(3, colY), Order:=xlAscending
.SortFields.Add Key:=ws.Cells(3, colZ), Order:=xlAscending
.SetRange ws.Range("A3:DD" & LastRow)
.Header = xlNo
.Apply
End With
' Optionnellement, nettoyer les colonnes temporaires si nécessaire
End SubEdit modo : merci de mettre le code entre balises SVP
j'avais essayer avec un bouton activex directement sur la feuille cela a marché puis pour une raison ou mise a jour excel, je n'ai eu que des defaut
Sub TrierLesCoordonnees()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Carte")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
Dim i As Long
Dim coordonnees As Variant
Dim arr() As String
Dim cell As Range
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
' Boucle à travers chaque cellule dans la colonne D à partir de la ligne 3
For Each cell In ws.Range("D3:D" & lastRow)
coordonnees = cell.Value
' Extraire les coordonnées entre les crochets
arr = Split(Mid(coordonnees, InStr(coordonnees, "[") + 1, InStr(coordonnees, "]") - InStr(coordonnees, "[") - 1), ":")
' Ajouter les coordonnées et la référence de la cellule au dictionnaire
If UBound(arr) = 2 Then
' Stocker les coordonnées sous forme de tableau dans le dictionnaire
dict(cell.Address) = Array(CLng(arr(0)), CLng(arr(1)), CLng(arr(2)))
End If
Next cell
' Trier le dictionnaire par les valeurs (coordonnées)
Set dict = SortDictionaryByValue(dict)
' Réarranger les lignes selon l'ordre trié
Dim arrSorted As Variant
ReDim arrSorted(1 To dict.Count, 1 To ws.Columns("DA").Column)
i = 1
For Each key In dict.keys
For j = 1 To ws.Columns("DA").Column
arrSorted(i, j) = ws.Range(key).EntireRow.Cells(1, j).Value
Next j
i = i + 1
Next key
' Copier les données triées dans la feuille, en commençant par la ligne 3
ws.Range("A3:DA" & lastRow).Value = arrSorted
MsgBox "Tri terminé!", vbInformation
End Sub
' Fonction pour trier un dictionnaire par valeurs
Function SortDictionaryByValue(dict As Object) As Object
Dim arrayKeys() As Variant
Dim arrayItems() As Variant
Dim i As Long
arrayKeys = dict.keys
arrayItems = dict.items
Call BubbleSort(arrayItems, arrayKeys)
Set SortDictionaryByValue = CreateObject("Scripting.Dictionary")
For i = 0 To dict.Count - 1
SortDictionaryByValue.Add arrayKeys(i), arrayItems(i)
Next i
End Function
' Algorithme de tri à bulles modifié pour trier des tableaux de coordonnées
Sub BubbleSort(arr() As Variant, arrKeys() As Variant)
Dim i As Long, j As Long
Dim temp As Variant
For i = LBound(arr) To UBound(arr) - 1
For j = i + 1 To UBound(arr)
If CompareCoordinates(arr(i), arr(j)) Then
' Échanger les valeurs
temp = arr(i)
arr(i) = arr(j)
arr(j) = temp
' Échanger les clés
temp = arrKeys(i)
arrKeys(i) = arrKeys(j)
arrKeys(j) = temp
End If
Next j
Next i
End Sub
' Fonction pour comparer deux tableaux de coordonnées
Function CompareCoordinates(coord1 As Variant, coord2 As Variant) As Boolean
For i = 0 To 2
If coord1(i) < coord2(i) Then
CompareCoordinates = False
Exit Function
ElseIf coord1(i) > coord2(i) Then
CompareCoordinates = True
Exit Function
End If
Next i
CompareCoordinates = False
End Function
c'était le dernier a bien fonctionner, depuis c'est devenu impossible
merci pour vos conseils et aides
Eric
Bonsoir,
Quand on ne sait pas coder... pourquoi vouloir utiliser VBA
Sinon : https://www.google.com/search?q=tableau+a+classer+VBA
A+
bonjour et merci pour votre réponse
J'ai envie de dire, a la vue de cette réponse, que si on ne sais pas coder et qu'on utilise une IA, c'est aussi peut être qu'avec des réponses pareilles ça ne donne pas envie de se tourner vers des humains qui vous envois un lien comme étant la solution. J'ai exposé le problème et je compte sur l'intelligence humaine pour m'aider. Ceci dit, j'apprends a la base en m'amusant pour passer le temps de jeune retraité en devenir. J'utilise VBA par son esthétique dans l'utilisation des formulaires. Maintenant c'est mon problème que d'utiliser VBA donc ce type de réponse au jugement a l'emporte pièce je m'en passe. Ou vous m'aider et j'en serais heureux ou pas et dans ce cas gardez vos réflexionsre bonjour.
ce que vous auriez pu répondre plutôt que de me renvoyer sur un lien c'est par exemple le code suivant
Sub TrierSurCarte()
Application.ScreenUpdating = False
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Carte")
' Trouver la dernière ligne avec des données dans la colonne D
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).row
' Identifier la dernière colonne utilisée sur la ligne 3, qui devrait être DA
Dim LastColumn As Long
LastColumn = ws.Cells(3, ws.Columns.Count).End(xlToLeft).Column
' Ajouter des colonnes temporaires pour x, y, z à la fin
Dim colX As Long, colY As Long, colZ As Long
colX = LastColumn + 1
colY = colX + 1
colZ = colY + 1
Dim i As Long
Dim coord As String
Dim coordParts() As String
' Extraire les composants x, y, z des coordonnées
For i = 3 To LastRow
coord = ws.Cells(i, "D").value
If InStr(coord, "[") > 0 And InStr(coord, "]") > 0 Then
coordParts = Split(Mid(coord, InStr(coord, "[") + 1, InStr(coord, "]") - InStr(coord, "[") - 1), ":")
If UBound(coordParts) = 2 Then
ws.Cells(i, colX).value = Val(coordParts(0)) ' x
ws.Cells(i, colY).value = Val(coordParts(1)) ' y
ws.Cells(i, colZ).value = Val(coordParts(2)) ' z
End If
End If
Next i
' Trier le tableau
ws.Sort.SortFields.Clear
ws.Sort.SortFields.Add Key:=ws.Cells(3, colX), Order:=xlAscending
ws.Sort.SortFields.Add Key:=ws.Cells(3, colY), Order:=xlAscending
ws.Sort.SortFields.Add Key:=ws.Cells(3, colZ), Order:=xlAscending
ws.Sort.SetRange ws.Range(ws.Cells(3, 1), ws.Cells(LastRow, colZ))
ws.Sort.Header = xlNo
ws.Sort.Apply
' Supprimer les colonnes temporaires pour les coordonnées x, y, z
ws.Columns(colZ).Delete
ws.Columns(colY).Delete
ws.Columns(colX).Delete
Application.ScreenUpdating = True
End Subrelier a un bouton sur la feuille, le résultat est celui que je cherchais. Le sujet est donc résolut.
Belle fin de journée.
Re,
Ecoutez, c'est vous lespert (joke)
Avec un peu de recherche, vous avez trouvez... vous voyez
Je pense qu'il est inutile d'en rajouter, le sujet est clos.