Problème de lien entre mon fichier source et mon fichier destination

Bonjour à tous,

J'ai créé un très gros programme avec 10 sous-programmes, dont 9 qui se réalise sur le même fichier de destination, pour alléger le programme, j'ai essayé d'ouvrir le fichier destination une fois puis que les onglets de destination s'active au besoin. J'ai remarqué que les 3 sous-programmes sur 9 (le 1, 8 et 9) qui ce font sur le même onglet se réalise sans problème, pour tous les autres, il ne m'indique pas d'erreur mais ne réalise pas les demandes.

Quelqu'un aurait une idée d'où vient le problème s'il vous plaît? (mon programme n'est clairement pas optimisé à la vue de mes légères compétences dans le domaine)

J'ai mis en pièce jointe une légère partie du programme sans les data de la feuille source et de destination.

Merci d'avance pour le coup de main.

9aide.xlsm (15.04 Ko)

Bonjour ValentinB et bienvenue

Du coup, quelle partie ne fonctionne pas

Vous pouvez vérifier ce qui se passe en mettant un point d'arrêt sur une ligne (Excepté les Dim) grâce à F9
Et exécuter le code pas à pas grâce à F8

En continuant à chercher de mon côté, j'en sais un peu plus, ce n'est pas que cela ne fonctionne pas, c'est que le premier sous-programme, prend bien le classeur A, feuilx (X = feuille active) en fichier source mais le deuxième sous-programme prend le classeur B, feuille active en fichier source au lieu de continuer à prendre le classeur A, feuilx active.

Les inconvénients que je rencontre c'est que la macro sera sur un grand nombre de classeur, qui comporte eux-mêmes un grand nombre de feuille.

J'essai deux solutions qui sont sur le programme ci-dessous ainsi que les deux erreurs que je rencontre :

Avec Type:=8 --> "la référence que vous avez tapée n'est pas valide, ou une référence était requise mais vous n'en avez sais aucune"

Avec nomFeuille = --> Quand je renseigne correctement la feuille source, il considère que je n'en ai pas mis et stop la macro.

Si quelqu'un peu m'aider à y voir un peu plus clair s'il vous plaît.

Sub fichiersource()
    Dim wsSource As Worksheet
    Dim wbSource As Workbook
    Dim wbDest As Workbook
    Dim CheminFichierB As String

    ' Initialiser le classeur source
    Set wbSource = ThisWorkbook

    ' Demander à l'utilisateur de choisir la feuille source
    On Error Resume Next
    Set wsSource = Application.InputBox("Sélectionnez la feuille source :", Type:=8).Worksheets(1)
    On Error GoTo 0

    ' Demander à l'utilisateur de saisir le nom de la feuille source
    nomFeuille = InputBox("Entrez le nom de la feuille source :", "Nom de la feuille")

    ' Vérifier si une feuille a été sélectionnée
    If wsSource Is Nothing Then
        MsgBox "Aucune feuille source sélectionnée. La macro va s'arrêter."
        Exit Sub
    End If

    ' Définir le chemin du fichier B
    CheminFichierB = "C:\test excel\Feuille B.xlsm" ' Remplacez par le bon chemin

    ' Ouvrir le fichier B si ce n'est pas déjà ouvert
    Set wbDest = Nothing
    On Error Resume Next
    Set wbDest = Workbooks("Feuille B.xlsm")
    On Error GoTo 0

    If wbDest Is Nothing Then
        Set wbDest = Workbooks.Open(CheminFichierB)
    End If

    ' Appeler les sous-programmes avec la feuille source
    Call TransfererDonneesfab(wsSource, wbDest)
    Call TransfererDonneesmatiere(wsSource, wbDest)

    MsgBox "Toutes les étapes ont été complétées avec succès."

End Sub

Sub TransfererDonneesfab(ByVal wsSource As Worksheet, ByVal wbDest As Workbook)

    Dim wsDest As Worksheet
    Dim DerniereLigne As Long

    Set wsDest = wbDest.Worksheets("Données FAB")    ' Remplacez par le bon nom

    ' Trouver la dernière ligne occupée
    DerniereLigne = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row + 1

    ' Copier les données
    With wsSource
        wsDest.Cells(DerniereLigne, "A").Value = .Range("A2").Value  ' copie Date (A2) en colonne A
        wsDest.Cells(DerniereLigne, "B").Value = .Range("D2").Value  ' copie Offre (B2) en colonne B
        wsDest.Cells(DerniereLigne, "C").Value = .Range("H2").Value  ' copie référence pièce (H2) en colonne C
        wsDest.Cells(DerniereLigne, "D").Value = .Range("L4").Value  ' copie Quantité commandée(L4) en colonne D
        wsDest.Cells(DerniereLigne, "E").Value = .Range("L2").Value  ' copie Date de traitement(L2) en colonne E
    End With

    ' Nettoyer les objets sans fermer le fichier
    Set wsDest = Nothing
End Sub

Re,

Comme on dit par chez moi, vous codez à la "one again boustifly"

Pensez à passer par des variable et non directement par l'instruction comme vous le faite

Ensuite "Set WsSource" attend un objet et non du texte, essayez

sNomFeuille = Application.InputBox("Sélectionnez la feuille source :", Type:=8)
Set wsSource = Worksheets(sNomFeuille)

Bonjour,

Malheureusement oui, je n'ai aucune connaissance sur le VBA et mes notions sont plus que légère ... même si cela me serait fort utile, je ne vous ferai pas l'affront de vous montrer le programme entier pour éviter les larmes de sang ^^

J'ai essayé votre solution mais je ne dois pas le faire correctement, car cela me met le même message d'erreur quand j'indique le nom de la feuille ...

Sub fichiersource()
Dim wsSource As Worksheet
Dim wbSource As Workbook
Dim wbDest As Workbook
Dim CheminFichierB As String

' Initialiser le classeur source
Set wbSource = ThisWorkbook

' Demander à l'utilisateur de saisir le nom de la feuille source
sNomFeuille = Application.InputBox("Sélectionnez la feuille source :", Type:=8)
Set wsSource = Worksheets(sNomFeuille)

' Vérifier si une feuille a été sélectionnée
If wsSource Is Nothing Then
MsgBox "Aucune feuille source sélectionnée. La macro va s'arrêter."
Exit Sub
End If

Re,

Si vous voulez de l'aide, mettez dans un ZIP, vos 2 fichiers anonymisés

Cela nous permettra de tester en live ce qui se produit

A+

Du coup j'ai trouvé, et c'était beaucoup plus simple que prévu ....

J'ai juste réactivé le classeur source à la fin des programmes qui ce font dedans et activé les feuilles de destination quand je n'avais pas besoin d'une feuille dans le dossier source !

Merci quand même de l'aide apporté.

Sub TransfererDonneesfab()

Dim wbSource As Workbook
Dim wbDest As Workbook
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim CheminFichierB As String
Dim DerniereLigne As Long

' Définir le chemin du fichier B (à adapter)
CheminFichierB = "C:\test excel\Feuille B.xlsm" ' Remplacez par le bon chemin

' Initialiser les objets
Set wbSource = ThisWorkbook ' Fichier A (celui contenant la macro)
Set wsSource = ActiveSheet ' Feuille source

' Ouvrir le fichier B
Set wbDest = Workbooks.Open(CheminFichierB)
Set wsDest = wbDest.Worksheets("Données FAB") ' Remplacez par le bon nom

' Trouver la dernière ligne occupée
DerniereLigne = wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row + 1

' Copier les données
With wsSource
wsDest.Cells(DerniereLigne, "A").Value = .Range("A2").Value ' copie Date (A2) en colonne A
wsDest.Cells(DerniereLigne, "B").Value = .Range("D2").Value ' copie Offre (B2) en colonne B
wsDest.Cells(DerniereLigne, "C").Value = .Range("H2").Value ' copie référence pièce (H2) en colonne C
wsDest.Cells(DerniereLigne, "D").Value = .Range("L4").Value ' copie Quantité commandée(L4) en colonne D
wsDest.Cells(DerniereLigne, "E").Value = .Range("L2").Value ' copie Date de traitement(L2) en colonne E

End With

' Réactiver le classeur source
wbSource.Activate

' Nettoyer les objets sans fermer le fichier
Set wsDest = Nothing
Set wsSource = Nothing
' wbDest reste ouvert
End Sub

Edit modo : Pour vos codes merci de penser à utiliser les balises de code en cliquant sur l'icône </> disponible dans la barre de menu

Bonjour,

De manière générale quand vous travaillez avec plusieurs classeurs, faites très attention à référencer complètement les objets (workbook/worksheet/range), car un oubli peut vite vous faire travailler sur la feuille active (inconnue) et ouvrir/fermer des classeurs change la feuille active justement.

D'après vos extraits de code vous le savez déjà, mais il est possible qu'une erreur se soit glissée quelque part, surtout si un Activate résout votre problème…

Pour ce qui est des Set wb = Nothing en fin de Sub, c'est inutile le garbage collector s'en charge. L'utilité (éventuelle) du Set Nothing c'est en milieu de Sub dès lors que vous n'avez plus besoin de la ressource pour libérer la mémoire (mais pour que ce soit valable il faut que ce soit un gros objet, une référence de workbook a priori n'est pas très lourde).


Bonne journée

Bonjour Saboh12617,

Merci de ton retour, je le sais mais arriver à l'identifier partout est clairement une autre paire de manche.

Malheureusement, je crains que dans l'intégralité de mon programme il y a différentes coquilles qui ne ce sont pas manifesté ou qui fonctionne par miracle mais bon.

Merci à vous.

Rechercher des sujets similaires à "probleme lien entre mon fichier source destination"