Signaler

Test sur un texte commençant par [Résolu]

Posez votre question Agi - Dernière réponse le 22 mai 2017 à 12:04 par agi
Bonjour,
je suis débutant et j'aimerais faire un code en vba qui consiste à :

exemple: si la colonne A contient un texte commençant par O5a-xxxx alors écrire dans la colonne B le chiffre 5.

Merci pour votre aide

Utile
+1
plus moins
Bonjour Agi,

Je te propose ce code VBA :


Option Explicit

Sub Essai()
  Application.ScreenUpdating = False
  Dim chn As String, dlig As Long, lig As Long
  dlig = Range("A" & Rows.Count).End(xlUp).Row
  For lig = 1 To dlig
    chn = Cells(lig, 1)
    If Len(chn) > 1 Then Cells(lig, 2) = Mid$(chn, 2, 1)
  Next lig
End Sub


Ça fera le travail en colonne B, pour A1 à la dernière donnée
de la colonne A, même s'il y a des cellules vides dans cette
colonne A ; cela grâce à dlig : dernière ligne.

Si ton problème est réglé, merci de l'indiquer,
pour que le sujet puisse être passé en résolu.

Cordialement.  :)


PS : Bonjour à Whismeril en passant.  ;)
 
Cette réponse vous a-t-elle aidé ?  
Utilisateur anonyme - 22 déc. 2016 à 14:00
Bonjour Help-Jason,
J'ai compris ceci : le texte qui est en A est « O5a-xxxx » ; donc il commence par
un code du genre « O5a » suivi de « -xxxx » ; et dans ce cas, mon code VBA
retourne bien le 2ème caractère : « 5 » ; c'est bien ce qu'il faut, je crois, non ?
Je suis ouvert à toute suggestion. Cordialement.  :)
Répondre
Help-Jason 1645Messages postés mardi 28 juin 2011Date d'inscription 21 octobre 2017 Dernière intervention - 22 déc. 2016 à 14:08
Il faut que la cellule de la colonne A contienne un texte, oui (donc Len(chn) > 1) mais aussi qu'il commence par O5a sinon ton programme fonctionne avec n'importe quelle chaîne de caractère non vide.
Répondre
Utilisateur anonyme - 22 déc. 2016 à 14:27
 
J'ai compris l'énoncé autrement : toutes les cellules (non vides) de la colonne A
contiennent un texte du style « O5a-xxxx », car l'énoncé précise bien que c'est
un exemple ; autre exemple que j'invente : « P8b-xxxx » ; cette fois, mon code
VBA retourne 8 car c'est le 2ème caractère.

Or tu penses que cette colonne A peut contenir n'importe quel texte, et qu'il
faut retourner le 2ème caractère seulement si ce texte commence par « O5a ».

Tu as peut-être raison ; il s'agit de la façon d'interpréter l'énoncé ; donc si
la réponse d'Agi va dans ton sens, je lui proposerai un autre code VBA.
 
Répondre
Whismeril 10165Messages postés mardi 11 mars 2003Date d'inscription ContributeurStatut 22 octobre 2017 Dernière intervention - 22 déc. 2016 à 14:36
J'ai compris comme Herp Jason, c'est pourquoi j'ai proposé l'opérateur like.

Mais à la réflection

exemple: si la colonne A contient un texte commençant par O5a-xxxx alors écrire dans la colonne B le chiffre 5.
Veut il dire que si les texte commence par O6a il faut écrie 6?
Si oui, il faut d'abord tester le pattern, like est approprié, puis décomposer avec mid left ou right. Ou alors une regex avec un groupement pour tester le pattern et extraire le chiffre d'un coup.
Répondre
Utilisateur anonyme - 22 déc. 2016 à 14:49
J'ai supposé que tous les textes de la colonne A sont normalisés, du style
« O5a-xxxx », « P8b-xxxx » ou « O6a-xxxx » ; si c'est bien le cas, inutile de
tester le pattern : il suffit de retourner le 2ème caractère (si non vide).
En attendant plus de précisions d'Agi, inutile de faire un autre code VBA.
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour

Regarde l'opérateur Like ou l'opérateur Left
Donnez votre avis
Utile
+0
plus moins
Merci Whismeril, je vais essayé avec ça !
Donnez votre avis
Utile
+0
plus moins
Bonjour albkan,

je te remercie pour ton code, il marche super bien
merci à toi aussi Whismeril

Cordialement
Donnez votre avis
Utile
+0
plus moins
Bonjour albkan,

je reviens vers toi à propos de ton code, est ce que il y a moyen de préciser pour qu'il ne fonctionne que dans le cas ou on la lettre "O" ( exemple O5a-xxxx) ou de la lettre "E" ( exemple E5a-xxxx) et pas le reste les lettres de l'alphabet.
Merci pour ton aide et bonnes fêtes

Agi
Whismeril 10165Messages postés mardi 11 mars 2003Date d'inscription ContributeurStatut 22 octobre 2017 Dernière intervention - 26 déc. 2016 à 18:24
Bonsoir, donc on en revient à ma première proposition regarde l'opérateur like, ou alors une regex
Répondre
Utilisateur anonyme - 26 déc. 2016 à 20:05
 
Bonjour Agi,

Voici le nouveau code VBA :


Option Explicit

Sub Essai()
  Application.ScreenUpdating = False
  Dim chn As String, dlig As Long, lig As Long
  dlig = Range("A" & Rows.Count).End(xlUp).Row
  For lig = 1 To dlig
    chn = Cells(lig, 1)
    If InStr("EO", Left$(chn, 1)) > 0 Then
      Cells(lig, 2) = Mid$(chn, 2, 1)
    End If
  Next lig
End Sub


Si tu as besoin de préciser aussi les codes qui commencent (par exemple)
par B et G, il te suffit de modifier ainsi la ligne #10 :

    If InStr("BEGO", Left$(chn, 1)) > 0 Then

Tu peux placer les initiales dans l'ordre que tu veux, par exemple "OEGB",
mais autant les placer dans l'ordre alphabétique, n'est-ce-pas ?  ;)

Bonnes fêtes à toi aussi !  :)
 
Répondre
agi- 12 janv. 2017 à 12:07
Bonjour Albkan et meilleurs vœux !
Je reviens vers toi, voilà :
J’ai un fichier Excel avec des dates (en colonne « A ») sachant que plusieurs lignes peuvent contenir la même date, J’aimerais savoir comment faire une macro qui, en entrant la date de début et date de fin, par InputBox, elle me fait la copie de toutes les lignes comprises dans cette tranche de dates de ce fichier vers un autre fichier Excel.
Merci par avance !
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour albkan,

Je te remercie pour ta réponse, c'est exactement ce qu'il me faut..
Passe un bon réveillant, et à toi aussi Whismeril passe de bonnes fêtes.

A bientôt

Agi
Whismeril 10165Messages postés mardi 11 mars 2003Date d'inscription ContributeurStatut 22 octobre 2017 Dernière intervention - 27 déc. 2016 à 19:15
Bonnes fêtes à toi aussi
Répondre
Donnez votre avis
Utile
+0
plus moins
 
Bonjour agi et meilleurs vœux à toi aussi !

Pour ta demande, il manque beaucoup trop d'informations !

Quand on veut faire une copie, il y a la source (= les données à copier)
et la destination (là où on veut faire la copie).

==============================

Pour la source :

a) nom du fichier 1 ? exemple : "Classeur 1.xlsm"
b) nom de la feuille ? exemple : "Feuil3"

c) n° de la ligne d'en-têtes du tableau ? ; exemple : ligne 5
d) 1ère ligne des données ? en principe juste après la ligne d'en-têtes => 6
e) dernière ligne des données ? : exemple : 100 (ou variable)
f) lignes à copier : de date début à date fin : OK

g) colonnes à copier : de la colonne A à quelle colonne ? G ? autre ?
h) ta colonne A contient des dates ; quel est le format de ces cellules ?
    format date jj/mm/aaaa ? autre format date ? format texte ?

----------------------------------------------------

exemple de résumé pour c) à h) :

des lignes 5 à 100 (et +), la ligne 5 étant une ligne d'en-têtes,
des colonnes A à G, dates au format jj/mm/aaaa

mais n'oublie pas de répondre aussi à a) et b) !

Et je vais supposer que toutes tes lignes de données sont continues,
c'est-à-dire sans ligne vide entre ; sinon, à toi de me le dire.

==============================

Pour la destination :

a) nom du fichier 2 ? exemple : "Classeur 2.xlsm"
b) nom de la feuille : "Feuil1" ? autre ?

c) cellule du coin supérieur gauche du futur tableau ? D8 ? autre ?
    si D8, ça signifie que la ligne d'en-têtes sera la ligne 8 ; la 1ère ligne
    de données copiée sera en ligne 9 et les autres seront dessous ;
    s'il y avait 7 colonnes (de A à G) pour la source, la destination aura
    7 colonnes aussi (de D à J). Et cela si pour une ligne copiée, tu veux
    toutes les 7 colonnes de la source, mais ce n'est pas forcé : tu peux
    vouloir seulement 2 ou 3 colonnes et pas les autres ! Si oui, à toi
    de l'indiquer : on ne peut pas deviner ce que tu préfères !  ;)

==============================

Ça te fait beaucoup de réponses à donner, hein ? Ce serait peut être
plus simple en joignant ton fichier (sans données confidentielles) via
mon-partage.fr ; ça m'aidera bien plus pour la source, mais il faudra
quand même indiquer tout ce que j'ai demandé pour la destination.

À te lire.  :)
 
Donnez votre avis
Utile
+0
plus moins
Bonjour Albkan,
Voilà les données

Fichier source:

Classeur : Source.xls
Feuille : Feuil1

Colonne A: date
Colonne B: commune
Colonne C: adresse
Colonne D: référence
Colonne E: intitulé
Colonne F: type
Colonne G: état

Fichier cible:

Classeur : Cible.xls ( qui se trouve dans un autre répertoire nommé "dsp")
Feuille : Feuil2

Colonne A: date
Colonne B: commune
Colonne C: adresse
Colonne D: référence
Colonne E: intitulé
Colonne F: type
Colonne G: état

L'idée est de copier une partie du fichier source et de la coller dans le fichier cible sachant que la cible et la source sont identiques, sauf que la cible ne contiendra que les lignes dont les dates sont comprises dans la fourchette choisie par "InputBox"
(exemple: copie: du 16/01/2017 au 23/01/2017) tout copier car plusieurs lignes peuvent contenir la même date.

Je reste à ta disposition pour tout tout info en plus

Merci infiniment

Agi
Utilisateur anonyme - 16 janv. 2017 à 23:00
 
Bonsoir agi,

Voici tes 2 fichiers source et cible ; tu dois mettre le fichier source
dans "Dossier 1" et le fichier cible dans "Dossier 2".

==============================

Attention :

Le début de macro ci-dessous marche avec mes noms de classeur,
et Dossier 1 et Dossier 2 doivent être dans le même dossier : je les
ai mis tous les deux dans "Mes documents", mais tu peux choisir
un autre dossier à la place, sans changer le code VBA.

Const PathX As String * 13 = "..\Dossier 2\"
Const NomX As String = "Exo agi - Classeur 2.xls"

Si tu utilises un autre dossier que Dossier 2, par exemple "Extractions 2016",
mets : Const PathX As String * 19 = "..\Extraction 2016\"
Il faut toujours : « ..\ » devant et un « \ » final ; tu dois aussi remplacer 13
par le nombre de caractères exact de ton Dossier 2, ici 19.

Si tu utilises un autre nom pour ton fichier 2, par exemple "Cible 2016",
mets : Const NomX As String = "Cible 2016.xls"

N'oublie pas d'adapter ces 2 constantes si besoin !

==============================

Ensuite, ouvre le fichier source seulement ; tu dois aller sur Feuil1
pour faire < Ctrl >< e > ; car sur une autre feuille, ça ne fera rien.

Si le fichier cible est non présent dans Dossier 2 : message d'erreur.
Si le fichier cible n'est pas déjà ouvert, ça l'ouvre automatiquement.

Saisie des dates : si tu mets JJ/MM, ça sera complété avec l'année en cours,
donc 16/01 => 16/01/2017 et 16/01/16 => 16/01/2016 ; pour la 2ème date,
si c'est la même que la 1ère, inutile de la resaisir : mets une étoile ( * ) ;
tu verras que c'est bien utile pour par exemple : du 16/01/16 au 16/01/16.

Si tu saisis pour date 1 : 20/01/16 et pour date 2 : 16/01/16, ça marchera
car inversion automatique des dates => du 16/01/16 au 20/01/16.

Quand il y a un guillemet dans la colonne date, ça fait ce qu'il faut.

Les anciens résultats sont automatiquement effacés avant inscription
des nouveaux => pas de mélange entre eux.

Sur Classeur 1 : < Alt >< F11 > pour voir la macro et revenir sur Excel.

Dis-moi ce que tu en penses et si ça te convient.
Tu peux me demander une adaptation si besoin.

albkan
 
Répondre
agi- 17 janv. 2017 à 17:15
bonjour, j'ai testé la macro mais j'ai le message : le dossier doit etre present, pourtant je n'ai rien modifié, merci de verifier de ton coté.
merci à toi
agi
Répondre
Utilisateur anonyme - 17 janv. 2017 à 17:27
 
Bonjour, c'est juste une histoire de dossiers.

PathX doit commencer par « ..\ » et se terminer par « \ » !
Const PathX As String * 13 = "..\Dossier 2\"

Il faut bien 2 points, pas 3 ! c'est pas des points de suspension !
« .. » signifie : dossier parent !

Tu dois ajuster correctement le nombre de caractères : 13 ;
si trop court ou trop long, ça n'ira pas !

--------------------------------------------------------

Pour ma structure de dossiers, j'ai ceci :
C:\Users\albkan\Documents\Dossier 1
C:\Users\albkan\Documents\Dossier 2

Ainsi, "Dossier 1" et "Dossier 2" sont tous les 2 dans
un même dossier, et ce dossier est "Documents".

« Documents » est le vrai nom sur C: de « Mes documents ».
Et toi, quelle est ta structure de dossiers ?

--------------------------------------------------------

Quels sont les noms réels et complets de tes fichiers ?

À te lire.
Répondre
agi- 18 janv. 2017 à 18:04
Bonsoir albkan, j'ai tout essayé j'ai respecté tes recommandations à la lettre pour le faire tourner tel qu'il est mais ce message sort à chaque fois, je n'ai plus quoi faire.
Tu l'as testé toi ?

Agi
Répondre
agi- 19 mai 2017 à 11:43
Salut Albkan,

Comment ça va depuis le temps ?
je reviens vers toi pour un petit souci, voilà;


Voici mon code pour copier une feuille d'un 'classeur vers un autre, ce code marche très bien, le problème c'est que chaque semaine il y a une nouvelle feuille du classeur 1 qui s'ajoute et que je dois copier, ce qui m'oblige à changer le nom de ma feuille dans le code avant de lancer la macro pour la copie.

J'aimerais un bout de code qui va chercher la feuille suivante (la dernière feuille du classeur source)

mon code d'origine:

Workbooks("Classeur1.xls").Worksheets("feuille1").Cells.Copy _
Workbooks("Classeur2.xls").Worksheets("feuille2").Range("A1")


j'ai essayé ceci mais ça me donne des erreurs :

Workbooks("Classeur1.xls").Sheets(Sheets.Count).Select.Cells.Copy _
Workbooks("Classeur2.xls").Worksheets("feuille2").Range("A1")


Est ce que tu as une idée ?

je te remercie

Agi
Répondre
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Juste une erreur de syntaxe:
Voici le bon code

Workbooks("Classeur1.xls").Sheets(Sheets.Count).Select
Cells.Copy _
Workbooks("Classeur2.xls").Worksheets("feuille2").Range("A1")


Bonne journée

Agi
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !