IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA pour enregistrer [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 20
    Par défaut VBA pour enregistrer
    Bonjour à tous, après beaucoup de recherche et d'essai, je me retourne vers vous pour mon problème presque réglé.

    Je veux enregistrer une plage de cellule (A4 à F60) dans une fichier texte avec l'extention .prg et comme nom de fichier le nom d'une cellule (B4).

    J'ai réussi à trouver une macro, et je l'ai modifié un peu, mais elle ne sauvegarde seulement une plage de la rangée A. (A4 à A59)

    Merci de me corriger, je suis vraiment pas fort en VBA.
    Je suis avec excel 2010

    Voici ma macro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub SAVE_Range_txt()
        Sheets("1 ROUGH + 1 FINISH").Select
        Dim FileName As String
        Dim FileNumber As Integer
     
       FileName = "C:\zzz\" & Range("B4").Value & ".prg"
       FileNumber = FreeFile()
       Open FileName For Output As #FileNumber
       For Row = 4 To 59
          Print #FileNumber, Cells(Row, 1).Value
     
       Next
       Close #FileNumber
    End Sub

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, bestialement qqch du genre ( à tester )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For iRow = 4 To 60
            For iCol = 1 To 6
                Print #FileNumber, Sheet1.Cells(iRow, iCol).Value
            Next iCol
        Next iRow
    Prends l'habitude d'utiliser Option Explicit

    P.-S. : Balise ton code

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Ça peut te donner des idées!
    Tu pourras copier coller toute ta plage en une fois! Dans mon exemple je replace les tabulations par des points virgules mais les remplacera par des espaces " " ou rien "" c'est selon!
    http://www.developpez.net/forums/d15...v/#post8305353
    Dernière modification par Invité ; 21/11/2015 à 01h20.

  4. #4
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Juillet 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Canada

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : Juillet 2015
    Messages : 20
    Par défaut
    Merci, kiki29, j'ai essayé avec tes lignes, le fichiers enregistre les bonnes colonne mais les places une sous les autre,
    et je m'excuse, je suis pas fort du tout en vba, je ne comprends même pas ta suggestion d'utilisé l'option Explicit, et de Balisé mon code !!

    Merci d'etre très précis.

    merci

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Teste ce qui suit mais au préalable, adapte le chemin et le nom de la feuille cible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Sub Test()
     
        Dim Plage As Range
        Dim Dossier As String
        Dim Fichier As String
        Dim Ligne As String
        Dim I As Integer
     
        'définir le nom de la feuille...
        With Worksheets("Feuil1")
     
            Fichier = .Range("B4").Value & ".prg"
            Set Plage = .Range("A4:F60")
     
        End With
     
        'définir le dossier...
        Dossier = "D:\Mon Dossier\"
     
        Open Dossier & Fichier For Output As #1
     
        For I = 1 To Plage.Count 'par défaut, lecture par ligne
     
            'ajoute un point-virgule de séparation (à adapter...)
            Ligne = Ligne & Plage(I).Value & ";"
     
            If I Mod (Plage.Columns.Count) = 0 Then
     
                Ligne = Left(Ligne, Len(Ligne) - 1) 'suppression du dernier ";"
     
                Print #1, Ligne 'inscrit la ligne
     
                'vide pour la prochaine
                Ligne = ""
            End If
     
        Next I
     
        'ferme
        Close #1
     
    End Su
    je ne comprends même pas ta suggestion d'utilisé l'option Explicit
    L'inscription "Option Explicit en tête de module (quelqu'il soit) oblige la déclaration des variables de façon explicite et donc, les variables "sauvages" seront détectées par le compilateur et il y aura un bug ! Pour que ceci se fasse de façon automatique, -->Menu "Outils"-->"Options..."-->Onglet "Editeur"-->Cocher la case "Déclaration des variables obligatoire"
    A la création des nouveaux classeurs, Option Explicit sera déjà inscrit en tête de tous les modules présents dans le classeur.
    Par exemple, tu en as une dans cette ligne de code :
    Row est une variable "sauvage" car pas déclarée dans le code et de plus, il est préférable de ne pas utiliser les mots que l'on pourrait appeler "réservés" comme celui-ci car Row est une propriété de l'objet Range, lui préférer "Ligne", "Lgn", "Lig"ou même "L" ou n'importe quoi d'autre plutôt qu'un mot réservé.
    et de Balisé mon code !!
    Dans l'éditeur (ici) tu as dus remarquer qu'il y as dans la barre d'outils un bouton avec le signe # et bien, ce bouton quand tu cliques dessus inscrit les balises de code et c'est entre ces balises que tu vas coller ton code

  6. #6
    Invité
    Invité(e)
    Par défaut
    test ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #If VBA7 Then
     Private Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As Long
     Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As Long
     Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As LongPtr, ByVal dwBytes As LongPtr) As Long
     Private Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
     Private Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As LongPtr) As Long
     Private Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
     Private Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
     Private Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As LongPtr, ByVal hMem As LongPtr) As Long
     Private Declare PtrSafe Function GetClipboardData Lib "User32" (ByVal wFormat As Long) As Long
    #Else
     Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
     Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
     Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
     Private Declare Function CloseClipboard Lib "User32" () As Long
     Private Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
     Private Declare Function EmptyClipboard Lib "User32" () As Long
     Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
     Private Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
     Private Declare Function GetClipboardData Lib "User32" (ByVal wFormat As Long) As Long
    #End If
    Private Const GHND = &H42
    Private Const CF_TEXT = 1
    Private Const MAXSIZE = 4096
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub TEST()
    
    Dim txt As String
    ActiveSheet.Range("A4:F60").Copy
    txt = ClipBoard_GetData
    txt = Replace(txt, vbTab, " ")
      Filename = "C:\zzz\" & Range("B4").Value & ".prg"
        Set fso = CreateObject("Scripting.FileSystemObject")
            Set NewFichier = fso.OpenTextFile(Filename, 2, True)
            NewFichier.Write txt
            NewFichier.Close
            Set NewFichier = Nothing
        Set fso = Nothing
    End Sub
    Function ClipBoard_GetData() As String
       Dim hClipMemory As Long
       Dim lpClipMemory As Long
       Dim MyString As String
       Dim RetVal As Long
     
       If OpenClipboard(0&) = 0 Then
          MsgBox "Cannot open Clipboard. Another app. may have it open"
          Exit Function
       End If
     
       ' Obtain the handle to the global memory
       ' block that is referencing the text.
       hClipMemory = GetClipboardData(CF_TEXT)
       If IsNull(hClipMemory) Then
          MsgBox "Could not allocate memory"
          GoTo OutOfHere
       End If
     
       ' Lock Clipboard memory so we can reference
       ' the actual data string.
       lpClipMemory = GlobalLock(hClipMemory)
     
       If Not IsNull(lpClipMemory) Then
          MyString = Space$(MAXSIZE)
          RetVal = lstrcpy(MyString, lpClipMemory)
          RetVal = GlobalUnlock(hClipMemory)
     
          ' Peel off the null terminating character.
          MyString = Mid(MyString, 1, InStr(1, MyString, Chr$(0), 0) - 1)
       Else
          MsgBox "Could not lock memory to copy string from."
       End If
     
    OutOfHere:
     
       RetVal = CloseClipboard()
       ClipBoard_GetData = MyString
     
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Macro VBA pour Enregistrer sous et ecraser automatiquement fichier existant
    Par lovlov33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/02/2015, 16h51
  2. [AC-2010] Erreur sur Code VBA pour enregistrement d'un document publiposté word
    Par AudREN dans le forum VBA Access
    Réponses: 3
    Dernier message: 25/09/2014, 13h22
  3. code VBA pour enregistrement
    Par tunisien13 dans le forum VBA Access
    Réponses: 1
    Dernier message: 31/03/2012, 02h56
  4. code VBA pour "enregistrer sous"
    Par cyr78 dans le forum VBA Word
    Réponses: 5
    Dernier message: 05/11/2010, 13h32
  5. [VBA-E] Problème pour enregistrer en csv (; et non ,) par macro
    Par bounette dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/12/2005, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo