Exécution d'une macro SI changement valeur sur une feuille

Bonjour,

Besoin d'un petit coup de main après moult tentatives bien évidement infructueuse

Voilà,

Je travaille sur la feuille 1 d'un classeur.

La colonne E de cette feuille est remplie via une macro de ce classeur

Les colonnes A,B,C,D sont quant à elles remplies via l'USF d'un autre classeur.

Je souhaiterais que lorsqu'une modification intervient sur A,B,C,D via l'USF, la colonne E se renseigne automatiquement par lancement de la macro de la feuille1. Or pour l'instant, si une nouvelle ligne se crée seules les valeurs en A,B,C,D sont renseignées

Merci d'avance. Erwan

Voici mon code pour la feuille 1 de ce classeur:

Private Sub Worksheet_change(ByVal Target As Excel.Range)

Call Test

End Sub

Private Sub Test()

Dim LastLigne As Long, i As Long

dateAujourdhui = Date

Application.ScreenUpdating = False

With Worksheets(1)

LastLigne = .Cells(.Rows.Count, 1).End(xlUp).Row

For i = 2 To LastLigne

.Range("E2:E" & LastLigne).Value = dateAujourdhui

Next i

End With

End Sub

Bonjour

Le plus important c'est la macro qui écrit dans les colonnes A,B,C,D ton fichier

Comment voir les interactions entre les macros

Je pense que le plus simple est que je te joigne mes deux fichiers.

Le classeur A contient l'USF et les instruction pour remplir les colonnes A,B,C,D du classeur "Registre"

Le classeur "Registre" contient l'instruction pour remplir la colonne 5 qui se remplit actuellement mais manuellement et non pas en liaison avec L'USF de l'autre classeur.

J'ai essayé d'être le plus concis pour ta compréhension.

Erwan,

28a.zip (29.10 Ko)
30registre.zip (13.25 Ko)

Bonjour

1er problème, il faut bien spécifier le classeur, et bloquer les événements (sinon boucle sans fin)

Remplaces les macros dans le fichier "Registe.xls" par celles-ci

Private Sub Worksheet_change(ByVal Target As Excel.Range)
  Application.EnableEvents = False
  Call Test
  Application.EnableEvents = True
End Sub

Private Sub Test()
Dim LastLigne As Long, i As Long

  dateAujourdhui = Date
  Application.ScreenUpdating = False
  With ThisWorkbook.Worksheets(1)
    LastLigne = .Cells(.Rows.Count, 1).End(xlUp).Row
    For i = 2 To LastLigne
      .Range("E2:E" & LastLigne).Value = dateAujourdhui
    Next i
  End With
End Sub

2ème problème tu ne triais que les colonnes A à D (la colonne date n'était modifiée)

Remplaces la macro actuelle par celle-ci

Private Sub cmdValidation_Click()

  'Appel de la procédure CreerNom du modEnregistrement
  Call CreerNOM(cboNom.Value, cboListe.Value, txtDate.Value, txtDateActuelle.Value)

  'tri et enregistrement du repertoire
  With Classeur.Sheets(1)
    .Range("A2:E" & .Range("A1").End(xlDown).Row + 1).Sort Key1:=.Range("A2"), Key2:=.Range("B2")
  End With
  Classeur.Save

End Sub

Exactement le résultat que j'attendais et encore une fois merci bien.

Une autre petite question, la macro fonctionne très bien lorsque que la ligne 2 de mon classeur "Registre" est renseignée.

Par contre lorsqu'elle est vide, après enregistrement j'ai le message Erreur d'exe '6' Dépassement de capacité.

Le débogage me désigne la ligne suivante du moduleEnregistrement que j'ai jointe en image. Une petite idée?

erreur exe 6 ligne debogage

Bonjour

Oui c'est (à mon avis) un défaut de cette fonction

Si qu'une ligne de remplie ou aucune cette fonction renvoie la dernière ligne de la feuille

Solution

tester la ligne suivante : Dans ce cas ta macro

Public Sub CreerNOM(Nom As String, Prenom As String, DateValide As Date, DateActuelle As Date)
Dim LigneAjout As Long

  With classeur.Sheets(1)
    If .Range("A2") <> "" Then
      LigneAjout = .Range("A1").End(xlDown).Row + 1
    Else
      LigneAjout = 2
    End If
    .Range("A" & LigneAjout).Value = Nom
    .Range("B" & LigneAjout).Value = Prenom
    .Range("C" & LigneAjout).Value = DateValide
    .Range("D" & LigneAjout).Value = DateActuelle
  End With
End Sub

Autre solution : Si pas de données après la dernière ligne

Public Sub CreerNOM2(Nom As String, Prenom As String, DateValide As Date, DateActuelle As Date)
Dim LigneAjout As Long

  With classeur.Sheets(1)
    LigneAjout = .Range("A" & Rows.Count).End(xlUp).Row + 1
    .Range("A" & LigneAjout).Value = Nom
    .Range("B" & LigneAjout).Value = Prenom
    .Range("C" & LigneAjout).Value = DateValide
    .Range("D" & LigneAjout).Value = DateActuelle
  End With
End Sub

Pour information : tes variables lignes déclarent les en Long (évitera des ennuis si cette valeur dépasse 32 767)

Tout cela me semble parfait, néanmoins pour le bon usage et avancement dans mon projet.

Je te remercie bien.

Sur ce bon week-end à tous

Erwan,

Rechercher des sujets similaires à "execution macro changement valeur feuille"