Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Meilleure idée que la mienne ? VBA

Etienne2323

XLDnaute Impliqué
Bonjour à tous,
j'aurais besoin une fois de plus de votre imagination de programmation. Je vous expose donc mon problème. Chaque trimestre, je reçois de différents gestionnaires les 10 titres majeurs que comporte chaque fond. Cette information me parvient comme suis :

En français :

Can. Housing Trust 4,55 15-12-2012
Prov. de l'Ontario 6,50 08-03-2029
Can. Housing Trust 3,550 15-09-2010
Prov. de l'Ontario 5,375 02-12-2012
Can. Housing Trust 4,60 15-09-2011
Bon trésor US 17-09-2008
Can. Housing Trust 4,60 15-09-2011
Banque Dev. Africaine 4,85 24-07-2012
Prov. de l'Ontario 8,100 08-09-2023
Can. Housing Trust 4,80 15-06-2012

En anglais :

Canada Housing Trst 4.550 Dec 15 12
Ontario Prov 6.500 Mar 08 29
Canada Housing Trst 3.550 Sep 15 10
Ontario Prov 5.375 Dec 02 12
Canada Housing Trst 4.600 Sep 15 11
United States Treas 7.625 Feb 15 25
Canada Housing Trst 4.600 Sep 15 11
African Dev Bk 4.850 Jul 24 12
Ontario Prov 8,100 Sep 08 23
Canada Housing Trst 4.800 Jun 15 12


Les rendements ne font pas parti de mon problème alors je vous les épargne.
La situation est donc la suivante :

Je dois séparer dans un tableau, par le biais d'une macro, les différentes informations contenues la dedans.

J'ai donc besoin d'une colonne "Titre", une colonne "Taux" et une colonne "Échéance" .

Ceci est un exemple pour des titres à revenus fixes, mais la même macro doit pouvoir fonctionner même s'il n'y a pas de taux ou d'échéance dans le cas par exemple d'actions canadiennes.

Vous auriez une piste ou une solution à me proposer ?

Je vous présente ci-bas le début de code que j'avais élaborer mais ce n'est pas ce qu'il y a de plus efficace. Je dois aussi préciser que je ne suis encore qu'un débutant de VB.




Sub Test()

For Row = 6 To 15
temp = ""
temp = Cells(Row, 17).Value
texte = ""
nombre = ""


For i = 1 To Len(temp)
c = Mid(temp, i, 1)
c3 = Mid(temp, i, 3)
c4 = Mid(temp, i, 4)
If c4 = "Jan " Or c4 = "Feb " Or c4 = "Mar " Or c4 = "Apr " Or c4 = "May " Or c4 = "Jun " Or c4 = "Jul " Or c4 = "Aug " Or c4 = "Sep " Or c4 = "Oct " Or c4 = "Nov " Or c4 = "Dec " Or c = "1" Or c = "2" Or c = "3" Or c = "4" Or c = "5" Or c = "6" Or c = "7" Or c = "8" Or c = "9" Or c = "0" Or c3 = " " Then
texte = Left(temp, i - 1)
nombre = Mid(temp, i)
GoTo fin
End If
Next i

If texte = "" And nombre = "" Then texte = temp

fin:
Cells(Row + 11, 6).Value = texte
Cells(Row + 11, 8).Value = nombre

Next Row

End sub





Merci à l'avance

Étienne
 

bqtr

XLDnaute Accro
Re : Meilleure idée que la mienne ? VBA

Bonjour Etienne2323,

Si tu n'as pas des milliers de lignes à traiter, voici un exemple :
(Sur les données en français)

Code:
Sub tri()

Dim k As Byte, i As Long

Application.ScreenUpdating = False

For i = 1 To Range("A65536").End(xlUp).Row
   For k = 1 To Len(Range("A" & i))
       If IsNumeric(Mid(Range("A" & i), k, 1)) Then
          Range("C" & i) = Mid(Range("A" & i), 1, k - 1)
             If Not IsDate(Mid(Range("A" & i), k, 10)) Then
                 Range("D" & i) = CDec(Mid(Range("A" & i), k, Len(Range("A" & i)) - (k + 10)))
                 Range("D" & i).NumberFormat = "0.000"
                 Range("E" & i) = CDate(Right(Range("A" & i), 10))
             Else
                  If k + 9 = Len(Range("A" & i)) Then
                     Range("E" & i) = CDate(Right(Range("A" & i), 10))
                  Else
                     Range("D" & i) = CDec(Right(Range("A" & i), Len(Range("A" & i)) - (k - 1)))
                     Range("D" & i).NumberFormat = "0.000"
                  End If
             End If
          Exit For
        End If
   Next
Next

Application.ScreenUpdating = True

End Sub
Pour plus d'info sur la fonction Mid fait une recherche dans l'aide VBA.

A+
 

Etienne2323

XLDnaute Impliqué
Re : Meilleure idée que la mienne ? VBA

Bonjour bqtr,
je viens de tester le code sur l'ensemble des fonds. Il fonctionne à merveille sur les fonds à revenus fixes puisqu'ils ont des dates d'échéance. Par contre, lorsque j'essaie d'intégrer des titres sans échéance comme des actions où il n'y a que du texte, il passe droit et ne reconnait les opérations à faire.

Il faudrait y intégrer une condition qui lui ferait reconnaitre seulement le texte et le mettrait quand même dans la bonne cellule de destination ou quelque chose du genre je présume.

Une idée ?

Etienne
 

bqtr

XLDnaute Accro
Re : Meilleure idée que la mienne ? VBA

Re,

Essaye comme ceci en modifiant la fin de la macro.

Code:
'.../...
                    Range("D" & i).NumberFormat = "0.000"
                  End If
             End If
          Exit For
        Else
          Range("C" & i) = Trim(Range("A" & i))
        End If
   Next
Next

Application.ScreenUpdating = True

End Sub

Si il n'y a que du texte il sera copier dans la colonne "Titre"

A+
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…