Problème de "/" dans un teste
Bonjour à tous
Voici mon problème avec un "/"
Dans une colonne je cherche la cellule contenant le texte "machin chouette" dans ce cas, avec le code vba, la cellule contenant le texte est trouvée.
Mais si le texte est "machin/chouette" , la cellule est ignorée.
Est-il possible de solutionner par le code ce problème?
Voici le code que j'utilise :
Sub essai()
Do
If ActiveCell() <> "machin/chouette" Then
ActiveCell.Offset(1, 0).Range("a1").Select
ligne = ligne + 1
Else
Selection.Copy
ActiveCell.Offset(0, -col + 1).Range("a1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.Offset(0, col - 1).Range("a1").Select
Exit Do
End If
If ligne > 200 Then
Exit Do
End If
Loop
End Sub
J'ai bien essayer par concaténation de "machin" & "/" & "chouette", cela renvoie dans une MsgBox : "/chouette", le mot "machin" est ignoré
J'ai aussi essayé de chercher seulement le mot "machin" seul pour sélectionner la bonne cellule mais là je n'arrive pas à trouver comment faire.
paterbleutch
bonjour
as tu tenté un truc avec or
cordialement
Sub essai()
For i = 0 To 200
With ActiveCell.Offset(i)
If InStr(1, .Value, "machin", 1) > 0 And InStr(1, .Value, "chouette", 1) > 0 Then 'contient les 2
.Copy
With .Offset(0, 1 - .Column)
Application.Goto .Cells(1)
.PasteSpecial xlValues
End With
Exit For
End If
End With
Next
End Subpour chercher les 2 dans la même cellule, on peut ajouter des conditions supplémentaires si nécessaire.
Bonjour à tous,
Ou plus simplement
If Not ActiveCell Like "machin*chouette" ThenA+
bonsoir, tulipe_4, SsALv, JExceL2fr, merci pour vos réponses respectives.
tulipe_4 :
je ne vois pas très bien comment utiliser le or? Pouvez-vous préciser. Merci
BsAlv
InStr c'est une commande nouvelle pour moi qui suis un bleu dans VBA
J'ai essayé votre code, cela fonctionne parfaitement. J'ai aussi chercher le fonctionnement de la commande InStr; elle renvoi la position du premier caractère de la chaine. mais je ne comprends pas exactement la signification de l'ensemble des 4 éléments entre parenthèse ,InStr(1, .Value, "machin*chouette", 1) . Pouvez-vous m'en dire plus. Merci
JExceL2fr :
Effectivement cela parait plus simple. Mais à la fin de la frappe de la ligne que vous avais écrite une alerte apparait: Erreur de compilation, Attendu :Goto ou then.
J'ai fait un copier coller pour éviter toute erreur. que faire? Merci
Bonjour à tous,
Pour les arguments de la fonction InStr, regarder la doc Fonction InStr (Visual Basic pour Applications) | Microsoft Learn.
Personnellement j'aime bien la fonction Like, puisque vous parlez de chercher "le texte contenant machin truc", on devrait partir du principe que "BLABLA machin-truc XXXYYZ" renvoie vrai (ce que fait @BsAlv), mais dans ce cas la proposition de @JExceL2Fr s'adapterait comme ceci :
If ActiveCell.Value Like "*machin?chouette*" Then
"*machin?chouette*" : Pour n'avoir que 1 caractère entre "machin" et "chouette"
"*machin*chouette*" : Pour trouver les cellules contenant les mots "machin" et "chouette", dans l'ordre mais pas nécessairement cotes-à-cotes (ex: "machin BLABLA chouette").
Donc dans le code de @BsAlv
Sub essai()
For i = 0 To 200
With ActiveCell.Offset(i)
If ActiveCell.Value Like "*machin?chouette*" Then 'contient les 2 dans l'ordre
.Copy
With .Offset(0, 1 - .Column)
Application.Goto .Cells(1)
.PasteSpecial xlValues
End With
Exit For
End If
End With
Next
End SubIl y a 2 différences entre la proposition de @BsAlv et celle-ci :
- @BsAlv vérifie la présence des 2 mots clés, peu importe l'ordre (ex : "chouette BALBA machin"), là où Like impose l'ordre.
- @BsAlv utilise la comparaison textuelle (donc sans casse, càd que "MaChiN chOUeTTe" marche), l'opérateur Like lui dépend de Option Compare, qui par défaut est sur la comparaison stricte ("M" ≠ "m"), mais c'est paramétrable.
A vous donc de choisir la solution qui vous convient le mieux.
Bonjour, saoh12617.
merci pour votre réponse.
J'ai rajouté à vos ligne de code, après Next le code suivant:
ActiveCell.Offset(-2, 0).Range("a1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
cela ne fonctionne pas et je ne comprend pas pourquoi.
Si j'ai la réponse cela me perpétra d'avancer dans mon activité.
Cependant je vais me relancer dans l’étude de vba excel pour éviter de poser des questions trop simples
Hélas je me rend compte qu'au plus je lis les réponses au plus je ne sais rien d'excel vba
Il n'y a aucun mal. On a tous débuté, ce sont des notions complexes au début. Mon explication est certainement trop technique.
Pouvez-vous joindre un fichier de ce que vous voulez faire et exprimer simplement à l'écrit la procédure que vous voulez suivre ? Je pense que ce sera plus simple. On pourra commenter le code pour aider la compréhension.
Bonjour saboh12617,
Merci pour votre réponse.
Explication sur mon travail.
Au départ j’ai des PDF dotés d’un grand tableau avec en colonne : des dates, du texte, et des chiffres.
Je transforme avec Excel ce PDF en tableau Excel. Pour les dates et les chiffres pas de souci cela va très bien ils sont alignés avec la première ligne de texte résultante. Mais, dans le PDF, le texte est parfois trop long pour la colonne, il va plusieurs fois à la ligne ; Excel renvoi par un nombre de lignes supplémentaires différentes suivant la longueur du texte ainsi que des colonnes de texte supplémentaires.
Mon tableau Excel se retrouve, suivant la période, avec un nombre de colonnes de texte différentes dont deux colonnes texte principales (CA et CB). Le textes des PDF suivant la période sont répétitifs. Je dois ne faire qu’une seule colonne de texte et qu’une seule ligne par date.
Pour les colonnes secondaires il est facile de déplacer les textes, qui sont toujours courts et importants, dans la bonne colonne. Pour les colonnes CA et CB,
je dois déplacer le texte utile vers CA et supprimer les lignes complémentaires du fait de la longueur du texte original du PDF.
C’est là l’objet de ma demande, trouver les mots significatifs sachant qu’il y a des « / » qui me pose des problèmes (que vous avez résolus) ; A la suite du code que vous m’avez proposé je ne peux plus sélectionner, en relatif, la cellule où je dois déplacer le texte sélectionné. Je ne comprends pas pourquoi.
Voila ci-dessous votre code suivi de du mien qui ne fonctionne pas.
Sub essai()
Dim col As Integer
col = 3
Range("u19").Select
For i = 0 To 200
With ActiveCell.Offset(i)
If InStr(1, .Value, "machin", 1) > 0 And InStr(1, .Value, "chouette", 1) > 0 Then 'contient les 2
.Copy
With .Offset(0, 1 - .Column)
Application.Goto .Cells(1)
.PasteSpecial xlValues
End With
Exit For
End If
End With
Next
ActiveCell.Offset(-col, 0).Range("a1").Select ‘ ne fonctionne pas ??????
ActiveSheet.Paste
Application.CutCopyMode = False
Si je remplace {Activcell.offset(-col, ,0).Range(" A1 ").select} par Range("S14")
Si je met à la place de Activcell.offset........... le code Range("A1") cela fonctionne mais cela ne convient pas puisque le nbre et la ligne changent je dois être en relatif
re bonour,
J'ai fait une erreur d'inattention dans la code que j'ai écrit : ActiveCell.Offset(-col, 0).Range("a1").Select ‘ ne fonctionne pas ??????
j'aurai du écrire ActiveCell.Offset(0,-col).Range("a1").Select ‘ ne fonctionne pas ?????? et cela ne fonctionne toujours pas
il faut éviter ces "select" et "activate" parce que cela ne sert à rien
Sub Essai()
With Range("U19") 'debut ici, sans select
For i = 0 To 200
With .Offset(i) 'cellule décalée
If InStr(1, .Value, "machin", 1) > 0 And InStr(1, .Value, "chouette", 1) > 0 Then 'contient les 2
.Copy
With .Offset(0, 1 - .Column) 'même ligne, colonne 1 (A)
Application.Goto .Cells(1)
.PasteSpecial xlValues
End With
Exit For
End If
End With
Next
End With
End Subbonjour BsAlv.
Ce code fonctionne bien, dans la feuille excel la cellule sélectionnée est prête à être collée sur un autre cellule. A la suite de ce code je rajoute :
Active.cell.Offset(0, -2).Range("a1").Select
cette ligne me renvoie le code erreur 424. Il manque quelque chose puisque ce type de code fonctionne par ailleurs.
Dans ce code que vous m'avez envoyé, je ne comprends pas tout ou mal
.Offset(i) : je suppose que cela décale vers le bas, de la valeur de i, par rapport à la cellule de départ, dans notre cas "U19"
comment vba sait qu'il faut décaler d'une ligne et pas d'une colonne ?
.Offset(0, 1 - .Column) : ce n'est vraiment pas clair pour moi
re,
Select n'est pas très pratique, on peut copier&coller sans sélectionner et cela est plus rapide. On voit plusieurs With ...End With-constructions dans ma macro et avant range ou cells ou ... un point. Ce point crée une relation avec le dernier With, comme ça, écrire une macro est moins fatiguant et plus lisible.
Exemple ".copy" dans ma macro, le précédent With est le "With .offset(i)" et pour celui -là le précédent est "Range("U19"), donc on peut imaginer que ce ".copy" signifie la même chose que range("U19").offset(i).copy
Donc oubliez votre question de "select" et utilisez les vraies cellules au lieu de l'activecell
BsAlv, merci pour votre réponse.
vos explications sont claires et effectivement elles simplifient
saboh12617, JExceL2fr, BsAlv, un grand merci pour votre aide, vos réponses m'ont été utiles