2010-07-29 9 views
1

Lorsque j'ai tapé ce titre, je suis tombé sur de nombreux sujets d'aide et j'en ai cherché quelques-uns et j'ai eu une idée de base. Je suis toujours coincé et c'est pourquoi créer un nouveau poste pour obtenir des conseils.Itérer dans les colonnes de VBA (Excel)

Scénario est la suivante:

feuille Mon Excel a lettre Y ou N en A1, un texte dans B1 et une date ultérieure valable en C1.

J'ai actuellement un script VBA qui le fait pour une seule ligne:

Vérifie si la (date en C1 -15 jours) est la date d'aujourd'hui, puis vérifier si A1 est N. Si ces deux conditions sont vraies puis envoyez un e-mail automatique.

Qu'est-ce que je ne sais pas est, Comment puis-je le faire fonctionner pour un nombre de lignes?

Voici ce que j'ai à partir de maintenant.

Sub SendAlert() 
'Set up the objects required for Automation into lotus notes 
    Dim Maildb As Object 'The mail database 
    Dim UserName As String 'The current users notes name 
    Dim MailDbName As String 'The current users notes mail database name 
    Dim MailDoc As Object 'The mail document itself 
    Dim AttachME As Object 'The attachment richtextfile object 
    Dim Session As Object 'The notes session 
    Dim EmbedObj As Object 'The embedded object (Attachment) 
    Dim stSignature As String 
    Dim i As Integer 
    Dim lastRow As Long 

    'Start a session to notes 
    Set Session = CreateObject("Notes.NotesSession") 

    'Get the sessions username and then calculate the mail file name 
    'You may or may not need this as for MailDBname with some systems you 
    'can pass an empty string 
    UserName = Session.UserName 
    MailDbName = Left$(UserName, 1) & Right$(UserName, (Len(UserName) - InStr(1, UserName, " "))) & ".nsf" 

    'Open the mail database in notes 
    Set Maildb = Session.GETDATABASE("", MailDbName) 
    If Maildb.IsOpen = True Then 
      'Already open for mail 
    Else 
     Maildb.OPENMAIL 
    End If 

    'Set up the new mail document 
    Set MailDoc = Maildb.CREATEDOCUMENT 
    MailDoc.Form = "Memo" 

    'Setting Flag to decide whether to send the mail or not 
    mSend = 0 

    'Copying Cells - Cell A1 as Copying Status , Cell B1 as Pending Tasks Cell C1 as Deadline Date 
    cStatus = cStatus & Cells(1, 1) 
    Msg = Msg & Cells(1, 2) 
    dDate = dDate & Cells(1, 3) 

    **'Looping through the cells** 
    lastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row 'Gets the last row number 
    For i = 1 To lastRow 
     if & Cells(i,1) = "N" 


    'Attach Your Signature 
    stSignature = "Regards," & vbCrLf & "Some Name" 

    'MailDoc.Recipient = Recipient 
    Addressee = "[email protected]," 
    Recipient = Split(Addressee, ",") 
    MailDoc.sendto = Recipient 

    'MailDoc.Subject = Subject 
    MailDoc.Subject = "Pending Activities Report" 

    'MailDoc.Body = BodyText 
    MailDoc.Body = "Dear NXC Team," & vbCrLf & vbCrLf & "Here are the pending activities:" & vbCrLf & vbCrLf & Msg & vbCrLf & vbCrLf & stSignature 

    'MailDoc.SAVEMESSAGEONSEND = SaveIt 
    MailDoc.SAVEMESSAGEONSEND = True 

    'Send the document 
    If (DateAdd("d", -15, dDate) = Date) And (cStatus = "N") Then 
    MailDoc.SEND 0, Recipient 
    End If 

    'Clean Up 
    Set Maildb = Nothing 
    Set MailDoc = Nothing 
    Set AttachME = Nothing 
    Set Session = Nothing 
    Set EmbedObj = Nothing 
End Sub 

Boucler les cellules est ce que je ne peux pas comprendre. J'ai même la logique ..

  1. Vérifiez toutes les cellules (i, 3) où i est de 1 jusqu'à la dernière rangée non vide.
  2. Date de manipulation - 15 jours pour toutes les données de la cellule (i, 3).
  3. Si l'un de ceux-ci correspond à aujourd'hui, vérifiez sa colonne correspondante (i, 1).
  4. Si cette valeur particulière (i, 1) est définie sur N, déclenchez l'e-mail.

J'ai un drapeau mSend. Il sera initialement 0. Si la 4ème condition est satisfaite, je la mettrai à 1 et ensuite je vérifie la valeur de mSend avant de déclencher l'e-mail.

Quelqu'un s'il vous plaît guide.

Répondre

3

je me l'ai :)

lastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row 'Gets the last row number 
For i = 1 To lastRow 
    If DateAdd("d", -15, Cells(i, 3)) = Date Then 
     If Cells(i, 1) = "N" Then 
      mSend = 1 
      Msg = Msg & Cells(i, 2) 
     End If 
    End If 
Next i 

Merci!

+0

Bingo. Vous pouvez même vous débarrasser de l'une de ces boucles If en utilisant "Si A = B et C = D alors ..." – PowerUser