Colonne excel filtrée vers un bloc note

galerien -  
 galerien -
Bonjour,

Je suis actuellement en train de travailler sur un fichier excel et je découvre doucement VBA.

J'ai un fichier excel à plus de mille lignes en entrée et en colonne j'ai des appareils pour lesquels j'associe une ligne précise en marquant la ligne d'une croix.

Mon but est d'extraire une colonne précise de mon tableau dans un fichier bloc note. Je commence à comprendre comment écrire cette colonne dans mon bloc note sous VBA mais j'aimerai ajouter un compteur qui permette de s'arréter au bon endroit une fois les cellules filtrées.

Pour exemple mon mini programme ressemble pour le moment à ça :

Sub test()
Open "C:\...\essai.txt" For Output As #1
For i = 3 To 2000
Print #1, Cells(i, 21).Value
Next i
Close #1


End Sub


Mon but est de transformer mon 2000 en une expression du type :
i = 3 to (si colonne A filtrée compter nombre de ligne non vide appartenant à la colonne 21 et me resortir le nombre pour avoir la fin de mon compteur)
puis imprimer cellules

Après avoir parcouru plein de forum je ne trouve pas de réponse c'est pourquoi je me tourne vers vous. J'éspère être assez clair si besoin est je peux précisez d'avantage.
Merci de votre aide

A voir également:

2 réponses

Utilisateur anonyme
 
Bonjour,

Exemple 1 :

Sub test()

    Dim Limite As Long

    Open "C:\...\essai.txt" For Output As #1

    Limite = Range("U65536").End(xlUp).Row

    For i = 3 To Limite
        Print #1, Cells(i, 21).Value
    Next i
    
    Close #1

End Sub
'


Et si vous préféré ne pas avoir le résultat en sortie
avec les lignes du fichier essai.txt entre guillemets,
voici une autre méthode :


Const ctePourLecture = 1
Const ctePourEcrire = 2
Const ctePourAjouter = 8
Const cteRapport = "Essai.txt"

Sub Ecrire()

    Dim Limite As Long

    Dim objFSO As Object, objFichier As Object
    Dim varNomFic As String
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    ' Localisation du fichier à écrire
    varNomFic = WScript.ScriptFullName
    varNomFic = Left(varNomFic, InStrRev(varNomFic, "\"))
    varNomFic = varNomFic & cteRapport
    
    ' Valide si fichier existe
    If (objFSO.FileExists(varNomFic)) Then
        Set objFichier = objFSO.OpenTextFile(varNomFic, ctePourAjouter)
    Else
        Set objFichier = objFSO.CreateTextFile(varNomFic, ctePourEcrire)
    End If
    
    Limite = Range("U65536").End(xlUp).Row
    
    ' Écrire dans fichier
    For i = 3 To Limite
        objFichier.WriteLine Cells(i, 21).Value
    Next i
    
    objFichier.Close
    
    Set objFichier = Nothing
    Set objFSO = Nothing

End Sub
'


Cdt

Lupin
0
galerien
 
Bonjour,

Merci pour ces réponses.
J'ai pu tester vos programmes le premier m'est d'ailleurs plus facile a comprendre mais je tiens tout de meme a bien comprendre les deux.

Concernant le premier programme la commande Range("U65536").End(xlUp).Row est bien et permet de détecter la derniere ligne rempli d'une colonne et me retourner le numéro si j'ai bien compris. C'est juste ce que je voulais. Mais un nouveau probleme ce présente à moi. Le marquage que je fais et qui me permette de choisir les valeurs a prendre dans la colonne U sont en colonne N,O,P et ne sont pas rangé dans l'ordre (Il s'enchaine des croix et des cases vides dans ces dernieres) Mon nouveau probleme est donc que ma limite est bonne a chaque fois mais que tous les cases sont copier dans le bloc note et non seulement celle correspondant au cochage en colonne N,O,P en fonction du filtrage. J'ai essayé d'ajouter des conditions en fonction du filtrage pour prendre que les lignes cochés dans le bloc note mais je suis denouveau bloqué. je redemande donc un peu d'aide pour savoir si il est possible de rajouter des conditions.

Pour le deuxieme programme j'ai une erreur 424 concernant la déclaration d'objet et ne comprend pas bien d'ou cela peu venir.

merci
0
Utilisateur anonyme
 
re:

J'ai effectivement fait une erreur dans le second code :

Option Explicit

Sub Ecrire()

    Dim Limite As Long

    Dim objFSO As Object, objFichier As Object
    Dim varNomFic As String
    
    ' Instancie un objet du système de fichier
    ' (objFSO -> objet File System Object)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    ' Localisation du fichier à écrire
    ' Prend le nom complet incluant le chemin d'accès du classeur
    varNomFic = ThisWorkbook.FullName
    ' Retire le nom du fichier Excel en conservant le chemin d'accès
    varNomFic = Left(varNomFic, InStrRev(varNomFic, "\"))
    ' Ajoute le nom du fichier de sortie
    varNomFic = varNomFic & cteRapport
    
    ' Valide si fichier existe
    If (objFSO.FileExists(varNomFic)) Then
        ' Si oui, ouvre le pour y ajouter du texte
        Set objFichier = objFSO.OpenTextFile(varNomFic, ctePourAjouter)
    Else
        ' Si non, crée le fichier et ouvre le pour y écrire
        Set objFichier = objFSO.CreateTextFile(varNomFic, ctePourEcrire)
    End If
    
    ' Défini la limite de lecture
    Limite = Range("U65536").End(xlUp).Row
    
    ' Écrire dans fichier
    For i = 3 To Limite
        ' Écrit les valeur dans le fichier
        objFichier.WriteLine Cells(i, 21).Value
    Next i
    
    ' Ferme le fichier
    objFichier.Close
    
    ' Libère les instance en mémoire
    Set objFichier = Nothing
    Set objFSO = Nothing

End Sub
'


Pour l'autre partie de votre problème, qui est en fonction
des colonnes N, O, P, il suffit de les tester dans la boucle :

(N, O, P, colonne 14, 15 et 16)

exemple type :

Sub test()

    Dim Limite As Long

    Open "C:\...\essai.txt" For Output As #1

    Limite = Range("U65536").End(xlUp).Row

    For i = 3 To Limite
        If (Cells(i, 14).Value = "x") Then
            Print #1, Cells(i, 21).Value
        ElseIf (Cells(i, 15).Value = "y") Then
            Print #1, Cells(i, 21).Value
        ElseIf (Cells(i, 16).Value = "z") Then
            Print #1, Cells(i, 21).Value
        End If
    Next i
    
    Close #1

End Sub
'


Cdt

Lupin
0
galerien
 
Tout d'abord merci.

Ensuite mon travail avance et ma connaissance en vba augmente mais je rencontre encore et toujours des problèmes.
Je pense que cela vient du fait que j'ai une croix x pour chaque colonne que je veux et j'ai aussi des lignes qui sont applicables a plusieurs appareil en colonne. J'aimerai donc pouvoir ajouter des instructions du type :

For i = 3 To Limite
If (Cells(i, 14).Value = "x") And ActiveSheet.Range("$A$3:$W$1150").AutoFilter Field:=14, Criteria1:="<>" Then
Print #1, Cells(i, 22).Value
ElseIf (Cells(i, 15).Value = "x") And ActiveSheet.Range("$A$3:$W$1150").AutoFilter Field:=15, Criteria1:="<>" Then
Print #1, Cells(i, 22).Value
ElseIf (Cells(i, 16).Value = "x") And ActiveSheet.Range("$A$3:$W$1150").AutoFilter Field:=16, Criteria1:="<>" Then
Print #1, Cells(i, 22).Value
End If
Next i

Close #1

le probleme est que la syntaxe est forcément pas bonne et que je n'arrive pas à remédier à mon problème encore une fois.
0