2017-09-27 8 views
-1

Bonjour, j'ai besoin de créer 2 macros privées dans un classeur - une qui stocke le contenu de la cellule après avoir cliqué dessus et une autre qui va stocker la nouvelle valeur de la cellule et l'envoyer avec le corps ancien texte dans la cellule et nouveau texte dans la cellule.Private Sub Worksheet_SelectionChange/Worksheet_Change

En vérité, je ne sais pas si c'est la bonne façon de le faire (ou même si c'est possible) mais je ne travaille pas souvent avec des macros privées, donc j'apprécierai toute aide. Merci beaucoup!

Voilà ce que je suis arrivé à ce jour:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
If Target.Cells.Count > 1 Then Exit Sub 
OldCellValue = ActiveCell.text 
old_value = OldCellValue 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim Area As Range 
Dim OutlApp As Object 
Dim IsCreated As Boolean 
Dim cell As String 
Dim old_value As String 
Dim new_value As String 

Set Area = Range("A1:E20") 

If Target.Cells.Count > 1 Then Exit Sub 

If Not Intersect(Target, Area) Is Nothing Then 

cell = ActiveCell.Address 
new_value = ActiveCell.text 

On Error Resume Next 
Set OutlApp = GetObject(, "Outlook.Application") 
If Err Then 
    Set OutlApp = CreateObject("Outlook.Application") 
    IsCreated = True 
End If 
OutlApp.Visible = True 
On Error GoTo 0 

With OutlApp.CreateItem(0) 

    .Subject = "Change in table" 
    .to = "someones email" 
    .HTMLBody = "Change in cell " & "<B>" & cell & "</B><br>" _ 
       & "Old value: " & old_value & "New value: " & new_value 

    On Error Resume Next 
    .Send 
    Application.Visible = True 
    On Error GoTo 0 

End With 

If IsCreated Then OutlApp.Quit 

Set OutlApp = Nothing 

End With 

End If 

End Sub 
+0

Quel est votre problème - le code ne fonctionne pas, ne pas faire ce que vous voulez ....? – SJR

+0

Ce code ne fonctionne pas. Il chargera le texte de la cellule quand je clique mais quand j'apporterai une modification et appuierai sur Entrée, il passera à la rangée suivante qui changera variable sur old_value. Parfois, il affichait même une cellule vide dans old_value même s'il y avait du texte dans la cellule et dans la cellule en dessous. –

Répondre

0

pas ré-écrire tout votre code, mais en substance, vous devez le faire pour stocker la valeur lorsque la cellule est sélectionnée, puis après avoir été changé . Vous n'avez pas besoin de la variable newcellvalue car la cible la capture.

Dim OldCellValue 

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim newcellvalue 

newcellvalue = Target.Value 

MsgBox "Old " & OldCellValue & ", New " & newcellvalue 

End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

OldCellValue = Target.Value 

End Sub 
+1

Ça a marché! La variable globalement favorable et les cibles l'ont fait fonctionner parce que sinon le code de mine était le même. Merci beaucoup pour votre aide. Marquer votre message comme une réponse pour toute personne qui aurait besoin d'aide dans ce domaine. –

+0

Merci. Oui, j'aurais dû mentionner que le fait d'en faire une variable globale est la chose principale. – SJR

0

Je pense que vous êtes sur la bonne voie. J'utiliserais une variable globale pour suivre la valeur actuelle/ancienne afin que vous puissiez le comparer dans l'événement Worksheet_Change.

Quelque chose comme ceci:

Private old_value As String 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

    If Target.Cells.Count > 1 Then Exit Sub 

    old_value = Target.Text 

    'Debug to check the old_value 
    'Debug.Print "old_value = " + old_value 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim Area As Range 
    Dim OutlApp As Object 
    Dim IsCreated As Boolean 
    Dim cell As String 
    Dim new_value As String 

    Set Area = Range("A1:E20") 

    If Target.Cells.Count > 1 Then Exit Sub 

    If Not Intersect(Target, Area) Is Nothing Then 
     new_value = Target.Text 

     'Debug to compare values 
     'Debug.Print "new_value = " + new_value 
     'Debug.Print "old_value = " + old_value 

     If new_value <> old_value Then 
      'Debug to compare 
      'Debug.Print "new_value and old_value are different" 
     End If 
    End If 
End Sub 

Gardez à l'esprit que l'événement Worksheet_SelectionChange va tirer à chaque fois que vous naviguez entre les cellules. Ainsi, si vous modifiez la valeur d'une cellule et que vous appuyez sur la touche Entrée, la valeur de old_value va changer car vous réinitialisez la valeur dans l'événement Worksheet_SelectionChange. Vous devez effectuer la comparaison et envoyer l'e-mail avant que la sélection ne change.

De même, vous voudrez probablement utiliser .Value pour la cellule au lieu de .Text. Voir cet article pour les différences: What is the difference between .text, .value, and .value2?

+0

Merci beaucoup pour votre aide. L'utilisation de la variable globale était la clé pour le faire fonctionner. –