Colonne excel filtrée vers un bloc note
galerien
-
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
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:
- Code chiffre en lettre excel bloc note
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Excel trier par ordre croissant chiffre - Guide
- Code ascii - Guide
- Chiffre en lettre - Télécharger - Outils professionnels
- Bloc note gratuit - Télécharger - Traitement de texte
2 réponses
Bonjour,
Exemple 1 :
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 :
Cdt
Lupin
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
re:
J'ai effectivement fait une erreur dans le second code :
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 :
Cdt
Lupin
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
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.
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.
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