Signaler

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

Posez votre question monza86 9Messages postés mercredi 8 février 2017Date d'inscription 24 février 2017 Dernière intervention - Dernière réponse le 14 févr. 2017 à 14:13 par ccm81
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
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
Bonjour,

Visiblement il y a un problème :/

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

merci d'avance :)

Donnez votre avis
Utile
+0
plus moins
Est ce une erreur de compilation ou d'exécution.
Peux tu me donner le message d'erreur
Donnez votre avis
Utile
+0
plus moins
C'est une erreur de compilation : Variable non définie
Donnez votre avis
Utile
+0
plus moins
Tu n'as pas pris la bonne version (voir post#3)

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

Cdlmnt
Donnez votre avis
Utile
+0
plus moins
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 :)

Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis
Utile
+0
plus moins
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é :)
Donnez votre avis
Utile
+0
plus moins
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
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 !