Итерация по столбцам в VBA (Excel) - PullRequest
1 голос
/ 29 июля 2010

Когда я набрал этот заголовок, я наткнулся на множество разделов справки, посмотрел несколько из них и получил основную идею. Я все еще застрял, и поэтому создаю новый пост, чтобы получить руководство.

Сценарий таков:

Мой лист Excel содержит букву Y или N в A1, текст B1 и действительную будущую дату в C1.

В настоящее время у меня есть сценарий VBA, который делает это для одной строки:

Проверяет, является ли (дата в C1-15 днях) сегодняшней датой, а затем проверяет, имеет ли A1 значение N. Если оба эти условия выполняются, отправьте автоматическое электронное письмо.

Чего я не знаю, так это как сделать так, чтобы оно функционировало для n строк?

Вот то, что у меня есть сейчас.

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 = "someemailaddress@yahoo.com,"
    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

Цикл по клеткам - это то, что я не могу понять. У меня даже есть логика ..

  1. Отметьте все ячейки (i, 3), где i от 1 до последней непустой строки.
  2. Дата манипуляции - 15 дней для всех данных в ячейке (i, 3).
  3. Если какой-либо из них совпадает с сегодняшним днем, проверьте соответствующий столбец (i, 1).
  4. Если этот конкретный (i, 1) установлен на N, тогда активируется электронная почта.

У меня есть флаг mSend. Первоначально оно будет равно 0. Если выполнено 4-е условие, я установлю его на 1, а затем проверю значение mSend, прежде чем инициировать электронную почту.

Кто-то, пожалуйста, руководство.

1 Ответ

3 голосов
/ 29 июля 2010

Я сам понял:)

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

Спасибо! * * 1004

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...