VBA截图过滤后的Excel并发送到迭代中的每一行

VBA截图过滤后的Excel并发送到迭代中的每一行,vba,excel,email,screenshot,Vba,Excel,Email,Screenshot,我想在Excel中运行一个宏,在许多行中循环,对具有此人姓名的电子表格应用过滤器,拍摄屏幕截图,并向具有该屏幕截图的人员发送电子邮件 我当前的代码不会遍历某个范围(仅1条记录),也不会截图并插入电子邮件 非常感谢您的帮助 我当前的代码: Sub SendEmailtoEachResource_Click() ' Macro - Intended functionality ' For each person (resource) apply a filter to the 'Allocatio

我想在Excel中运行一个宏,在许多行中循环,对具有此人姓名的电子表格应用过滤器,拍摄屏幕截图,并向具有该屏幕截图的人员发送电子邮件

我当前的代码不会遍历某个范围(仅1条记录),也不会截图并插入电子邮件

非常感谢您的帮助

我当前的代码:

Sub SendEmailtoEachResource_Click()
' Macro  - Intended functionality
' For each person (resource) apply a filter to the 'Allocation'
' tab, and take a screenshot.  Send an email with the screenshot
' to each person.




   Dim Resoucename As String
   Dim ResouceEmail As String


   'Current State: Apply filter, and send 1 email to the below details
   ResourceName = Range("D4")
   resourceEmail = Range("E4")




   'ACTION - Future State:
                'For each person in column D
                'Send email to email address on same row in Coumn E
   '             ##Start Loop


    'Go to Allocation Tab, Apply Filter of resouce name
    Sheets("Allocation").Select
    Range("A1:BH28").Select
    ActiveSheet.Range("$A$8:$BI$826").AutoFilter Field:=5, Criteria1:= _
        ResourceName
    ActiveWindow.SmallScroll Down:=-21
    ActiveWindow.ScrollRow = 9
    Range("A1:BV836").Select

    '  ACTION: Take Screenshot of filtered results



'setup email
 Dim aOutlook As Object
    Dim aEmail As Object
    Dim outlookResName As String
    Dim SendAddress As String


    Set aOutlook = CreateObject("Outlook.Application")
    Set aEmail = aOutlook.CreateItem(0)
    outlookResName = ActiveCell.Value
    SendAddress = "me@email.com"
    aEmail.To = resourceEmail
    aEmail.Subject = "Resource assignment Report for " & ResourceName



    aEmail.HTMLBody = "Your report is below {Insert Screenshot}"
    'ACTION: Paste screenshot HERE

aEmail.display
 ' Will change to .send when VBA is working fully. This could send ~100 emails



   '  ## End LOOP




End Sub

在我看来,这里有两个问题可以归结为一个:(1)如何循环浏览电子表格的行;(2)如何截图并将其插入电子邮件。也许你应该考虑发表两个单独的问题。 考虑到这一点,我将解决循环问题。有很多方法可以实现你想要的

A) 你可以用行号

For i = 7 To 9
    ResourceName = Cells(i, 4)
    ResourceEmail = Cells(i, 5)
    ' The rest of your code here
Next i
B) 您可以从第一行开始,一直向下移动,直到找到一个空单元格

i = 7
Do Until Cells(i, 4) = ""
    ResourceName = Cells(i, 4)
    ResourceEmail = Cells(i, 5)
    ' The rest of your code here
    i = i + 1
Loop
C) 您可以为包含资源列表的单元格指定一个名称(比如“resources”),并循环遍历其行

Set MyList = ActiveWorkbook.Names("resources").RefersToRange
For Each person In MyList.Rows
    ResourceName = person.Cells(1, 4)
    ResourceEmail = person.Cells(1, 5)
    ' The rest of your code here
Next person

你为什么不选择一种方法,然后我们看看我们从那里走到哪里?

在我看来,你有两个问题集中在一个问题中:(1)如何循环浏览电子表格的行,以及(2)如何截图并将其插入电子邮件。也许你应该考虑发表两个单独的问题。 考虑到这一点,我将解决循环问题。有很多方法可以实现你想要的

A) 你可以用行号

For i = 7 To 9
    ResourceName = Cells(i, 4)
    ResourceEmail = Cells(i, 5)
    ' The rest of your code here
Next i
B) 您可以从第一行开始,一直向下移动,直到找到一个空单元格

i = 7
Do Until Cells(i, 4) = ""
    ResourceName = Cells(i, 4)
    ResourceEmail = Cells(i, 5)
    ' The rest of your code here
    i = i + 1
Loop
C) 您可以为包含资源列表的单元格指定一个名称(比如“resources”),并循环遍历其行

Set MyList = ActiveWorkbook.Names("resources").RefersToRange
For Each person In MyList.Rows
    ResourceName = person.Cells(1, 4)
    ResourceEmail = person.Cells(1, 5)
    ' The rest of your code here
Next person

你为什么不选择一种方法,然后我们看看我们从那里走到哪里?

你能分享一个数据/电子表格的例子吗?请阅读。提供一个代码转储并告诉我们它不能做什么,而不实际显示您为此所做的努力,这超出了SO的范围,特别是在您需要的复杂性级别。你也可以一次问三个问题。我建议您一步一步地进行,并尝试对每个步骤进行编码。如果您在某个特定问题上遇到困难,请发布一个关于该特定问题的问题。道歉,并指出Scott您可以分享您的数据/电子表格的示例吗?请阅读。提供一个代码转储并告诉我们它不能做什么,而不实际显示您为此所做的努力,这超出了SO的范围,特别是在您需要的复杂性级别。你也可以一次问三个问题。我建议您一步一步地进行,并尝试对每个步骤进行编码。如果你在某个特定的问题上遇到了困难,就发布一个关于这个特定问题的问题。道歉,并注明ScottHi Raquel。完美的我用了C),它工作得很好。我只是不知道如何让截图工作很高兴能帮上忙。至于屏幕截图问题,我从未尝试过类似的方法,但是,由于可以使用PrtScr键拍摄屏幕截图,我相信Application.SendKeys应该可以做到这一点。我的建议是,您先尝试一下,然后,如果您仍然卡住了,可以发布一个单独的问题来展示您的代码,即使它根本不起作用。这样你可能会得到更多的答案。嗨,拉克尔。完美的我用了C),它工作得很好。我只是不知道如何让截图工作很高兴能帮上忙。至于屏幕截图问题,我从未尝试过类似的方法,但是,由于可以使用PrtScr键拍摄屏幕截图,我相信Application.SendKeys应该可以做到这一点。我的建议是,您先尝试一下,然后,如果您仍然卡住了,可以发布一个单独的问题来展示您的代码,即使它根本不起作用。这样你可能会得到更多的答案。