[VBA]Dernière colonne non-vide classeur fermé
Résolu/Fermé
Foreverson
Messages postés
231
Date d'inscription
vendredi 3 octobre 2008
Statut
Membre
Dernière intervention
22 juin 2014
-
28 avril 2012 à 16:45
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 30 avril 2012 à 15:42
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 30 avril 2012 à 15:42
A voir également:
- Vba dernière colonne non vide
- Dernière version ccleaner gratuit français - Télécharger - Nettoyage
- Déplacer une colonne excel - Guide
- Formule somme excel colonne - Guide
- Triez la liste comme sur cette illustration (attention, on ne voit que le début …). quel est le mot formé par les 6 dernières lettres de la colonne code ? - Forum Excel
- Trier colonne excel - Guide
6 réponses
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 778
28 avril 2012 à 18:31
28 avril 2012 à 18:31
Peut-être :
Sub DernèreColonneFichierFermé() Dim NomFichier As String Dim Chemin As String Dim Formule As String Dim col As Integer Dim col_non_vide As Integer Range("A1").ClearContents Chemin = "D:\Temp\" NomFichier = "Classeur_à_lire.xls" For col_non_vide = Columns.Count To 3 Step -1 Formule = "='" & Chemin & "[" & NomFichier & "]Feuil1" & "'!" & "R1C" & col_non_vide Range("A1").FormulaR1C1 = Formule Range("A1").Value = Range("A1").Value If Range("A1").Value <> 0 Then Exit For Next col_non_vide MsgBox col_non_vide End Sub
Foreverson
Messages postés
231
Date d'inscription
vendredi 3 octobre 2008
Statut
Membre
Dernière intervention
22 juin 2014
27
29 avril 2012 à 11:51
29 avril 2012 à 11:51
Bonjour, merci de ta réponse.
Cela fonctionne !
J'aimerais comprendre toutes les étapes, peux-tu me dire si je suis dans le vrai :
La boucle part de la dernière colonne du fichier, pour atteindre la 3ième par pas de -1.
En A1, on met un lien vers le classeur fermé, pointant la 1ère ligne et la colonne de la boucle. On fait une sorte de copier/Coller Valeur. Si cette valeur est différente de 0, on sort de la boucle.
C'est à peu près ça ? Plutôt que "différente de 0", n'existerait-il pas une sorte de fonction non(estVide()) ?
En tout cas, merci beaucoup de ton aide !
Cela fonctionne !
J'aimerais comprendre toutes les étapes, peux-tu me dire si je suis dans le vrai :
La boucle part de la dernière colonne du fichier, pour atteindre la 3ième par pas de -1.
En A1, on met un lien vers le classeur fermé, pointant la 1ère ligne et la colonne de la boucle. On fait une sorte de copier/Coller Valeur. Si cette valeur est différente de 0, on sort de la boucle.
C'est à peu près ça ? Plutôt que "différente de 0", n'existerait-il pas une sorte de fonction non(estVide()) ?
En tout cas, merci beaucoup de ton aide !
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 778
30 avril 2012 à 08:54
30 avril 2012 à 08:54
C'est exactement cela.
Le différent de 0 vient du fait que le résultat d'une simple formule de recopie de cellule vide (ex. =A1) est zéro (et donc pas vide).
@michel_m,
Plutôt que de passer par le registre, ne serait-il pas plus simple d'écrire directement dans le classeur (fermé) contenant la macro ?
Mais dans les deux cas il faut ouvrir le fichier d'origine pour enregistrer l'info.
Cordialement
Patrice
Le différent de 0 vient du fait que le résultat d'une simple formule de recopie de cellule vide (ex. =A1) est zéro (et donc pas vide).
@michel_m,
Plutôt que de passer par le registre, ne serait-il pas plus simple d'écrire directement dans le classeur (fermé) contenant la macro ?
Mais dans les deux cas il faut ouvrir le fichier d'origine pour enregistrer l'info.
Cordialement
Patrice
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 309
30 avril 2012 à 09:30
30 avril 2012 à 09:30
Bonjour,
non, je ne pense pas....
le nbre de colonnes (col) sera inscrite automatiquement dans HKCU dès que l'on utilisera "titi" et on on l'utilisera au moins une fois puisque c'est un fichier source (voire pour installer la macro!)
Après "titi" pourra rester fermé en quelque sorte définitivement; si il est nécessaire -évolution ou maintenance de l'appli, par ex - d'ajouter 1 ou plusieurs colonnes celles ci seront prises en compte dès la fermeture de titi; (on pourrait la prendre en compte en temps réel par une événementielle worksheet_change sur la ligne 1, "titi" pouvant alors resté ouvert ou fermé sans incidence sur le travail dans "toto")
D'autre part, si pour une raison x ou y, on décide de déplacer dans un autre répertoire titi cela n'aura aucune incidence dans l'appel de la valeur dans le registre -je n'ai pas testé sur un changement de lecteur dans le pc
dans toto, j'ai mis l'appel dans un module mais la macro xxx pourrait être installée comme événementielle
C'est ce qui m'a paru le + simple et le + souple comme fonctionnement
Titi restant fermé:
on aurait pu aussi utiliser ADO ou ADOX (solution 1) avec une requête comptant le nbre de champ en ligne 1 -fields.count - mais cela demande beaucoup de renseignements sur la source, ADO et ADOX ayant des limites très strictes pour son utilisation et pas forcément évidente à assimiler pour quelqu'un qui débute comme Foreverson (on a tous débuté!)
Une autre solution assez élégante aurait consisté à mettre dans une cellule de titi le nombre de colonnes et d'appeler dans "toto" par une macro dite du grand manitou US Walkenbach;
Cordialement
non, je ne pense pas....
le nbre de colonnes (col) sera inscrite automatiquement dans HKCU dès que l'on utilisera "titi" et on on l'utilisera au moins une fois puisque c'est un fichier source (voire pour installer la macro!)
Après "titi" pourra rester fermé en quelque sorte définitivement; si il est nécessaire -évolution ou maintenance de l'appli, par ex - d'ajouter 1 ou plusieurs colonnes celles ci seront prises en compte dès la fermeture de titi; (on pourrait la prendre en compte en temps réel par une événementielle worksheet_change sur la ligne 1, "titi" pouvant alors resté ouvert ou fermé sans incidence sur le travail dans "toto")
D'autre part, si pour une raison x ou y, on décide de déplacer dans un autre répertoire titi cela n'aura aucune incidence dans l'appel de la valeur dans le registre -je n'ai pas testé sur un changement de lecteur dans le pc
dans toto, j'ai mis l'appel dans un module mais la macro xxx pourrait être installée comme événementielle
C'est ce qui m'a paru le + simple et le + souple comme fonctionnement
Titi restant fermé:
on aurait pu aussi utiliser ADO ou ADOX (solution 1) avec une requête comptant le nbre de champ en ligne 1 -fields.count - mais cela demande beaucoup de renseignements sur la source, ADO et ADOX ayant des limites très strictes pour son utilisation et pas forcément évidente à assimiler pour quelqu'un qui débute comme Foreverson (on a tous débuté!)
Une autre solution assez élégante aurait consisté à mettre dans une cellule de titi le nombre de colonnes et d'appeler dans "toto" par une macro dite du grand manitou US Walkenbach;
chemin= "D:\........" dercol= ExecuteExcel4Macro("'" & chemin & "\[titi.xls]Feuil1'!R1C26")
Cordialement
Patrice33740
Messages postés
8556
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
2 mars 2023
1 778
30 avril 2012 à 15:09
30 avril 2012 à 15:09
Il se pourrait aussi, comme je l'ai supposé, que le fichier soit actualisé régulièrement par un autre utilisateur sur une autre machine et que Foreverson ne souhaite ni l'ouvrir ni le modifier.
Cordialement
Cordialement
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 309
30 avril 2012 à 15:42
30 avril 2012 à 15:42
Re
foreverson avait écrit en #4
C'est une application pour mon ordi, pas de réseau, pas de serveur.
...
foreverson avait écrit en #4
C'est une application pour mon ordi, pas de réseau, pas de serveur.
...
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 309
29 avril 2012 à 12:36
29 avril 2012 à 12:36
bonjour,
Peut-^tre 1ou 2 solutions,Mais:
nom de la feuille concernée dans titi ?
soluTion1
1/ s'agit -il d'une base de données dans titi avec les titres en ligne 1 et 1)champ en colonne A
3/ sino, Il y a t il des cellules vides entre la dernière colonne utilisée et la colonne A?
solution 2
1/ ton appli est elle en monoposte ?
2/ sinon as tu les droits d'accès au serveur (ou faisant office de )
Dans l'attente
Peut-^tre 1ou 2 solutions,Mais:
nom de la feuille concernée dans titi ?
soluTion1
1/ s'agit -il d'une base de données dans titi avec les titres en ligne 1 et 1)champ en colonne A
3/ sino, Il y a t il des cellules vides entre la dernière colonne utilisée et la colonne A?
solution 2
1/ ton appli est elle en monoposte ?
2/ sinon as tu les droits d'accès au serveur (ou faisant office de )
Dans l'attente
Foreverson
Messages postés
231
Date d'inscription
vendredi 3 octobre 2008
Statut
Membre
Dernière intervention
22 juin 2014
27
29 avril 2012 à 13:20
29 avril 2012 à 13:20
La feuille dans titi s'appelle effectif. Lignes de titres sur la 1ère ligne, champ des colonnes en A, B et C.
A priori, pas de cellules vides entre la dernière colonne utilisée et la colonne A. Du coup, plutôt que de partir de la fin, je pense que partir de la 1ère colonne pour chercher la dernière colonne non vide permettrait de gagner quelques micro-secondes.
C'est une application pour mon ordi, pas de réseau, pas de serveur.
A priori, pas de cellules vides entre la dernière colonne utilisée et la colonne A. Du coup, plutôt que de partir de la fin, je pense que partir de la 1ère colonne pour chercher la dernière colonne non vide permettrait de gagner quelques micro-secondes.
C'est une application pour mon ordi, pas de réseau, pas de serveur.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 309
Modifié par michel_m le 29/04/2012 à 15:07
Modifié par michel_m le 29/04/2012 à 15:07
Re,
Solution 2
dans module1 de ton classeur "titi", on prend en compte la dernière colonne à chaque utilisation de titi (modif, ajout...)
Dans le module "Thisworkbook" dans titi ( si tu ne connais pas: Alt+F11 , ctrl+R pour faire apparaitre l'explorateur de projet, thisworkbook)
col est alors dans la base de registre windows, tu peux éteindre l'ordi, laisser "titi" fermé voire le transporter dans un autre dossier
Dans ton classeur "toto"
Tu peux choisir le noms que tu veux pour appname, section, et Key
Michel
Solution 2
dans module1 de ton classeur "titi", on prend en compte la dernière colonne à chaque utilisation de titi (modif, ajout...)
Dans le module "Thisworkbook" dans titi ( si tu ne connais pas: Alt+F11 , ctrl+R pour faire apparaitre l'explorateur de projet, thisworkbook)
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim col As Byte col = Sheets("effectif").Range("IV1").End(xlToLeft).Column 'écriture dans HKey_current_user/software / VB and VBA Program settings SaveSetting appname:="ccm", section:="truc", Key:="machin", setting:=col End Sub
col est alors dans la base de registre windows, tu peux éteindre l'ordi, laisser "titi" fermé voire le transporter dans un autre dossier
Dans ton classeur "toto"
Sub xxxxx() Dim dercol_titi As Byte 'Lit la valeur dans la base de registre dercol_titi = GetSetting(appname:="ccm", section:="truc", Key:="machin") End Sub Sub nettoyer() Sub EffacedansRegistre() On Error Resume Next DeleteSetting "ccm" End Sub End Sub
Tu peux choisir le noms que tu veux pour appname, section, et Key
Michel
Foreverson
Messages postés
231
Date d'inscription
vendredi 3 octobre 2008
Statut
Membre
Dernière intervention
22 juin 2014
27
29 avril 2012 à 15:35
29 avril 2012 à 15:35
Ok, merci à tous les deux pour votre aide !