Copier données d'un autre tableau en fonction du nom d'un onglet

Résolu/Fermé
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017 - 10 févr. 2017 à 13:35
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 - 14 févr. 2017 à 14:13
Bonjour à tous,

Je me casse un peu la tête sur un problème qui semble tout bête.

J'ai un fichier 2016 qui possède des onglets (1.2.3.4 etc...)
Dans ces onglets j'ai une cellule g7 qui contient une valeur.

J'aimerais copier dans mon fichier 2017 ayant des onglets avec le même nomdans ma cellule G3 , la valeur G7 de l'onglet correspondant 2016.

Soit par exemple dans mon fichier c:/2017.xls dans l'onglet 1 à la cellule G2, j'aimerais copier la valeur contenue dans c:/2016.xls dans l'onglet 1 de la cellule g7.

J'aimerais que ce soit automatique car j'ai énormément d'onglets.

Désolé si la syntaxe n'est pas correcte.

Merci d'avance

14 réponses

ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 10/02/2017 à 14:27
Bonjour

1. Ouvrir les deux fichiers avec la même session d'excel
2. Se placer dans le fichier source (2016)
3. Alt-F11 pour accéder à l'editeur vba
4. Coller tout le code ci dessous
5. adapter les noms de fichier
6. Exécuter la macro OK

Option Explicit

' adapter les noms des deux fichiers
Const WS = "2016.xls"
Const wb = "2017.xls"
' cellule à traiter dans chaque feuille
Const cel = "$G$7"

Public Sub OK()
Dim wbs As Workbook, wbb As Workbook
Dim nuf As Long, nbf As Long, nomf As String
Set wbs = Workbooks(WS)
Set wbb = Workbooks(wb)
With ActiveWorkbook
  nbf = .Sheets.Count
  For nuf = 1 To nbf
    nomf = .Sheets(nuf).Name
    If FeuilleExiste(wbb, nomf) Then
      wbb.Sheets(nomf).Range(cel).Value = .Sheets(nomf).Range(cel).Value
    End If
  Next nuf
End With
End Sub

Public Function FeuilleExiste(wb As Workbook, nomf As String) As Boolean
Dim a
FeuilleExiste = False
On Error GoTo fin
a = wb.Sheets(nomf).Range("A1")
FeuilleExiste = True
fin:
End Function

Un exemple (Ctrl+k pour lancer la macro depuis 2016)
fichier 2016
http://www.cjoint.com/c/GBknvItrpDf
fichier 2017
http://www.cjoint.com/c/GBknwAjq3Of

Cdlmnt
0
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017
10 févr. 2017 à 14:34
Super merci.

On est proche de ce que je cherche à faire.

J'aimerais copier dans le fichier 2017 en case g3, la valeur de la case g7 du fichier 2016.

Je suppose que dans le code, je remplace les noms de fichier par le chemin d'accès sur mon pc?

Encore merci pour la diligence de la réponse
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 10/02/2017 à 15:30
1. J'aimerais copier dans le fichier 2017 en case g3, la valeur de la case g7 du fichier 2016.
' adapter les noms des deux fichiers
Const WS = "2016.xls"
Const wb = "2017.xls"
' cellule à traiter dans chaque feuille
Const cels = "$G$7"
Const celb = "$G$3"

Public Sub OK()
Dim wbs As Workbook, wbb As Workbook
Dim nuf As Long, nbf As Long, nomf As String
Set wbs = Workbooks(WS)
Set wbb = Workbooks(wb)
With ActiveWorkbook
  nbf = .Sheets.Count
  For nuf = 1 To nbf
    nomf = .Sheets(nuf).Name
    If FeuilleExiste(wbb, nomf) Then
      wbb.Sheets(nomf).Range(celb).Value = .Sheets(nomf).Range(cels).Value
    End If
  Next nuf
End With
End Sub

2. Je suppose que dans le code, je remplace les noms de fichier par le chemin d'accès sur mon pc?
non, les deux fichier étant ouverts dans la même session d'ecxcel, seul le nom avec l'extension (sans le chemin) suffit

Cdlmnt
0
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017
13 févr. 2017 à 09:55
Bonjour,

Visiblement il y a un problème :/

Cela me met un message d'erreur. Quelle manip aurais-je mal faite?

merci d'avance :)

0

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

Posez votre question
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
13 févr. 2017 à 15:57
Est ce une erreur de compilation ou d'exécution.
Peux tu me donner le message d'erreur
0
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017
13 févr. 2017 à 16:07
C'est une erreur de compilation : Variable non définie
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 13/02/2017 à 17:32
Tu n'as pas pris la bonne version (voir post#3)

wbb.Sheets(nomf).Range(celb).Value = .Sheets(nomf).Range(cels).Value

Cdlmnt
0
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017
14 févr. 2017 à 08:55
Ah ok merci,

le premier code fonctionnait mais qu'avec la case G7. Le second ne fonctionnait pas. Donc j'avais essayé de faire fonctionner le premier avec les variables du second.

Là, j'ai repris le second mais il ne fonctionne pas :(

j'ai encore fait une mauvaise manip?

merci pour la patience en tout cas :)

0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
Modifié par ccm81 le 14/02/2017 à 10:25
Ben, tu n'as pas copié le code de la fonction FeuilleExiste, donc il ne la trouve pas ;-()

Public Function FeuilleExiste(wb As Workbook, nomf As String) As Boolean
Dim a
FeuilleExiste = False
On Error GoTo fin
a = wb.Sheets(nomf).Range("A1")
FeuilleExiste = True
fin:
End Function


Cdlmnt
0
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017
14 févr. 2017 à 12:51
Voici le code que j'ai adapté à mon fichier :

Option Explicit

' adapter les noms des deux fichiers
Const WS = "2016controleGLparastat.xlsx"
Const wb = "2017controleGLparastat.xlsm"
' cellule à traiter dans chaque feuille
Const cels = "$G$17"
Const celb = "$G$3"

Public Sub MAJ_17()
Dim wbs As Workbook, wbb As Workbook
Dim nuf As Long, nbf As Long, nomf As String
Set wbs = Workbooks(WS)
Set wbb = Workbooks(wb)
With ActiveWorkbook
nbf = .Sheets.Count
For nuf = 1 To nbf
nomf = .Sheets(nuf).Name
If FeuilleExiste(wbb, nomf) Then
wbb.Sheets(nomf).Range(celb).Value = .Sheets(nomf).Range(cels).Value
End If
Next nuf
End With
End Sub

Public Function FeuilleExiste(wb As Workbook, nomf As String) As Boolean
Dim a
FeuilleExiste = False
On Error GoTo fin
a = wb.Sheets(nomf).Range("A1")
FeuilleExiste = True
fin:
End Function

Il prend donc la valeur G17 dans le fichier 2017 pour la mettre en g3 dans ce même fichier 2017. Hors c'est la valeur g17 du fichier 2016 dont j'ai besoin

on va y arriver :p
0
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017
14 févr. 2017 à 13:38
Je viens de corriger un élément,

Option Explicit

' adapter les noms des deux fichiers
Const WS = "2016controleGLparastat.xlsm"
Const wb = "2017controleGLparastat.xlsm"
' cellule à traiter dans chaque feuille
Const cels = "$G$17"
Const celb = "$G$3"

Public Sub MAJ_17()
Dim wbs As Workbook, wbb As Workbook
Dim nuf As Long, nbf As Long, nomf As String
Set wbs = Workbooks(WS)
Set wbb = Workbooks(wb)
With ActiveWorkbook
nbf = .Sheets.Count
For nuf = 1 To nbf
nomf = .Sheets(nuf).Name
If FeuilleExiste(wbb, nomf) Then
wbb.Sheets(nomf).Range(celb).Value = wbs.Sheets(nomf).Range(cels).Value
End If
Next nuf
End With
End Sub

Public Function FeuilleExiste(wb As Workbook, nomf As String) As Boolean
Dim a
FeuilleExiste = False
On Error GoTo fin
a = wb.Sheets(nomf).Range("A1")
FeuilleExiste = True
fin:
End Function

Elle a tourné et fonctionné mais j'ai un message d'erreur

Erreur d'exécution '9':
L'indice n'appartient pas à la sélection

et la ligne
wbb.Sheets(nomf).Range(celb).Value = wbs.Sheets(nomf).Range(cels).Value

est en surbrillance jaune
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
14 févr. 2017 à 13:47
Tu as mis la macro dans le ficher 2017 (moi, je l'avais mis dans 2016) ce qui change le "ActiveWorkBook"
Bref : Les G7 de 2016 vont se copier dans les G3 de 2017, c'est bien ça ?
Donc il te faut modifier un peu (en laissant la fonction FeuilleExiste bien sûr

Public Sub OK()
Dim wbs As Workbook, wbb As Workbook
Dim nuf As Long, nbf As Long, nomf As String
Set wbs = Workbooks(WS)
Set wbb = Workbooks(wb)
With ActiveWorkbook
  nbf = .Sheets.Count
  For nuf = 1 To nbf
    nomf = .Sheets(nuf).Name
    If FeuilleExiste(wbs, nomf) Then
      .Sheets(nomf).Range(celb).Value = wbs.Sheets(nomf).Range(cels).Value
    End If
  Next nuf
End With
End Sub

Cdlmnt
0
monza86 Messages postés 9 Date d'inscription mercredi 8 février 2017 Statut Membre Dernière intervention 24 février 2017
14 févr. 2017 à 13:58
Super :D

ça fonctionne :)

Mon responsable préfère éviter que l'on "chipote trop" au fichier de l'année précédente. Du coup, j'avais pris cette logique d'inclure le code dans l'année en cours.

Merci en tout cas pour l'aide et le temps consacré :)
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
14 févr. 2017 à 14:13
De rien

Si c'est fini, peux tu mettre le sujet à résolu (en dessous du titre de ton premier message)

Bon après midi
0