Récupérer Cellules dans un fichier Excel pour les copier dans un autre

Résolu
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011 - 19 juil. 2010 à 10:46
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011 - 29 juil. 2010 à 11:44
Bonjour,

Je suis actuellement en stage et amenée à développer en VBA. Je m'exerce un peu avant de me lancer sur le travail confié et j'aurais besoin de votre aide...

Je dispose d'un fichier "analyses.xls" et j'aimerai récupérer dans ce fichier la cellule se situant juste après celle contenant "N° lot" ...

Et ensuite copier le contenu de cette cellule dans mon fichier "essai vba.xls" à un emplacement précis.

J'essaie avec la fonction Find ... mais j'avoue que je bloque un peu beaucoup ...

Pourriez vous m'aider?

Merci d'avance,

49 réponses

cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
20 juil. 2010 à 14:09
Voici le code complet qui fonctionne :

Sub Ouvre()

    Dim ClasseurSource As Workbook, ClasseurCible As Workbook, CheminClasseur As String
    
    CheminClasseur = "C:\Documents and Settings\STAG3\Bureau\analyses.xls"
    
    If VerifOuvertureClasseur(CheminClasseur) Then
        MsgBox "Classeur déja ouvert." 'Que faire si déjà ouvert?
    Else
        Set ClasseurSource = Application.Workbooks.Open(CheminClasseur)
    End If
End Sub

Function VerifOuvertureClasseur(Fichier As String) As Boolean
    Dim x As Integer

    On Error Resume Next
    x = FreeFile()

    Open Fichier For Input Lock Write As #x 'préciser les options d'accès au fichier, ici verouillé en écriture...
    Close x

    If Err.Number 0 Then VerifOuvertureClasseur False
    If Err.Number 70 Then VerifOuvertureClasseur True

    On Error GoTo 0
End Function


Sub RecupNumLot()

Dim newlettre, lettre, s As String
Dim numero As Integer

Call Ouvre


With ActiveWorkbook.Worksheets("Données Rapports").Range("A1:P108")
            Set c = .Find("n° lot:", LookIn:=xlValues)
            
    If Not c Is Nothing Then ' si c n'est pas vide
        firstAddress = c.Address
    End If
    
End With
    s = Replace(firstAddress, "$", "")
    For i = 1 To Len(s)
        If IsNumeric(Mid(s, i, i)) Then
            lettre = Mid(s, 1, i - 1)
            numero = Mid(s, i, Len(s))
        GoTo suit
        End If
    Next
suit:
    newlettre = Chr(Asc(lettre) + 1)
    Windows("analyses.xls").Activate
    Range(newlettre & numero).Select

    Selection.Copy
    Windows("essai vba.xls").Activate
    Range("B1").Select

    ActiveSheet.Paste
    Windows("analyses.xls").Activate
    'ActiveWindow.Close

End Sub



3
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 11:40
Sub Ouvre()

    Dim ClasseurSource As Workbook, ClasseurCible As Workbook, CheminClasseur As String
    
    CheminClasseur = "C:\Documents and Settings\STAG3\Bureau\analyses.xls"
    
    If VerifOuvertureClasseur(CheminClasseur) Then
        MsgBox "Classeur déja ouvert." 'Que faire si déjà ouvert?
    Else
        Set ClasseurSource = Application.Workbooks.Open(CheminClasseur)
    End If
End Sub

Function VerifOuvertureClasseur(Fichier As String) As Boolean
    Dim x As Integer

    On Error Resume Next
    x = FreeFile()

    Open Fichier For Input Lock Write As #x 'préciser les options d'accès au fichier, ici verouillé en écriture...
    Close x

    If Err.Number 0 Then VerifOuvertureClasseur False
    If Err.Number 70 Then VerifOuvertureClasseur True

    On Error GoTo 0
End Function

' Recherche des éléments nécessaires dans le fichier Excel d'analyses

Sub FindNumLot()


Call Ouvre

Workbooks("analyses.xls").Activate



With ActiveWorkbook.Worksheets("Données Rapports").Range("A1:P108")
            Set c = .Find("n° lot:", LookIn:=xlValues)
            
    If Not c Is Nothing Then ' si c n'est pas vide
        firstAddress = c.Address 'Maintenant problème passer à l'adresse suivante ...
        Debug.Print (c.Value)
        
    End If
End With
End Sub


J'ai fait ce début de code, maintenant je récupère bien ma cellule contenant "N° lot" mais comment faire pour récupérer la cellule juste après...
Ou dans mon code comment incrémenté la l'adresse de la variable c de 1 ? d'une cellule vers la droite ...

Merci d'avance
0
cs_abdellatyif Messages postés 32 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 29 juillet 2010
19 juil. 2010 à 11:55
salut voila une idée si j'ai bien compris ton besoin

    Cells.Find(What:="N° lot""", After:=ActiveCell).Activate 'chercher le texte "N° lot" dans le fichier xls
    s = Replace(ActiveCell.Address, "$", "") 'recuperer l'adresse de l'active cellule
    For i = 1 To Len(s)
    If IsNumeric(Mid(s, i, i)) Then  'separer l'alpha et les numeric
    letre = Mid(s, 1, i - 1)
    numero = Mid(s, i, Len(s))
    GoTo suit
    End If
    Next
suit:
    Range(letre & numero + 1).Select ' si vous voulez le champs suivant dans la même colonne
    Range(Chr(Asc(letre) + 1) & numero).Select ' si vous voulez le champs suivant dans la même ligne
    




en plus tu peu récupérer la valeur dans un variable puis ouvrir votre fichier d'essaiVB et sélectionner la cellule de destination
bon courage
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 14:28
Désolée mais je débute en vba, peux tu m'expliquer :

Range(Chr(Asc(letre) + 1) & numero).Select


Je voudrais récupérer le contenu de la cellule dans une variable... et je n'arrive pas à comprendre comment faire sans comprendre votre code ...

J'ai essayé de mettre la dernière ligne dans une variable string mais ça ne fonctionne pas ...
J'essaie donc de comprendre le code...

Par contre pour la cellule de destination je veux le faire en code aussi ... si je la sélectionne ça ne sera pas codé.. Avez vous une solution ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 14:42
Petite précision je code depuis "essais vba.xls" et depuis ce document j'ouvre "analyses.xls" et j'aimerai récupérer dans "analyses" la cellule suivante à celle contenant "N° lot:" et coller ce que je récupère dans une cellule précise de "essais vba.xls"...

Si vous pouviez m'aider aussi sur le fait de :
- jongler entre les deux fichiers
- passer à la cellule suivante
- trouver ce que je recherche dans "analyses.xls"
- coller le résultat de ma recherche dans le document "essai vba.xls"
0
cs_abdellatyif Messages postés 32 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 29 juillet 2010
19 juil. 2010 à 14:46
explique bien votre besoin,
0--> ouvrir le fichier excel 1.
1--> chercher le mot N° lots dans un fichier excel
2--> récupérer la valeur du champ a coté de la cellule trouvé dans étape 1
4--> ouvrir le fichier excel 2
5--> sélectionner une cellule
3--> copie la valeur récupérer dans l'étape 2 dans le fichier excel 2

????
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 14:51
0--> Je code dans le fichier Excel 2
1--> Depuis ce fichier j'ouvre le fichier Excel 1
2--> Recherche du mot "N° lot:" dans le fichier Excel 1
3--> Récupérer la valeur du champ à côté de la cellule trouvée dans l'étape 2
4--> Coller cette valeur dans la cellule B1 du fichier Excel 2

Je suis claire ou pas??
0
cs_abdellatyif Messages postés 32 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 29 juillet 2010
19 juil. 2010 à 15:33
salut
vérifier si ça marche mnt

    Workbooks.Open Filename:="C:\Documents and Settings\STAG3\Bureau\analyses.xls"

    Cells.Find(What:="N° lot", After:=ActiveCell).Activate
    s = Replace(ActiveCell.Address, "$", "")
    For i = 1 To Len(s)
    If IsNumeric(Mid(s, i, i)) Then
    letre = Mid(s, 1, i - 1)
    numero = Mid(s, i, Len(s))
    GoTo suit
    End If
    Next
suit:

    Range(Chr(Asc(letre) + 1) & numero).Select
    Selection.Copy
    Windows("essais vba.xls").Activate
    Range("B1").Select
    ActiveSheet.Paste
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 15:42
J'ai testé le code mais j'ai une erreur :

Erreur d'éxecution 91 : Variable objet ou variable de bloc With non définie


J'ai essayé de mettre un bloc With comme dans mon précédent code mais cela ne fonctionne pas, qu'elle est la syntaxe exacte svp ?

Merci d'avance :)
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 16:01
Sub Ouvre()

    Dim ClasseurSource As Workbook, ClasseurCible As Workbook, CheminClasseur As String
    
    CheminClasseur = "C:\Documents and Settings\STAG3\Bureau\analyses.xls"
    
    If VerifOuvertureClasseur(CheminClasseur) Then
        MsgBox "Classeur déja ouvert." 'Que faire si déjà ouvert?
    Else
        Set ClasseurSource = Application.Workbooks.Open(CheminClasseur)
    End If
End Sub

Function VerifOuvertureClasseur(Fichier As String) As Boolean
    Dim x As Integer

    On Error Resume Next
    x = FreeFile()

    Open Fichier For Input Lock Write As #x 'préciser les options d'accès au fichier, ici verouillé en écriture...
    Close x

    If Err.Number 0 Then VerifOuvertureClasseur False
    If Err.Number 70 Then VerifOuvertureClasseur True

    On Error GoTo 0
End Function


Sub RecupNumLot()

Call Ouvre


    Cells.Find(What:="n° lot:", After:=ActiveCell).Activate
    s = Replace(ActiveCell.Address, "$", "")
    For i = 1 To Len(s)
        If IsNumeric(Mid(s, i, i)) Then
            lettre = Mid(s, 1, i - 1)
            numero = Mid(s, i, Len(s))
        GoTo suit
        End If
    Next
suit:

    Range(Chr(Asc(lettre) + 1) & numero).Select
    Selection.Copy
    Windows("essai vba.xls").Activate
    Range("B1").Select
    ActiveSheet.Paste

End Sub



Voici la totalité de mon code ...
0
cs_abdellatyif Messages postés 32 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 29 juillet 2010
19 juil. 2010 à 16:15
dis moi c'est quoi le non des fichier excel.??

et c'est quoi la linge qui vous donne le message d'erreur
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 16:20
Le fichier 2 = essai vba.xls
Le fichier 1 = analyses.xls

La ligne qui fait l'erreur est :

Cells.Find(What:="n° lot:", After:=ActiveCell).Activate
    s = Replace(ActiveCell.Address, "$", "")


As tu essayé de rajouter un With??
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 16:28
En rajoutant un bloc With de cette manière là cela me fait toujours la même erreur je ne comprend pas ... :

Sub RecupNumLot()

Call Ouvre

With ActiveWorkbook.Worksheets("Données Rapports").Range("A1:P108")
    Cells.Find(What:="n° lot:", After:=ActiveCell).Activate
    s = Replace(ActiveCell.Address, "$", "")
    For i = 1 To Len(s)
        If IsNumeric(Mid(s, i, i)) Then
            lettre = Mid(s, 1, i - 1)
            numero = Mid(s, i, Len(s))
        GoTo suit
        End If
    Next
suit:

    Range(Chr(Asc(lettre) + 1) & numero).Select
    Selection.Copy
    Windows("essai vba.xls").Activate
    Range("B1").Select
    ActiveSheet.Paste
End With
End Sub

0
cs_abdellatyif Messages postés 32 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 29 juillet 2010
19 juil. 2010 à 16:40
j'ai testé ce code et ç marche
With ActiveWorkbook.Worksheets("Données Rapports").Range("A1:P108")
            Set c = .Find("n° lot:", LookIn:=xlValues)
            
    If Not c Is Nothing Then ' si c n'est pas vide
        firstAddress = c.Address 
       
    End If
End With


    s = Replace(firstAddress, "$", "")
    For i = 1 To Len(s)
        If IsNumeric(Mid(s, i, i)) Then
            lettre = Mid(s, 1, i - 1)
            numero = Mid(s, i, Len(s))
        GoTo suit
        End If
    Next
suit:

    Range(Chr(Asc(lettre) + 1) & numero).Select
    Selection.Copy
    Windows("essai vba.xls").Activate
    Range("B1").Select
    ActiveSheet.Paste
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 16:47
Pff on va pas s'en sortir lol ...

J'ai mis ton code en place il y a un miuex cependant cela me met cette erreur cette fois ci :

Erreur d'éxecution 1001 Erreur définie par l'application ou par l'objet


Cela me le fait sur cette ligne :

Range(Chr(Asc(lettre) + 1) & numero).Select


...
0
cs_abdellatyif Messages postés 32 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 29 juillet 2010
19 juil. 2010 à 17:12
peu tu me donnée la lettre de colonne ou se trouve le mot N° lot:
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
19 juil. 2010 à 17:16
N° de lot se trouve en colonne D
Par contre la colonne suivante est E et F mais cela ne forme qu'une cellule qui je pense est E...
Est ce que je suis claire? Sinon je vous envoi un imprim écran de mon fichier à cet endroit là...
0
cs_abdellatyif Messages postés 32 Date d'inscription jeudi 10 juillet 2003 Statut Membre Dernière intervention 29 juillet 2010
19 juil. 2010 à 17:18
non c'est claire
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
20 juil. 2010 à 09:19
Je viens d'arriver et j'ai relancé mon code et donc lancé mes fichiers Excel qui m'ont demandé de mettre à jour les liaisons entre les deux fichiers ce que j'ai fait et apparemment quelques liaisons n'ont pas pu être mises à jour ... Est ce que cela peut venir de là? Je vais regarder la valeur des variables ...
0
cs_Juju1988 Messages postés 70 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 21 juin 2011
20 juil. 2010 à 09:49
Toutes les valeurs des variables sont également correctes ... mais ça bloque toujours à la même ligne :

Range(Chr(Asc(lettre) + 1) & numero).Select

Ce serait pas le fait d'ajouter + 1 à une lettre??
0
Rejoignez-nous