Importer dans plusieurs feuilles sous Excel

cs_oroumov Messages postés 3 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006 - 23 oct. 2006 à 12:00
cs_oroumov Messages postés 3 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006 - 25 oct. 2006 à 15:43
Hello,

J'ai une question pour vous qui est sans doute très simple pour beaucoup d'entre vous. Je pourrais aussi chercher sur le net, mais j'ai peur de trouver une solution qui convienne à mes besoins mais que ce ne soit pas du tout la meilleure implémentation, alors je préfère vous demander en direct.

Voilà ce que je voudrais faire : je voudrais importer un fichier texte sous Excel, et que le résultat sous Excel soit directement sous forme de plusieurs feuilles. Le format du fichier texte original est libre, j'écris en ce moment un programme en PERL (ça c'est obligatoire mais c'est pas la question du jour :o) qui remplit ce fichier donc je mets ce que je veux dedans.

Un exemple :
Je voudrais mettre dans mon fichier texte quelquechose du style :
# Feuille TOTO
Valeur1;13
Valeur2;12
#Feuille TITI
Valeur1;10
Valeur2;245

Et me retrouver après alimentation d'Excel (comment, je ne sais pas non plus, manuellement me convient) avec deux feuilles dans le document Excel, une qui s'appellerait TOTO, l'autre TITI, et contenant les valeurs spécifiées !

Précision : je ne connais rigoureusement rien en VB ou autre langage qui se lie à Excel, donc j'écouterai attentivement vos recommandations sur la meilleur façon de faire pour m'en sortir.

Merci pour votre aide, ou même juste vos suggestions sur la façon de faire.

@+
Oroumov.

6 réponses

B0mbJacK Messages postés 141 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 25 octobre 2006 1
23 oct. 2006 à 12:16
Lu,
voici 2 exemples :  

intro pour l'ouverture
'création objet excel
Set objXL = CreateObject("Excel.Application")

'chargement du document
With Cmd ' boite de dialogue (CommonDialog)
.ShowOpen ' on affiche la boite de dialogue "ouvrir document"
objXL.Workbooks.Open .FileName ' on récupere l'url du document
NmEx = .FileName
'objXL.AskToUpdateLinks = False ' empecher la demande de mise à jour
End With

1)
objXL.Worksheets("ToTo").Activate
objXL.Worksheets("ToTo").Cells(1) = 13
objXL.Worksheets("ToTo").Cells(2) = 10
objXL.Worksheets("TiTi").Activate
objXL.Worksheets("TiTi").Cells(1) = 104
objXL.Worksheets("TiTi").Cells(2) = 245

2)
objXL.Worksheets("ToTo").Cells(1).Value = 13
objXL.Worksheets("TiTi").Cells(1).Value = 104

' et pour quitter , le mot de la fin
dans ta procédure Form1_unload
objXL.DisplayAlerts = False ' on affiche pas d'alerte de fermeture
 objXL.Quit
Set objXL = Nothing ' on décharge notre objet  excel
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 oct. 2006 à 13:02
Salut,

pas le temps de gérer les éventuelles erreurs donc suit bien les instructions :

Ouvre un nouveau classeur, appuie sur Alt + F11 (ça ouvre l'éditeur vb), dans le menu Insertion, tu as Module, clique dessus, et une page blanches apparait.

Colle ce code et  remplace ce que je t'ai mis en commentaire (en vert dans le code) :
T'as plus qu'à appuyer sur F5 pour exécuter le code !

Sub ImportDonneesFichiersTexte()
    Dim strFile         As String
    Dim strAllText()    As String
    Dim strDonnees()    As String
    Dim ff              As Integer
    Dim i               As Integer
    Dim iCounter        As Integer
    Dim iNbLine         As Integer
    Dim iLigne          As Integer
    Dim iColonne        As Integer
    
strFile =  "C:\Documents and settings\<nom utilisateur>\Bureau\ValeursExcel.txt"
' ici place le bon chemin et nom du fichier texte

ff = FreeFile
Open strFile For Input As ff
    Contenu = Input(LOF(ff), ff)
Close ff

strAllText() = Split(Contenu, vbCrLf)
iNbLine = UBound(strAllText)
iCounter = 0: iLigne = 1: iColonne = 1

For i = 0 To iNbLine
    If Left(strAllText(i), 1) = "#" Then
        If iCounter >= 3 Then ThisWorkbook.Sheets.Add
        Sheets(iCounter + 1).Select
        Sheets(iCounter + 1).Name = Mid(strAllText(i), 2, Len(strAllText(i)))
        iCounter = iCounter + 1: iLigne = 1: iColonne = 1
    Else
        strDonnees = Split(strAllText(i), ";")
        Cells(iLigne, iColonne).Value = strDonnees(0)
        Cells(iLigne, iColonne + 1).Value = strDonnees(1)
        iLigne = iLigne + 1
        Erase strDonnees
    End If
Next i
Erase strAllText
End Sub

<small>Coloration syntaxique automatique [mortalino] </small>

       

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
B0mbJacK Messages postés 141 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 25 octobre 2006 1
23 oct. 2006 à 13:24
Re

Je voudrais mettre dans mon fichier texte quelquechose du style ....

oui lol ...j'ai vraiment pas répondu à ta question!...désolé : )

encore un bug, heureusement que  mortalino  est la

bonne programmation.....++
0
cs_oroumov Messages postés 3 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
23 oct. 2006 à 14:07
Salut Mortalino,

Merci pour la réponse, en plus ça se lit presque intuitivement, même si j'aurais jamais pu trouver moi même les commandes du style :

ff = FreeFile
Open strFile For Input As ff
    Contenu = Input(LOF(ff), ff)
Close ff

Par contre, j'avoue j'ai pas encore eu le temps de tester (je pourrai en fin d'après midi) mais j'ai quand même une question : je crois que par défaut ça gère pas le fait de recommencer en case 1,1 au début de la page suivante, j'ai l'impression que si en première page on a atteint la ligne 10, alors iLigne va valoir 11 au début de la feuille suivante.

Enfin je ferai des tests cet après midi.
Ceci mis à part, c'est exactement ce que je voulais c'est vraiment excellent.....

Merci beaucoup, je teste et je vous dis si j'ai réussi à m'en sortir.

@+
Oroumov.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 oct. 2006 à 14:29
Je viens de vérifier, pas d'erreur à ce niveau.
Le compteur pour les lignes et colonnes ne se mettent à 1 que lorsque qu'une feuille est sélectionnée.

Néanmoins, j'ai fait une erreur dans le code, il ne faut pas travailler avec l'index de la feuille (car index = position, et lors de l'ajout, la feuille s'intercale avant la dernière) mais avec le nom de la feuille.
Voici la correction :

Sub ImportDonneesFichiersTexte()
    Dim strFile         As String
    Dim strAllText()    As String
    Dim strDonnees()    As String
    Dim ff              As Integer
    Dim i               As Integer
    Dim iCounter        As Integer
    Dim iNbLine         As Integer
    Dim iLigne          As Integer
    Dim iColonne        As Integer
    
strFile = "C:\Documents and settings\Nico\Bureau\ValeursExcel.txt"
' ici place le bon chemin et nom du fichier texte
'Close ff

ff = FreeFile
Open strFile For Input As ff
    Contenu = Input(LOF(ff), ff)
Close 2

strAllText() = Split(Contenu, vbCrLf)
iNbLine = UBound(strAllText)
iCounter = 0: iLigne = 1: iColonne = 1

For i = 0 To iNbLine
    If Left(strAllText(i), 1) = "#" Then
        If iCounter >= 3 Then ThisWorkbook.Sheets.Add
         ' *** correction ci-dessous *** '
        Sheets("Feuil" & CStr(iCounter + 1)).Select
        Sheets("Feuil" & CStr(iCounter + 1)).Name = Mid(strAllText(i), 2, Len(strAllText(i)))
        iCounter = iCounter + 1: iLigne = 1: iColonne = 1
    Else
        strDonnees = Split(strAllText(i), ";")
        Cells(iLigne, iColonne).Value = strDonnees(0)
        Cells(iLigne, iColonne + 1).Value = strDonnees(1)
        iLigne = iLigne + 1
        Erase strDonnees
    End If
Next i
    Erase strAllText
End Sub

--Mortalino--
@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
cs_oroumov Messages postés 3 Date d'inscription lundi 23 octobre 2006 Statut Membre Dernière intervention 25 octobre 2006
25 oct. 2006 à 15:43
Hello !

D'abord merci à tous pour votre aide précédemment, j'arrive exactement à faire ce que je veux avec ce que vous m'avez donné plus haut.

J'ai deux questions cependant :
1/ Question mise en forme (exemple, mettre en rouge toutes les cases qui contiennent toto, et autre), pouvez vous me dire s'il y a un bon lien web vers une page qui recenserait ces commandes en VB ? (comment je mets en gras, comment j'applique tel style, etc etc...) Je vois bien d'après vos exemple ci dessus comment faire moi même les tests des caractères des cases, mais tout ce qui est commande interprétable par Excel (genre Cells(1,2).value ou autre), où puis je en trouver une référence ?

2/ Autre question sur la meilleure façon de procéder, je souhaiterais que les données que j'ai recupérées dans une seule et même feuille d'excel, et qui sont des blocs de données, jepuisse les classer dans l'autre sens. Toujours pareil, je fais ce que je veux avec le fichier d'input, donc ça ne me gene pas de rajouter des caractères pour faciliter le codage, mais la meilleure façon de faire ?

Exemple, aujourd'hui sur la feuille 1 j'ai :

&info;1
nom;toto
adresse;toulouse
&info;2
nom;titi
adresse;paris
telephone;3434363636

et je voudrais que s'affiche :

info         1              info         2
nom        toto          nom       titi
adresse   toulouse   adresse   paris
                              telephone 3434343436
(pas facile de faire du tableur sans cases) :))
En gros, je voudrais transformer la vue verticale en plusieurs colonnes horizontales, en me disant que je déplace tout un tas de cellules entre la cellule qui contient le "&" et la cellule suivante qui contient le "&"-1.

Je sais pas si c'est très clair

Bon dans tous les cas merci pour votre aide !

Oroumov.
0
Rejoignez-nous