7
votes

Le code VBA ne regarde pas via des lignes cachées pour ajouter une ligne avec numéro de suivi

J'ai une autre question que j'espère résoudre avec votre aide.

Que veux-je faire? J'utilise Excel pour suivre mon travail, mes activités, mes contacts, et cetera. En faisant que j'ai trouvé que je faisais beaucoup de travail répétitif dans l'ajout de lignes à la fin d'une feuille appelée «Activités».

Ce que je veux faire, c'est ceci: - Appuyez sur un bouton et ajoutez une ligne. - Augmentez le numéro de suivi avec 1 - Insérez des valeurs par défaut

le code. Pour automatiser cela, j'ai trouvé (copier, collé, ajusté à mes besoins) le code suivant: xxx

le problème. Dans cette feuille, j'ouvre de nouveaux articles, mais je les ferme aussi. Je le fais en changeant leur statut et en les cache de la vue. Et c'est le point où cela va mal. Lorsque je ferme le dernier article sur la liste et souhaitez ajouter une nouvelle ligne, la macro ajoute une nouvelle ligne sous la dernière entrée de la dernière . Il ne trouve pas la dernière entrée que je viens de cacher. Et aussi, lorsque cela se produit, l'ajout des valeurs par défaut à la nouvelle ligne ne fonctionne pas. Il les ajoute à la rangée au-dessus de l'ajout.

En quelque sorte cela fait un sens parfait. Je dis à la macro de chercher la dernière entrée, mais ce que je ne comprends pas, c'est pourquoi il regarde la dernière entrée visible et pourquoi il ne regarde pas dans les rangées cachées.

à reproduire. Copiez le code dans une feuille (vous devez peut-être modifier le nom de la feuille) et ajouter quelques lignes. Mettez des informations dans la dernière rangée et cachez-la. Ajoutez quelques autres lignes et voyez ce qui se passe.

la solution. y a-t-il un moyen de résoudre ce problème? Peut-être qu'il y a une façon plus intelligente de faire des choses? J'ai regardé dans des choses, mais surtout j'ai eu des résultats en utilisant "(" A "& lignes.count) .end (XLUP)". Une boucle pourrait fonctionner, mais je crains que 1) il ne recherche pas à travers des rangées cachées et 2), il fait la feuille (un peu). Je dois dire que j'ai essayé de faire une boucle, je veux d'abord voir si ma première solution est récupérable.

Merci pour votre contribution, s'il y a des questions s'il vous plaît faites le moi savoir.

simon EDIT: Code de travail pour toute personne intéressée xxx


2 commentaires

Je vais utiliser votre question comme exemple de la façon de poser une question.


Peut-être MSDN - spécialcells pourrait aider. Notamment xlcelltypelaastcell


4 Réponses :


1
votes

dire que nous avons une colonne d'état AB et nous fermons actuellement un élément en plaçant le mot "fermé" dans cette colonne, puis cachez la ligne.

à la place:

  1. Afficher toutes les lignes
  2. Effectuez les inserts et les modifications requises
  3. via une boucle, cachez toutes les lignes marquées "fermées"

1 commentaires

Merci pour votre commentaire Gary's Student. Je peux voir comment cela peut fonctionner sur ma feuille. Mais je dois demander, d'exécuter ces actions à chaque fois que j'ajoute une ligne, cela va-t-il ralentir ma feuille beaucoup?



0
votes

Utilisez ceci pour obtenir la dernière ligne et il verra la dernière ligne, même si elle est cachée.

LastRow = wsActiviteiten.UsedRange.Rows.Count


5 commentaires

L'inversedrange ne commence pas nécessairement dans la ligne 1. Ceci n'est pas fiable.


Lorsque j'essaie avec l'exemple que l'OP a suggéré que nous utilisions, cela fonctionne. Alors en fonction de cela ... il semble fonctionner très bien. o.o


Je comprends que cela peut être peu fiable, mais dans cette macro spécifique, à ce point spécifique, je pense que cela peut fonctionner. Merci pour votre réponse Rodger.


Ajouter à mon commentaire précédent. J'ai testé cela et cela fait ce qu'il dit.


Cela peut fonctionner pour le cas tel que testé, mais utilisé n'est pas fiable comme Excel régulièrement "oublie" la plage réelle et les lignes de la présente manière suppose qu'il existe des données à partir de la ligne1.



2
votes

update em>

Je vois que votre feuille a une autofiltre "masquant" les lignes d'état - quel trouver code> ne détecte pas, contrairement aux lignes cachées. p>

Vous suggère d'essayer ce code mis à jour ci-dessous: p> xxx pré>

message initial em> p>

Si vous cachez Les lignes alors vous pouvez utiliser trouver code> avec l'option xlformulas code> pour rechercher des entrées dans des lignes cachées (contrairement à xlvalues ​​ code>). P>

Dim rng1 As Range
Set rng1 = Columns("A:A").Find("*", [a1], xlFormulas, , xlByRows, xlPrevious)
MsgBox rng1.Address


8 commentaires

J'essaie d'utiliser ce code spécifique dans un module séparé sur ma feuille. Lorsque je cache une ligne, cette macro s'allume avec l'emplacement de la prochaine valeur, mais pas le caché. Lors de la lecture sur XLformulas, il devrait augmenter une valeur d'un emplacement caché. Y a-t-il quelque chose qui me manque ici?


@simon êtes-vous capable de télécharger un exemplaire de classeur (sur le nuage, etc.)?


Bien sûr, vous allez ici: we.tl/smyhlfdm49. J'ai déjà ajouté votre code à la feuille déjà. (C'est le deuxième lien, l'autre n'était pas bon).


@simon pls Essayez ce code mis à jour. Le fichier était utile :)


Merci pour le code de travail. C'est des choses que je n'ai pas utilisées auparavant, alors je vais voir si je peux comprendre ce qui se passe et comment je peux l'utiliser dans mon code. Je vais faire un voyage dans quelques jours, si je n'ai pas répondu à ce moment-là, je vais répondre quand je viendrai. J'apprécie que vous prenez le temps de m'aider et je crois que ce n'est que juste que je vous réponds lorsque j'ai craqué cette noix. Pour l'instant, je ne vais pas la marquer comme répondu, car j'ai besoin de comprendre et d'appliquer ceci en premier. Bravo, Simon


Ça marche! Avec une aide locale, j'ai réussi à le faire fonctionner dans ma feuille. Pouvez-vous expliquer ce que le code fait? Nous ne pourrions pas le comprendre complètement. Pour autant que je sache, c'est que la scission localise la ligne vide sous une plage de données. Quelle gamme (1) signifie que nous n'avons pas pu le savoir. Il existe d'autres éléments qui vont au-delà de mes compétences en VBA, mais je suis assez certain que le temps sera clair. De plus, sur une autre feuille, j'ai essayé d'utiliser le code, mais celui-ci a une formule dans les cellules de la formule et que cette méthode voit des formules et se rend à la ligne suivante à coller. Mais c'est une autre question pour plus tard.cheers, Simon


@simon Cette ligne renvoie la plage de l'autofilter activesheet.autofilter.range.address . La scission brise la plage, puis renvoie la deuxième partie (c.-à-d. C10 si la plage était C1: C10). Split (ActiveHeet.Autofilter.Range.Address, ":") (0)) retournerait la première partie C1. La gamme fait ensuite une adresse à cet égard.


Pouvez-vous m'aider avec une autre question qui est liée à celle-ci? Cela m'aiderait beaucoup, acclamations. Stackoverflow.com/questions/39120212/...



0
votes

Je viens de trouver une solution:

Si vous avez au moins une colonne de votre gamme avec des données «cohérentes» (toutes les cellules de cette colonne ne sont pas vides / vides), vous pouvez utiliser Formula Counta et vous pouvez vous référer code à valeur de cette formule de comptage. p>

par exemple: p>

insérer formule '= comptage (A1: A100000)' dans la cellule 'B1'. P>

B1 Vous obtiendrez combien de lignes que vous avez elles sont cachées ou non. P>

dans votre code change: p> xxx pré>

à p>

wsActiviteiten.Range("A" & Range("B1").Value).Offset(1, 0).PasteSpecial (xlPasteAll)


0 commentaires