Utilisation de variable tableau pour accélérer le traitement
Bonjour,
Je cherche à remplacer une macro qui fonctionne, mais qui écrit directement sur la feuille par une macro qui travaille par variable tableau pour gagner du temps, car les données à traiter sont parfois conséquentes.
J'ai beaucoup de mal à comprendre le fonctionnement de ces variables tableau !!!
Dans le fichier joint, il y a la procédure (traditionnelle) qui fonctionne et qui se lance avec le bouton "Fonctionne" et le bouton nommé "Var Tableau" qui est sensé passer par une variable tableau et qui ne fonctionne pas. Je mets quand même le code ci-dessous.
Je suis évidemment preneur de l'aide, des idées et des explications.
Merci d'avance pour le temps passé et l'aide apportée,
Bien cordialement,
Dan
Sub Correction_Champs_Var_Tableau()
' OK 20210512 - Procédure fonctionnant en variable tableau pour accélérer le traitement (X100)
' qui remplace les codes par les étiquettes
Dim FD, Tb, sCol As Variant
Dim PlageDeRecherche As Range, Trouve As Range
Dim CelDep As String, CelArv As String
Dim DerLigne As Long, i As Long
Dim ColDep$, ColArv$
Dim rep As Integer
Dim Valeur_Cherchee As String
Dim Start
Dim vCol(12) As String
Dim DerCol As Integer
Dim DerColL As String
Dim ColT As String
Dim DerLig As Long
Dim NoLig As Long
Dim NoCol As Integer
Dim Var As String
Dim CelDpt As String
Dim CelDptCol As String
Dim CelArvCol As String
rep = MsgBox("Voulez-vous remplacer les codes" & _
vbCrLf & "par des étiquettes ?" & _
vbCrLf & " - statutObservation" & _
vbCrLf & " - objetDenombrement" & _
vbCrLf & " - abondanceR" & _
vbCrLf & " - ... ?" & _
vbCrLf & "" & vbCrLf & "", vbYesNo + vbQuestion, "Remplacement codes par étiquettes")
If rep = 7 Then
' MsgBox "Sortie de la procédure de contrôle", vbOKOnly, "Contrôles"
End
Else
'Poursuite de la procédure
End If
Start = Timer ' Démarrage chrono
Set FD = Worksheets("Donnees_SINP")
DerLigne = Range("B" & Rows.Count).End(xlUp).Row
CelDep = Range("B12").Address
DerCol = Cells(12, Columns.Count).End(xlToLeft).Column
DerColL = LetCol(DerCol)
CelArv = Range(DerColL & DerLigne).Address
Tb = Range(CelDep & ":" & CelArv)
Application.ScreenUpdating = False
vCol(1) = "statutObservation"
vCol(2) = "objetDenombrement"
vCol(3) = "abondanceR"
vCol(4) = "typeDenombrement"
vCol(5) = "occSexe"
vCol(6) = "occStadeDeVie"
vCol(7) = "occStatutBiologique"
vCol(8) = "occEtatBiologique"
vCol(9) = "occNaturalite"
vCol(10) = "occStatutBioGeographique"
vCol(11) = "natureObjetGeo"
vCol(12) = "statutSource"
'Mise en tableau de toute les données de la feuille Donnees_SINP
DerLig = UBound(Tb, 1)
DerCol = UBound(Tb, 2)
For NoLig = 1 To 1 'DerLig
For NoCol = 1 To DerCol
Var = Tb(NoLig, NoCol)
Select Case Var 'vCol(i)
Case Is = "statutObservation"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDptCol, CelArvCol)
.Replace What:="No", Replacement:="Non observé", LookAt:=xlWhole
.Replace What:="Pr", Replacement:="Présent", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sait Pas", LookAt:=xlWhole
End With
Case Is = "objetDenombrement"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="CPL", Replacement:="Couple", LookAt:=xlWhole
.Replace What:="HAM", Replacement:="Hampe florale", LookAt:=xlWhole
.Replace What:="IND", Replacement:="Individu ", LookAt:=xlWhole
.Replace What:="NID", Replacement:="Nid", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Inconnu", LookAt:=xlWhole
.Replace What:="PON", Replacement:="Ponte", LookAt:=xlWhole
.Replace What:="SURF", Replacement:="Surface", LookAt:=xlWhole
.Replace What:="TIGE", Replacement:="Tige", LookAt:=xlWhole
.Replace What:="TOUF", Replacement:="Touffe", LookAt:=xlWhole
.Replace What:="", Replacement:="", LookAt:=xlWhole
End With
Case Is = "abondanceR"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="1", Replacement:="Recouvrement faible", LookAt:=xlWhole
.Replace What:="2", Replacement:="", LookAt:=xlWhole
.Replace What:="3", Replacement:="", LookAt:=xlWhole
.Replace What:="4", Replacement:="", LookAt:=xlWhole
.Replace What:="5", Replacement:="", LookAt:=xlWhole
.Replace What:="6", Replacement:="Non concerné", LookAt:=xlWhole
End With
Case Is = "typeDenombrement"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="Ca", Replacement:="Calculé", LookAt:=xlWhole
.Replace What:="Co", Replacement:="Compté", LookAt:=xlWhole
.Replace What:="Es", Replacement:="Estimé", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sais pas", LookAt:=xlWhole
End With
Case Is = "occSexe"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="0", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non déterminable", LookAt:=xlWhole
.Replace What:="2", Replacement:="Féminin", LookAt:=xlWhole
.Replace What:="3", Replacement:="Masculin", LookAt:=xlWhole
.Replace What:="4", Replacement:="Hermaphrodite", LookAt:=xlWhole
.Replace What:="5", Replacement:="Mixte", LookAt:=xlWhole
End With
Case Is = "occStadeDeVie"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="0", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non déterminable", LookAt:=xlWhole
.Replace What:="2", Replacement:="Adulte", LookAt:=xlWhole
.Replace What:="3", Replacement:="Juvénile", LookAt:=xlWhole
.Replace What:="5", Replacement:="Sub-adulte", LookAt:=xlWhole
.Replace What:="6", Replacement:="Larve", LookAt:=xlWhole
.Replace What:="9", Replacement:="Oeuf", LookAt:=xlWhole
.Replace What:="10", Replacement:="Mue", LookAt:=xlWhole
.Replace What:="11", Replacement:="Exuviation", LookAt:=xlWhole
.Replace What:="13", Replacement:="Nymphe", LookAt:=xlWhole
.Replace What:="18", Replacement:="Germination", LookAt:=xlWhole
.Replace What:="19", Replacement:="Fané", LookAt:=xlWhole
.Replace What:="20", Replacement:="Graine", LookAt:=xlWhole
.Replace What:="21", Replacement:="Thalle, protothalle", LookAt:=xlWhole
.Replace What:="22", Replacement:="Tubercule", LookAt:=xlWhole
.Replace What:="23", Replacement:="Bulbe", LookAt:=xlWhole
.Replace What:="24", Replacement:="Rhizome", LookAt:=xlWhole
End With
Case Is = "occStatutBiologique"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="0", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="2", Replacement:="Non déterminable", LookAt:=xlWhole
.Replace What:="3", Replacement:="Reproduction", LookAt:=xlWhole
.Replace What:="4", Replacement:="Hibernation", LookAt:=xlWhole
.Replace What:="5", Replacement:="Estivation", LookAt:=xlWhole
.Replace What:="6", Replacement:="Halte migratoire", LookAt:=xlWhole
.Replace What:="7", Replacement:="Swarming", LookAt:=xlWhole
.Replace What:="8", Replacement:="Chasse / Alimentation", LookAt:=xlWhole
.Replace What:="9", Replacement:="Pas de reproduction", LookAt:=xlWhole
.Replace What:="10", Replacement:="Passage en vol", LookAt:=xlWhole
.Replace What:="11", Replacement:="Erratique", LookAt:=xlWhole
.Replace What:="12", Replacement:="Sédentaire", LookAt:=xlWhole
End With
Case Is = "occEtatBiologique"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="0", Replacement:="Indéterminable", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="2", Replacement:="Observé vivant", LookAt:=xlWhole
.Replace What:="3", Replacement:="Trouvé mort", LookAt:=xlWhole
End With
Case Is = "occNaturalite"
With Range(CelDep, CelArv)
.Replace What:="0", Replacement:="Inconnu", LookAt:=xlWhole
.Replace What:="1", Replacement:="Sauvage", LookAt:=xlWhole
.Replace What:="2", Replacement:="Cultivé/Élevé", LookAt:=xlWhole
.Replace What:="3", Replacement:="Planté", LookAt:=xlWhole
.Replace What:="4", Replacement:="Féral", LookAt:=xlWhole
.Replace What:="5", Replacement:="Subspontané", LookAt:=xlWhole
End With
Case Is = "occStatutBioGeographique"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="0", Replacement:="Indéterminable", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="2", Replacement:="Présent", LookAt:=xlWhole
.Replace What:="3", Replacement:="Introduit", LookAt:=xlWhole
.Replace What:="4", Replacement:="Introduit envahissant", LookAt:=xlWhole
.Replace What:="5", Replacement:="Introduit non établi", LookAt:=xlWhole
.Replace What:="6", Replacement:="Occasionel", LookAt:=xlWhole
End With
Case Is = "natureObjetGeo"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="In", Replacement:="Inventoriel", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sait Pas", LookAt:=xlWhole
.Replace What:="St", Replacement:="Stationnel", LookAt:=xlWhole
End With
Case Is = "statutSource"
CelDptCol = Cells(NoLig, NoCol).Offset(1, 0).Address
CelArvCol = Cells(DerLig, NoCol).Address
With Range(CelDep, CelArv)
.Replace What:="Co", Replacement:="Collection", LookAt:=xlWhole
.Replace What:="Li", Replacement:="Littérature", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sait Pas", LookAt:=xlWhole
.Replace What:="Te", Replacement:="Terrain", LookAt:=xlWhole
End With
End Select
Next NoCol
Next NoLig
Range(CelDep, CelArv) = Tb
Set FD = Nothing
Erase Tb
Application.GoTo Range("E13"), Scroll:=True 'Remonter en haut lorsque les volets sont figés
Application.ScreenUpdating = True
MsgBox "Remplacement des codes par les étiquettes effectués" & _
vbCrLf & "en " & Format(Timer - Start, "0.00") & " secondes" & _
vbCrLf & "" & vbCrLf & "", vbOK + vbInformation, "Nettoyage des champs géométrie"
End Sub
Function LetCol(NoCol)
LetCol = Split(Cells(1, NoCol).Address, "$")(1)
End FunctionBonjour,
Je ne parierais pas un kopeck dessus car on ne peut pas tester vu que la feuille est vide, mais à mon avis dans cette situation pour faire des "Replace" des Array me paraissent sans intérêt : Aucune macro ne peut rivaliser avec les fonctions natives d'Excel...
Après il y a quelques naïvetés et/ou ignorances sans incidence sur ce traitement, donc je ne détaille même pas : il n'y a rien à gagner à les corriger.
Par curiosité ça met combien de temps pour faire tes replace ?
A mon avis, la seule chose que tu puisses améliorer c'est la conception générale de la feuille, pour faire un code plus concis et clair, mébon...
A+
Merci pour ta réponse Galopin01,
Je prends bien en compte tes remarques, même si sur le principe ce n'est pas seulement pour gagner de la vitesse, mais aussi pour comprendre pourquoi je ne parviens pas à faire ce que je cherche à faire !
Pour la vitesse de traitement, j'ai déjà traité des fichiers de plus de 20.000 lignes dont un de 210.000 lignes. Pour l'instant, je n'ai pas pu comparer, vu que le traitement par array ne fonctionne pas, mais c'est vrai que ce n'est pas bien long.
Pour mes naïvetés et ignorances (tu peux enlever le ou) je suis preneur de tes remarques (sauf si ça te prend trop de temps) en espérant ne plus les refaire et progresser.
Bonne soirée,
Dan
Il est très difficile de parler d'une feuille quasi vide (Les 10 premières lignes sont sans intérêt dans la situation)
Bon c'est vrai que le traitement par Array est quelque chose de très bénéfique dans la plupart des situations... Sauf celle-ci !
De plus il est difficile de parler de tableau VBA quand il n'y a pas de tableau Excel !
Dans le cas le plus général, on entend par Tableau Excel un ensemble constitué d'en-têtes de colonnes et de lignes d'enregistrement.
Ici bien entendu,on a toujours quelque chose qui ressemble plus ou moins à un tableau, cependant celui-ci n'est pas déclaré, de plus il est "mal foutu..." :
Il aurait mieux valu intervertir les lignes 10 et 11, ce que j'ai fait. De plus j'ai effacé ce qu'il y avait dans cette ligne (apparemment pas grand chose d'important... mais ça gênait)
Une fois cette ligne 12 isolée il est facile de la transformer en tableau ce que j'ai fait de 2 manières :
J'ai créer un Tableau structuré avec des lignes bleues : il s'appelle TBD
On pourrait également en déclarer un autre, ce que j'ai fait également : Il s'appelle MyBD dans les 2 cas on peut s'en servir pour déclarer tes Array en VBA
Arr = [TBD].Value
il semble que dans ton cas la 2ème déclaration soit plus favorable (car tu travaille sur les en-têtes)
Quoique On travaille aussi très simplement à partir des tableaux structurés cependant pour les débutants c'est peut-être un peu plus abstrait...T
Tu regarderas la définition de MyBD et tu testeras la macro "Galopin" et tu analyseras la différence... Avec ces déclarations tu peux parcourir toute la base sans avoir à chercher midi à 14 h le début du tableau c'est Lbound et la fin c'est Ubound...
Cependant l’intérêt est toujours aussi nul pour la même raison évoquée dans ma réponse précédente...
Au titre des naïvetés ou imperfections il y a :
vCol(12)qui comporte en réalité 13 lignes (Lbound(vCol ) = 0 !) sans incidence dans ce cas mébon mef !
FD qui n'est pas utilisé en réalité
... Et bien d'autres qui sont complètement inutiles si tes tableaux Excel existent...
A+
Bonsoir galopin01,
Merci beaucoup pour les explications et le temps passé.
Je vais regarder tes explications en détail et tenter de comprendre tout ce qui est indiqué.
Je mets le post en résolu.
Bonne nuit
J'ai eu un petit remord, je pense que tu n'aurais surement pas extrapolé le raisonnement... Alors pour pas te laisser "mourir idiot" je te livre la macro modifiée.
Au final avec le classeur que je t'ai donné ça donne :
(Le nom "MyBD" n'est pas utilisé ici on peut le supprimer.)
Sub Correction_Champs_Var_Tableau()
Application.ScreenUpdating = False
With Range("TBD[statutObservation]")
.Replace What:="No", Replacement:="Non observé", LookAt:=xlWhole
.Replace What:="Pr", Replacement:="Présent", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sait Pas", LookAt:=xlWhole
End With
With Range("TBD[objetDenombrement]")
.Replace What:="CPL", Replacement:="Couple", LookAt:=xlWhole
.Replace What:="HAM", Replacement:="Hampe florale", LookAt:=xlWhole
.Replace What:="IND", Replacement:="Individu ", LookAt:=xlWhole
.Replace What:="NID", Replacement:="Nid", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Inconnu", LookAt:=xlWhole
.Replace What:="PON", Replacement:="Ponte", LookAt:=xlWhole
.Replace What:="SURF", Replacement:="Surface", LookAt:=xlWhole
.Replace What:="TIGE", Replacement:="Tige", LookAt:=xlWhole
.Replace What:="TOUF", Replacement:="Touffe", LookAt:=xlWhole
.Replace What:="", Replacement:="", LookAt:=xlWhole
End With
With Range("TBD[abondanceR]")
.Replace What:="1", Replacement:="Recouvrement faible", LookAt:=xlWhole
.Replace What:="2", Replacement:="", LookAt:=xlWhole
.Replace What:="3", Replacement:="", LookAt:=xlWhole
.Replace What:="4", Replacement:="", LookAt:=xlWhole
.Replace What:="5", Replacement:="", LookAt:=xlWhole
.Replace What:="6", Replacement:="Non concerné", LookAt:=xlWhole
End With
With Range("TBD[typeDenombrement]")
.Replace What:="Ca", Replacement:="Calculé", LookAt:=xlWhole
.Replace What:="Co", Replacement:="Compté", LookAt:=xlWhole
.Replace What:="Es", Replacement:="Estimé", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sais pas", LookAt:=xlWhole
End With
With Range("TBD[occSexe]")
.Replace What:="0", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non déterminable", LookAt:=xlWhole
.Replace What:="2", Replacement:="Féminin", LookAt:=xlWhole
.Replace What:="3", Replacement:="Masculin", LookAt:=xlWhole
.Replace What:="4", Replacement:="Hermaphrodite", LookAt:=xlWhole
.Replace What:="5", Replacement:="Mixte", LookAt:=xlWhole
End With
With Range("TBD[occStadeDeVie]")
.Replace What:="0", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non déterminable", LookAt:=xlWhole
.Replace What:="2", Replacement:="Adulte", LookAt:=xlWhole
.Replace What:="3", Replacement:="Juvénile", LookAt:=xlWhole
.Replace What:="5", Replacement:="Sub-adulte", LookAt:=xlWhole
.Replace What:="6", Replacement:="Larve", LookAt:=xlWhole
.Replace What:="9", Replacement:="Oeuf", LookAt:=xlWhole
.Replace What:="10", Replacement:="Mue", LookAt:=xlWhole
.Replace What:="11", Replacement:="Exuviation", LookAt:=xlWhole
.Replace What:="13", Replacement:="Nymphe", LookAt:=xlWhole
.Replace What:="18", Replacement:="Germination", LookAt:=xlWhole
.Replace What:="19", Replacement:="Fané", LookAt:=xlWhole
.Replace What:="20", Replacement:="Graine", LookAt:=xlWhole
.Replace What:="21", Replacement:="Thalle, protothalle", LookAt:=xlWhole
.Replace What:="22", Replacement:="Tubercule", LookAt:=xlWhole
.Replace What:="23", Replacement:="Bulbe", LookAt:=xlWhole
.Replace What:="24", Replacement:="Rhizome", LookAt:=xlWhole
End With
With Range("TBD[occStatutBiologique]")
.Replace What:="0", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="2", Replacement:="Non déterminable", LookAt:=xlWhole
.Replace What:="3", Replacement:="Reproduction", LookAt:=xlWhole
.Replace What:="4", Replacement:="Hibernation", LookAt:=xlWhole
.Replace What:="5", Replacement:="Estivation", LookAt:=xlWhole
.Replace What:="6", Replacement:="Halte migratoire", LookAt:=xlWhole
.Replace What:="7", Replacement:="Swarming", LookAt:=xlWhole
.Replace What:="8", Replacement:="Chasse / Alimentation", LookAt:=xlWhole
.Replace What:="9", Replacement:="Pas de reproduction", LookAt:=xlWhole
.Replace What:="10", Replacement:="Passage en vol", LookAt:=xlWhole
.Replace What:="11", Replacement:="Erratique", LookAt:=xlWhole
.Replace What:="12", Replacement:="Sédentaire", LookAt:=xlWhole
End With
With Range("TBD[occStatutBiologique]")
.Replace What:="0", Replacement:="Indéterminable", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="2", Replacement:="Observé vivant", LookAt:=xlWhole
.Replace What:="3", Replacement:="Trouvé mort", LookAt:=xlWhole
End With
With Range("TBD[occNaturalite]")
.Replace What:="0", Replacement:="Inconnu", LookAt:=xlWhole
.Replace What:="1", Replacement:="Sauvage", LookAt:=xlWhole
.Replace What:="2", Replacement:="Cultivé/Élevé", LookAt:=xlWhole
.Replace What:="3", Replacement:="Planté", LookAt:=xlWhole
.Replace What:="4", Replacement:="Féral", LookAt:=xlWhole
.Replace What:="5", Replacement:="Subspontané", LookAt:=xlWhole
End With
With Range("occStatutBioGeographique]")
.Replace What:="0", Replacement:="Indéterminable", LookAt:=xlWhole
.Replace What:="1", Replacement:="Non renseigné", LookAt:=xlWhole
.Replace What:="2", Replacement:="Présent", LookAt:=xlWhole
.Replace What:="3", Replacement:="Introduit", LookAt:=xlWhole
.Replace What:="4", Replacement:="Introduit envahissant", LookAt:=xlWhole
.Replace What:="5", Replacement:="Introduit non établi", LookAt:=xlWhole
.Replace What:="6", Replacement:="Occasionel", LookAt:=xlWhole
End With
With Range("TBD[natureObjetGeo]")
.Replace What:="In", Replacement:="Inventoriel", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sait Pas", LookAt:=xlWhole
.Replace What:="St", Replacement:="Stationnel", LookAt:=xlWhole
End With
With Range("TBD[statutSource]")
.Replace What:="Co", Replacement:="Collection", LookAt:=xlWhole
.Replace What:="Li", Replacement:="Littérature", LookAt:=xlWhole
.Replace What:="NSP", Replacement:="Ne sait Pas", LookAt:=xlWhole
.Replace What:="Te", Replacement:="Terrain", LookAt:=xlWhole
End With
End SubDe l'importance d'un tableau Excel bien préparé (et surtout sans cellules fusionnées...) car le but d'inverser les lignes 10 et 11 était d'isoler le tableau du reste.
A+