Comparer deux chaînes de valeur

Rep

XLDnaute Junior
Bonjour à tous !

Je travaille actuellement sur le retraitement d'une balance comptable pour pouvoir extraire des données selon un format spécifié, mais je bute sur la comparaison de chaînes de caractère.

Pour faire rapide, les montants sont répartis par compte, eux-mêmes codifiés spécifiquement par un numéro de compte.
Un exemple :

Le capital social d'une société est de 25 000€.

Dans la balance, on aura ceci:
101300 - Capital social souscrit appelé versé - 25 000€

La codification est une norme (appelée plan comptable), donc commune à toutes les balances comptables. C'est pourquoi je souhaite m'en servir comme base de traitement de données. L'ennui, c'est que la norme sur les numéros de compte s'arrête à 4 voire 5 chiffres.

Dans le plan comptable, le capital social souscrit appelé versé est codifié : 1013

Sachant qu'on est libre des chiffres (tant en quantité qu'en valeur) à insérer après les 4 premiers comme dans l'exemple. En clair, on peut avoir 101300, 101301,1030 etc. pour codifier le capital social souscrit appelé versé.

Je souhaite donc passer par une macro, qui va extraire les valeurs de la balance pour les insérer dans ma matrice. Ma matrice n'est autre que le plan comptable complet (qui regroupe tous les comptes). Je pensais pour cela procéder par comparaison du début de chaque chaîne de caractère comme ceci :

----------------------------
Dans la balance comptable :
101301 - Capital social - 25 000€

----------------------------
Dans ma matrice :
1013 - Capital social

----------------------------
Dans ma macro :
Comparaison de la chaîne de caractère de la matrice "1013" avec le début de la chaîne de caractère de la balance "101301" et si correspondance, copie du montant (25 000€ donc), dans la matrice

Voici la macro que j'ai commencé à monter:

Sub Traitement()
nbl_matrice = Sheets("matrice").Range("A1").CurrentRegion.Rows.Count
nbl_import = Sheets("import").Range("A1").CurrentRegion.Rows.Count
For cpte_matrice = 1 To nbl_matrice
no_cpte_matrice = Sheets("matrice").Cells(cpte_matrice, 1)
For cpte_bg = 1 To nbl_import
no_cpte_import = Sheets("import").Cells(cpte_bg, 1)
If InStr(1, no_cpte_matrice, no_cpte_import) > 0 Then
Sheets("matrice").Cells(cpte_matrice, 3) = Sheets("import").Cells(cpte_bg, 3)
GoTo next_cpte_matrice
Else
Sheets("matrice").Cells(cpte_matrice, 3) = 0
End If
Next
next_cpte_matrice:
cpte_bg = 1
Next
End Sub

Les + :
- la macro tourne (je sais, il m'en faut peu :D )

Les - :
- elle ne me renvoit pas la valeur, même s'il y a correspondance.
- l'exécution est extrêmement lourde du fait d'une comparaison énumérative : chaque valeur de la première liste est comparée à chaque valeur de la seconde.

En parcourant un peu le web, il apparaît que l'utilisation de tableau avec traitement en mémoire est beaucoup plus rapide. Seulement, je ne sais pas du tout comment procéder...

Je vous joins le fichier utilisé.

Merci d'avance pour votre aide,

Nicolas
 

Pièces jointes

  • Matrice_exemple.xlsm
    51.1 KB · Affichages: 105
  • Matrice_exemple.xlsm
    51.1 KB · Affichages: 114
  • Matrice_exemple.xlsm
    51.1 KB · Affichages: 109

david84

XLDnaute Barbatruc
Re : Comparer deux chaînes de valeur

Bonjour Rep,
un exemple explicite valant mieux que moult détails, il serait préférable de noter manuellement les résultats attendus sur ton fichier avec quelques explications afin d'être sûr de bien comprendre ta demande.
A+
 

Rep

XLDnaute Junior
Re : Comparer deux chaînes de valeur

Bonjour,

Je pensais mon message explicite... mais c'est vrai que plongé dans le problème, on en oublie d'être clair ;)

J'ai deux feuilles de calcul : balance_générale et matrice. Voici un exemple de contenu:

Code:
balance_générale:
101311 | 25 000€
106200 | 2 500€
.....
Code:
matrice:
1010 | [vide]
1011 | [vide]
1012 | [vide]
1013 | [vide]
1060 | [vide]
1061 | [vide]
1062 | [vide]
1063 | [vide]
.......

Je veux arriver, par comparaison avec balance_générale, à :
Code:
matrice:
1010 | [vide]
1011 | [vide]
1012 | [vide]
1013 | 25 000€
1060 | [vide]
1061 | [vide]
1062 | 2 500€
1063 | [vide]
.......

J'espère avoir été suffisamment clair ! :)

Merci
 

pierrejean

XLDnaute Barbatruc
Re : Comparer deux chaînes de valeur

Bonjour Rep

Salut David

Un essai
Toutefois il y a au moins un problème au niveau du report a nouveau (crediteur et debiteur ne sont pas differenciés)
 

Pièces jointes

  • Matrice_exemple.xlsm
    60.2 KB · Affichages: 92
  • Matrice_exemple.xlsm
    60.2 KB · Affichages: 91
  • Matrice_exemple.xlsm
    60.2 KB · Affichages: 92

Hippolite

XLDnaute Accro
Re : Comparer deux chaînes de valeur

Bonjour Nicolas, Bonjour pierrejean, bonjour david

Comme demandé avec des tableaux

J'ai corrigé quelques anomalies
- inversion dans InString
- limité aux 4 premiers caractères de import pour supprimer les fausses détections
- sommation si plusieurs lignes de import répondent au même critère
- supprimé quelques lignes inutiles

A+

edit : Avec le fichier c'est mieux !
 

Pièces jointes

  • Matrice_exemple+.zip
    52.9 KB · Affichages: 64
Dernière édition:

Rep

XLDnaute Junior
Re : Comparer deux chaînes de valeur

Bonsoir Hippolite, bonsoir david84, bonsoir pierrejean,

Je reviens à la charge avec mon fichier :)

L'utilisation des variables tableaux est vraiment top, mais je ne l'ai découvert que très récemment. J'aimerais savoir s'il est possible d'insérer une ligne dans une variable tableau pour y insérer de nouvelles données...

Voici un bout de code pour vous aiguiller:

Code:
Sub traitement()

'---------- Déclaration des tableaux à partir du fichier d'import et de la matrice ----------
import_bg = import_name.Sheets("Feuil1").Range("A1:C" & import_name.Sheets("Feuil1").Range("A65536").End(xlUp).Row)
matrice = matrice_name.Sheets("import").Range("A1:E" & matrice.Name.Sheets("import").Range("A65536").End(xlUp).Row)

'---------- Importation des données du fichier d'import dans la matrice ----------
For n = LBound(import_bg, 1) To UBound(import_bg, 1)
    For m = LBound(matrice, 1) To UBound(matrice, 1)
        If import_bg(n, 1) = matrice(m, 1) Then
......(insérer une ligne sous la valeur trouvé comme identique).......

Merci d'avance,
 

Rep

XLDnaute Junior
Re : Comparer deux chaînes de valeur

Bonsoir Hyppolite,

Oui c'est ce dont je me suis aperçu, c'est d'ailleurs pour ça que le Redim Preserve que j'avais tenté d'utiliser ne fonctionne pas.

Tant pis, sachant que cette partie ne requiert que peu de ressources, je ne passerai pas par une variable tableau ;)

Edit : et un grand merci pour le fichier mis à disposition !
 

Discussions similaires

Statistiques des forums

Discussions
312 386
Messages
2 087 851
Membres
103 669
dernier inscrit
Anne Sicard