VBA de champ dans xls copié dans le notepad windows

Sebasto

XLDnaute Nouveau
Bonjour,
C'est mon premier message et je suis assez débutant (je sais faire les macros en automatique).
Dans un fichier compos.xlsm, je dois :
* créer et enregistrer un champ de cellules (ou une zone, je ne sais pas comment cela s'appelle) par exemple de L8C5 à L26C12 que je veux nommer field1, comment faire de telle sorte que si j'ajoute des lignes ou des colonnes à l'intérieur de cette zone définie, le nom ne soit pas détruit et la zone augmente automatiquement d'autant.
* créer une macro qui intègre le point précédent, qui appelle ce champ, le sélectionne, puis le copie non pas dans un autre fichier Excel, mais dans un fichier txt existant en remplaçant le contenu précédent par le nouveau puis qui enregistre le fichier txt (bon je peux aussi m'arranger avec un nouveau fichier txt que j'appellerai field1.txt)
C'est un gros besoin et avec les macros automatiques, rien ne se passe. Donc la question est sans doute pas facile.
Merci de vos idées, Seb
 

tototiti2008

XLDnaute Barbatruc
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour Sebasto,

Bienvenue sur XLD,

Si j'ai compris, ce que tu appelles un "champ de cellules" est un nom dynamique
Le plus simple pour créer un nom dynamique est de déclarer ta zone en tableau (Onglet Insertion - Tableau)
Pour la 2ème partie, tout dépend de comment tu souhaites voir afficher tes données de cellules dans ton fichier txt
tu peux essayer de copier tes données dans un nouveau classeur puis d'enregistrer le classeur au format txt, par exemple
 

Dormeur74

XLDnaute Occasionnel
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour tous les deux. L8C5 à L26C12 ???
Il s'agit de 2 plages différentes que tu peux associer sous un même nom "field1" par exemple.

Au départ ta zone a cette référence : Feuil1!$C$5:$L$8;$C$12:$L$26

Si tu supprimes la colonne G, le nom "Field1" n'est jamais effacé. Seules ses références vont changer. Elles vont devenir :
Feuil1!$C$5:$K$8;$C$12:$K$26, ce qui est logique.

Bonne soirée.
 

Sebasto

XLDnaute Nouveau
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour à tous le 2 et merci.
Je vois que je n'ai pas été très clair.
Mon exemple est tout simple mais la définition est basée sur les lignes (L) et les colonnes (C), donc c'est un simple rectangle.
Depuis j'ai fini par trouver que cela s'appelait une plage (simple, pas dynamique?).
Désolé mais sur XLS 2007, je ne trouve pas Onglet Insertion - Tableau (dans l'onglet Formules je peux définir un nom).
J'ai vu effectivement que je peux enregistrer au format txt mais il s'agit de la feuille et je ne veux enregistrer que la plage nommée (et je préfèrerai qu'il appelle un fichier txt existant, mais si pas possible je me débrouillerai).
Pouvez-vous en dire un peu plus comment le code se présenterait en VBA?
Merci beaucoup d'avoir répondu, Seb
 

Sebasto

XLDnaute Nouveau
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour,
J'ai passé la journée de Samedi dans une bibliothèque spécialisée de Paris.
J'ai avancé assez, pour le début de la macro (définir la plage, la copier) et pour la fin (set ts).
Mais pas les variables, pas le milieu!
Donc je demande de l'aide sur du concret, voir le fichier compos.xlsm attaché.
Quand j'exécute la macro dans le fichier, j'ai une erreur de compilation (variable non définie) pour (surligné en bleu) "set fs".

Merci d'avance pour votre aide, Seb
 

Pièces jointes

  • compos.xlsm
    15.6 KB · Affichages: 59

Sebasto

XLDnaute Nouveau
Re : VBA de champ dans xls copié dans le notepad windows

UP

Bonjour,
Je ne vois pas pourquoi personne ne veut m'aider.
Il y a beaucoup de réponses sur ce forum pour les autres questions.
Je crois avoir respecté les règles.
J'ai mis un fichier xlsm en ligne pour exemple.
J'ai commencé la VBA.
La demande n'est pas impossible et ne demande pas des heures de travail.

Dites-moi svp ce qui ne va pas et je ferai tout mon possible pour m'y conformer.
Merci, Seb
 

tototiti2008

XLDnaute Barbatruc
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour Sebasto,

MJ13 t'a proposé un lien pour écrire dans un fichier texte, mais tu es parti sur une autre méthode
ensuite tu mets
et je préfèrerai qu'il appelle un fichier txt existant
et tu utilises "CreateTextFile" qui crée un nouveau fichier...
Quand VBA parle de variable non définie, c'est que tu n'as pas déclaré tes variables
La déclaration des variables est obligatoire s'il y a "Option Explicit" en haut du module

essaye ça et dis-nous :

Code:
Sub Field1()
Dim fs As Object, a As Object, i As Long
    Range("F1").Select
    Application.Goto Reference:="field1"
    Selection.Copy
    Sheets.Add After:=Sheets(Sheets.Count)
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.CreateTextFile(ThisWorkbook.Path & "\field1.txt", True)
    For i = 1 To Range("A1").CurrentRegion.Rows.Count
        a.writeline Range("A" & i).Value
    Next i
    a.Close
Set a = nothing
set fs = nothing
End Sub
 

Sebasto

XLDnaute Nouveau
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour tototiti2008 (c'est du morse?? non je plaisante parce que je suis content et je te dis merci, merci et encore merci).
D'abord je dois dire que je suis piteux pour MJ13 car je n'ai pas poursuivi son lien au-delà d'un rapide visionnage car déjà csv me passait au-dessus de la tête (en Excel je ne sais faire que les macros automatiques comme j'ai dit avant).
Ensuite pour les variables je ne savais pas (l'option explicit dont tu parles a dû s'écrire automatiquement)
Enfin, sur ton code proprement dit, j'ai quelques questions:
1 cela marche, bien sûr, mais bizarrement cela crée, en plus du fichier txt, une nouvelle feuille dans le fichier xlsm avec la copie du champ défini (une sorte de doublon)
2 il y a un souci si je change la définition de mon field (dans l'exemple c'est une simple colonne de lignes contigues) en l'étendant par exemple à une colonne de plus (alors le txt ne prend qu'une seule colonne sur les 2... mais la nouvelle feuille, appelons-la le doublon bizarre, elle, prend bien les 2 colonnes)... donc cela bloque.
3 il ne semble pas y avoir de problème sur la question de création ou de remplacement du txt, car il écrase tout simplement (et pour moi c'est OK, je ferai un copié-collé et je pourrai vérifier avant que le nouveau txt et l'ancien sont comparables)
4 tu te doutes que ma question a un intérêt très pratique (le txt produit est un fichier qui va être introduit dans une page web php par un include), mais en l'état j'ai 2 problèmes:
le premier c'est comment enrichir la macro pour que après avoir copié field1dans field1.txt, elle fasse pareil avec field2 pour field2.txt et ainsi de suite j'en ai une vingtaine comme cela (je subodore que le i va être la solution comme integer et i = 1 to 20... mais là je suis sec... peux tu me piloter stp?
le deuxième c'est que je ne sais pas si créer 20 feuilles doublon-bizarre ne va pas faire bugger la macro.
Voilà, en te remerciant encore (et en présentant mes excuses à MJ13... je suis trop béotien sur Excel)

A+, Seb
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour Sebasto,

mais bizarrement cela crée, en plus du fichier txt, une nouvelle feuille dans le fichier xlsm avec la copie du champ défini (une sorte de doublon)

ça n'a rien de bizarre, c'est ce que le code fait

Code:
    Application.Goto Reference:="field1" 'sélectionne la plage field1
    Selection.Copy 'la copie
    Sheets.Add After:=Sheets(Sheets.Count) 'Crée une nouvelle feuille dans le classeur à la fin
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False 'y colle la plage copiée

il y a un souci si je change la définition de mon field (dans l'exemple c'est une simple colonne de lignes contigues) en l'étendant par exemple à une colonne de plus (alors le txt ne prend qu'une seule colonne sur les 2... mais la nouvelle feuille, appelons-la le doublon bizarre, elle, prend bien les 2 colonnes)

Oui, c'est encore ce que fait le code

Code:
    For i = 1 To Range("A1").CurrentRegion.Rows.Count
        a.writeline Range("A" & i).Value 'Ecrit dans le fichier texte la contenu de la colonne A de la nouvelle feuile
    Next i

Voilà, en te remerciant encore (et en présentant mes excuses à MJ13... je suis trop béotien sur Excel)

Alors on va repartir sur des bases saines
Tu va expliquer, étape après étape, en français, ce que doit faire ta macro, en précisant bien dans le détail :
les plages de ton classeur qui devront être écrites dans ton fichier texte
s'il y a plusieurs colonnes dans la plage, comment les écrit-on dans le fichier txt
faut-il mettre les plages à la suite les unes des autres...
 

Sebasto

XLDnaute Nouveau
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour tototiti2008,

Merci beaucoup pour ta réaction.
J'avais travaillé entre temps avec l'avancement pas à pas de la macro et j'ai pu régler la question de la cration de la feuille doublon bizarre.
Voici le code ci après où je suis rendu avec en plus qques modifs de détails

Pour le souci du champ avec plusieurs colonnes là je bloque... j'ai essayé
de changer ton code, mais j'obtiens
Erreur d'exécution 1004, la méthode range de l'objet _Global a échoué
si je clique sur débogage, la ligne après est surlignée
For i = 1 To Range("A1-B1").CurrentRegion.Rows.Count
ou
a.writeline Range("A-B" & i).Value

C'est sûr que ton code est bon et que je me suis mal expliqué.
Donc maintenant je vais ré-expliquer ce que je veux, comme tu le demandes:
- copier un champ field1 prédéfini du fichier compos.xlsm dans un fichier field1.txt, sachant que field 1 est un champ simple fait de x colonnes et y lignes (x et y supérieurs ou égaux à 1... ton code fonctionne s'il n'y a qu'une seule colonne)
- ensuite toujours dans le même fichier copier un autre champ field2 prédéfini du fichier compos.xlsm dans un fichier field2.txt
- et ainsi de suite, pour tous mes fields, 1, 2, 3, etc, jusqu'à 20 par exemple (j'en ai actuellement 19 mais je peux en créer en parallèle avec de nouvelles pages web (en fait le fichier compos.xlsm comporte plus de 200 colonnes et et plus de 400 lignes)

En te priant de m'excuser de n'avoir pas été clair.
Merci d'avance, Seb

Code:
Option Explicit

Sub Fields()
 Dim fs As Object, a As Object, i As Long
 Sheets("Feuil2").Select
    Cells.Select
    Selection.ClearContents
    Range("A1").Select
 Sheets("Feuil1").Select
     Range("A1").Select
     Application.Goto Reference:="field1"
     Selection.Copy
 Sheets("Feuil2").Select
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
         :=False, Transpose:=False
     Set fs = CreateObject("Scripting.FileSystemObject")
     Set a = fs.CreateTextFile(ThisWorkbook.Path & "\field1.txt", True)
    For i = 1 To Range("A1").CurrentRegion.Rows.Count
    a.writeline Range("A" & i).Value
     Next i
     a.Close
 Set a = Nothing
 Set fs = Nothing
 Sheets("Feuil1").Select
    Range("A1").Select
    Application.CutCopyMode = False
    ActiveWorkbook.Save
 End Sub
 

tototiti2008

XLDnaute Barbatruc
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour Sebasto,

Tu va expliquer, étape après étape, en français, ce que doit faire ta macro, en précisant bien dans le détail :
les plages de ton classeur qui devront être écrites dans ton fichier texte

- ensuite toujours dans le même fichier copier un autre champ field2 prédéfini du fichier compos.xlsm dans un fichier field2.txt
- et ainsi de suite, pour tous mes fields, 1, 2, 3, etc, jusqu'à 20 par exemple (j'en ai actuellement 19 mais je peux en créer en parallèle avec de nouvelles pages web (en fait le fichier compos.xlsm comporte plus de 200 colonnes et et plus de 400 lignes)

OK

s'il y a plusieurs colonnes dans la plage, comment les écrit-on dans le fichier txt

Pas OK : quel séparateur entre les données des différentes colonnes dans le fichier texte ?

faut-il mettre les plages à la suite les unes des autres...

dans un fichier field2.txt

Donc chaque plage (et pas champ !!) dans un fichier texte différent, OK

Peux-tu éclaircir le point restant : si plusieurs colonnes dans la plage, quel séparateur (caractère de ton choix) faut-il mettre entre les données de chaque colonne dans le fichier texte ?
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : VBA de champ dans xls copié dans le notepad windows

Re,

D'autre part, je ne sais pas pourquoi tu copies les données de ta plage "field1" vers la Feuil2
Rien ne t'empêche de lire les données de tes plages sans les copier, à moins que la copie ne te serve à quelque chose...

Essaye peut-être un truc comme ça, mais c'est mon dernier essai à l'aveugle

Code:
Sub Fields()
 Dim fs As Object, a As Object, i As Long, j As Long, k As Long, Ligne As String
     Set fs = CreateObject("Scripting.FileSystemObject")
     For i = 1 To 19
     Application.Goto Reference:="field" & i
     Set a = fs.CreateTextFile(ThisWorkbook.Path & "\field" & i & ".txt", True)
        For j = 1 To Range("field" & i).Rows.Count
            Ligne = ""
            For k = 1 To Range("field" & i).Columns.Count
                Ligne = Ligne & Range("field" & i).Cells(j, k).Value & ";"
            Next k
            If Len(Ligne) > 0 Then Ligne = Left(Ligne, Len(Ligne) - 1)
            a.writeline Ligne
        Next j
        a.Close
     Next i
    Set a = Nothing
    Set fs = Nothing
 End Sub
 

Sebasto

XLDnaute Nouveau
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour tototiti2008,



Merci beaucoup pour ta réaction et ta proposition.

Je viens de tester ta proposition et il y a un bug:
Erreur d'exécution '1004 référence non valide

surligné : Application.Goto Reference:="field" & i


Pour répondre à tes questions précédentes, je pense que tu es un vrai expert et que tu y as vu quelque chose de plus compliqué que je ne pensais...
mais ce que tu as fait est encore mieux.
Je pensais recopier 19 fois le petit bout de macro à la suite l'un de l'autre... là tout se fait en 1 coup, bravo.
J'aurai quand même la nécessité de copier un bout séparément et de l'arranger, car une des plages est générée en feuille3 par une macro automatique (qui simplement fait un tri et ajoute une colonne avec une formule calculée par une fonction simple, et d'autres petites choses)
Pour la question du séparateur il n'y en a pas et donc Excel met automatiquement une tabulation et cette tabulation est lue comme un simple espace par les navigateurs Internet (je sais tout cela car actuellement je fais tout cela à la main mais c'est rasoir et source d'erreurs).
Pour la feuille 2 du début de ce fil, je n'en ai absolument pas besoin, donc c'est parfait.

Donc je résume :
- pas de séparateur (à la main, Excel crée des tabulations entre les cellules des colonnes)
- je te joins le fichier compos1.xlsm avec 4 plages créées de 1 à 4
- dans la feuille 3, j'ai mis le résultat type (pas le vrai) de la macro automatique (tri+colonne), donc dans ce cas il n'y a pas de plage définie mais on prend tout ce qui est dans la feuille 3 pour le sauvegarder par exemple dans field20.txt

Je crois que j'ai été clair mais comme je ne suis pas le meilleur communiquant du monde, n'hésite pas à demander à clarifier avant d'avancer sur quoi que ce soit


A+, Seb
 

Pièces jointes

  • compos1.xlsm
    21.8 KB · Affichages: 53
  • compos1.xlsm
    21.8 KB · Affichages: 57
  • compos1.xlsm
    21.8 KB · Affichages: 51

tototiti2008

XLDnaute Barbatruc
Re : VBA de champ dans xls copié dans le notepad windows

Bonjour Sebasto,

essaye ce code là sur le fichier que tu as fourni
j'ai commenté chaque étape pour que tu comprennes le fonctionnement, ce qui pourra être utile si tu veux faire évoluer le nombre de plages à traiter

Code:
Sub Fields()
  Dim fs As Object, a As Object, i As Long, j As Long, k As Long, Ligne As String
      'Crée le nom field5 pour les données de la Feuil3
      ThisWorkbook.Names.Add "field5", Sheets("Feuil3").Range("A1").CurrentRegion
      Set fs = CreateObject("Scripting.FileSystemObject")
      'i passe de 1 à 5 pour traiter de field1 à field5
      For i = 1 To 5
      'on sélectionne la plage "field" & i (field1, field2...)
      Application.Goto Reference:="field" & i
      'on crée le fichier
      Set a = fs.CreateTextFile(ThisWorkbook.Path & "\field" & i & ".txt", True)
         'Pour chaque ligne  de la plage
         For j = 1 To Range("field" & i).Rows.Count
             Ligne = ""
             'Pour chaque colonne de la ligne on colle les informations avec un séparateur tabulation (chr(9))
             For k = 1 To Range("field" & i).Columns.Count
                 Ligne = Ligne & Range("field" & i).Cells(j, k).Value & Chr(9)
             Next k
             If Len(Ligne) > 0 Then Ligne = Left(Ligne, Len(Ligne) - 1)
             'On écrit la ligne dans le fichier texte
             a.writeline Ligne
         Next j
         'on ferme le fichier
         a.Close
      Next i
     Set a = Nothing
     Set fs = Nothing
  End Sub

Je crois que j'ai été clair mais comme je ne suis pas le meilleur communiquant du monde, n'hésite pas à demander à clarifier avant d'avancer sur quoi que ce soit

Oui, on y est arrivé je crois
La programmation c'est quelque chose d'assez carré, il faut savoir précisément d'où on part, quelles sont toutes les étapes intermédiaires et quel devra être le résultat final. Si tu ne donnes que la moitié des informations, il est très rare que ça réalise ce que tu souhaites :)
 

Discussions similaires

Réponses
13
Affichages
569

Statistiques des forums

Discussions
312 464
Messages
2 088 628
Membres
103 894
dernier inscrit
tanyroc