Copier données d'un autre tableau en fonction du nom d'un onglet [Résolu]

monza86 9 Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - 10 févr. 2017 à 13:35 - Dernière réponse : ccm81 8202 Messages postés lundi 18 octobre 2010Date d'inscription 11 décembre 2017 Dernière intervention
- 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
Afficher la suite 
9Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention

14 réponses

Répondre au sujet
ccm81 8202 Messages postés lundi 18 octobre 2010Date d'inscription 11 décembre 2017 Dernière intervention - Modifié par ccm81 le 10/02/2017 à 14:27
0
Utile
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
Commenter la réponse de ccm81
monza86 9 Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - 10 févr. 2017 à 14:34
0
Utile
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
Commenter la réponse de monza86
ccm81 8202 Messages postés lundi 18 octobre 2010Date d'inscription 11 décembre 2017 Dernière intervention - Modifié par ccm81 le 10/02/2017 à 15:30
0
Utile
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
Commenter la réponse de ccm81
monza86 9 Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - 13 févr. 2017 à 09:55
0
Utile
Bonjour,

Visiblement il y a un problème :/

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

merci d'avance :)

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

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

Cdlmnt
Commenter la réponse de ccm81
monza86 9 Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - 14 févr. 2017 à 08:55
0
Utile
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 :)

Commenter la réponse de monza86
ccm81 8202 Messages postés lundi 18 octobre 2010Date d'inscription 11 décembre 2017 Dernière intervention - Modifié par ccm81 le 14/02/2017 à 10:25
0
Utile
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
Commenter la réponse de ccm81
monza86 9 Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - 14 févr. 2017 à 12:51
0
Utile
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
Commenter la réponse de monza86
monza86 9 Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - 14 févr. 2017 à 13:38
0
Utile
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
Commenter la réponse de monza86
ccm81 8202 Messages postés lundi 18 octobre 2010Date d'inscription 11 décembre 2017 Dernière intervention - 14 févr. 2017 à 13:47
0
Utile
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
Commenter la réponse de ccm81
monza86 9 Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - 14 févr. 2017 à 13:58
0
Utile
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é :)
Commenter la réponse de monza86
ccm81 8202 Messages postés lundi 18 octobre 2010Date d'inscription 11 décembre 2017 Dernière intervention - 14 févr. 2017 à 14:13
0
Utile
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
Commenter la réponse de ccm81