首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何筛选主工作簿以表而不是文件的形式发送结果?

如何筛选主工作簿以表而不是文件的形式发送结果?
EN

Stack Overflow用户
提问于 2019-11-27 00:19:06
回答 1查看 264关注 0票数 0

我的任务是筛选主工作簿,将结果发送给各自的收件人。将位于工作簿中的电子邮件的收件人和正文。

我必须发送50多封电子邮件,结果在表格格式,超过50个不同的收件人。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Option Explicit

Sub split()

    Dim wswb As String
    Dim wssh As String

    Dim vColumn As Variant

    Dim i As Integer
    Dim vcounter As Variant
    Dim vfilter As String

    wswb = ActiveWorkbook.Name
    wssh = ActiveSheet.Name

    vColumn = InputBox("Select Column to Filter", "Column Selection")

    Columns(vColumn).Copy
    Sheets.Add

    ActiveSheet.Name = "Working_Magic"
    Range("A1").PasteSpecial

    Columns("A").RemoveDuplicates Columns:=1, Header:=xlYes

    vcounter = Range("A" & Rows.Count).End(xlUp).Row

    For i = 2 To vcounter
        vfilter = Sheets("Working_Magic").Cells(i, 1)
        Sheets(wssh).Activate
        ActiveSheet.Columns.AutoFilter field:=Columns(vColumn).Column, Criteria1:=vfilter
        Cells.Copy
        Workbooks.Add
      
        Range("A1").PasteSpecial
        If vfilter <> "" Then
            ActiveWorkbook.SaveAs ThisWorkbook.Path & "\DSAttachments_to_email\" & vfilter
        Else
            ActiveWorkbook.SaveAs ThisWorkbook.Path & "\DSAttachments_to_email\_Empty"
        End If
        ActiveWorkbook.Close
        Workbooks(wswb).Activate
    
    Next i
    Sheets("Working_Magic").Delete
    
End Sub

我不需要将附件保存在上述代码所示的文件夹中,而是将报告发送给所有相应的收件人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-27 08:55:03

我会使用两种方法中的一种,将范围转换为HTML表并将其插入到电子邮件中,或者使用SendKeys '^c', true,然后使用SendKeys '^v', true。我的首选是第一个选项,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sub LoopThroughTable()

    Set ws = ActiveSheet

    For i = 2 To Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
        email_to = Sheet1.Cells(i, 5).Value
        email_subject = Sheet1.Cells(i, 4).Value

        folder_path = Sheet1.Cells(i, 2).Value

        Set FSO = CreateObject("Scripting.FileSystemObject")
        'Set fld = FSO.GetFolder(folder_path)
        If FSO.FolderExists(folder_path) Then
            'Nothing, folder is good
        Else
            'Just save to desktop
            folder_path = CreateObject("WScript.Shell").SpecialFolders("Desktop")
            Sheet1.Cells(i, 2).Value = folder_path
        End If

        If Right(folder_path, 1) <> "\" Then
            Sheet1.Cells(i, 2).Value = folder_path & "\"
        End If

        file_path = Sheet1.Cells(i, 2).Value & Sheet1.Cells(i, 3).Value

        sheet_name = Sheet1.Cells(i, 1).Value
        sheet_name_range = Sheet1.Cells(i, 9).Value
        Dim table_range As Range
        Dim range_string As String
        range_string = Sheet1.Cells(i, 10)
        Set table_range = Sheets(sheet_name_range).Range(range_string) 'Range("A3:C8") 'etc.

        email_body = Sheet1.Cells(i, 8).Value & "<br><br>" & ConvertRangeToHTMLTable(table_range)

        CopySheetAndSave sheet_name, file_path

        SendOutlookMessage email_to, email_subject, file_path, email_body
        ThisWorkbook.Activate
    Next i

    ws.Activate

End Sub

Sub CopySheetAndSave(ByVal sheet_name As String, ByVal full_path As String)

    SheetName = sheet_name
    FullPath = full_path

    Sheets(SheetName).Select
    Sheets(SheetName).Copy
    'ChDir "C:\Users\username\Downloads"
    Workbooks(Workbooks.Count).SaveAs Filename:=FullPath, FileFormat:= _
        xlOpenXMLWorkbook, CreateBackup:=False
    Workbooks(Workbooks.Count).Close
End Sub


Sub SendOutlookMessage(ByVal email_to As String, ByVal email_subject As String, ByVal file_path As String, ByVal email_body As String)

    emailTo = email_to
    emailSub = email_subject
    FullPath = file_path
    HTMLBODY = email_body

    DoEvents
    Application.Wait 1

    Dim olApp As Object
    Dim olMail As Object

    Set olApp = CreateObject("Outlook.Application")
    Set olMail = olApp.CreateItem(0)
    With olMail
        .to = emailTo
        .Subject = emailSub
        .Attachments.Add (FullPath)

        .HTMLBODY = HTMLBODY
        DoEvents

        .Display
        Application.Wait 1
        .Send

    End With

    Application.Wait 1

    Set olMail = Nothing
    Set olApp = Nothing

End Sub

'Following function converts Excel range to HTML table
'Taken from https://excelsirji.com/vba-code-to-convert-excel-range-into-html-table/
Public Function ConvertRangeToHTMLTable(rInput As Range) As String
    'Declare variables
    Dim rRow As Range
    Dim rCell As Range
    Dim strReturn As String
    'Define table format and font
    strReturn = "<Table border='1' cellspacing='0' cellpadding='7' style='border-collapse:collapse;border:none'>  "
    'Loop through each row in the range
    For Each rRow In rInput.Rows
        'Start new html row
        strReturn = strReturn & " <tr align='Center'; style='height:10.00pt'> "
        For Each rCell In rRow.Cells
            'If it is row 1 then it is header row that need to be bold
            If rCell.Row = 1 Then
                strReturn = strReturn & "<td valign='Center' style='border:solid windowtext 1.0pt; padding:0cm 5.4pt 0cm 5.4pt;height:1.05pt'><b>" & rCell.Text & "</b></td>"
            Else
                strReturn = strReturn & "<td valign='Center' style='border:solid windowtext 1.0pt; padding:0cm 5.4pt 0cm 5.4pt;height:1.05pt'>" & rCell.Text & "</td>"
            End If
        Next rCell
        'End a row
        strReturn = strReturn & "</tr>"
    Next rRow
    'Close the font tag
    strReturn = strReturn & "</font></table>"
    'Return html format
    ConvertRangeToHTMLTable = strReturn
End Function

注意,这个ConvertRangeToHTMLTable不是我的函数,它来自:https://excelsirji.com/vba-code-to-convert-excel-range-into-html-table/

我有一个助手/加载器函数LoopThroughTable,用来发送和Sheet1上表格中一样多的电子邮件,如下所示:

请注意,我也发送了一个特定的工作表只作为附件,但您可以修改该代码,以删除该部分,如果你不希望这样做。任何问题请在评论中提出,如果这解决了您的问题,请考虑将其标记为正确答案。

附于此处的Excel表格:https://drive.google.com/file/d/1yO0HvonMV6HHyLRjmHS2PHVquIDvjI5S/view?usp=sharing

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59061287

复制
相关文章
PL/SQL 下SQL结果集以html形式发送邮件
      在运维的过程中,有时候需要定时将SQL查询的数据结果集以html表格形式发送邮件,因此需要将SQL查询得到的结果集拼接成html代码。对于这种情形通常有二种方式来完成。一是直接使用cron job来定时轮询并借助os级别的邮件程序来完成。其查询结果集可以直接在SQL*Plus下通过设置html标签自动实现html表格形式。一种方式是在Oracle中使用scheduler job来定时轮询。这种方式需要我们手动拼接html代码。本文即是对第二种情形展开描述。
Leshami
2018/08/13
9780
PL/SQL 下SQL结果集以html形式发送邮件
ExcelVBA汇总多工作簿中指定工作表到新工作簿
哆哆Excel
2023/09/09
4750
ExcelVBA汇总多工作簿中指定工作表到新工作簿
ExcelVBA筛选法按分类条件拆分一个工作表为多个工作簿
对上次的文章进行优化 ==========代码如下===== Sub 筛选拆分() Dim d As Object, sht As Worksheet, arr, brr, r, kr, i&, j&, k&, x& Dim Rng As Range, Rg As Range, tRow&, tCol& Dim wb As Object, mysht As Worksheet Set d = CreateObject("scripting.dictionary") 'se
哆哆Excel
2022/10/31
3.6K1
VBA代码:拆分工作簿示例——将工作簿中的每个工作表保存为单独的工作簿
只需在要拆分的工作簿中运行上述代码,就可将该工作簿中的所有工作表全部保存为单独的工作簿。
fanjy
2022/06/04
4.1K0
VBA代码:拆分工作簿示例——将工作簿中的每个工作表保存为单独的工作簿
示例工作簿分享:仿自动筛选的搜索框
下面分享的是两个非常好的作品,在Excel中使用VBA实现在组合框或列表框中进行自动筛选,就像我们在用百度搜索时那样,随着用户的输入,会逐渐减少相匹配的下拉列表项,以方便用户快速进行选择。
fanjy
2023/10/23
2520
示例工作簿分享:仿自动筛选的搜索框
VBA实例一、工作簿按表拆分成多个工作簿
大家好,本节主要介绍,通过VBA程序,将单个工作簿中的多个工作表,按表拆分成多个独立工作簿。
无言之月
2022/11/11
3.8K0
VBA实例一、工作簿按表拆分成多个工作簿
示例工作簿分享:可自动筛选的组合框
这是一个很好的Excel工作簿开发示例,来自于ozgrid.com论坛。该示例实现了:可以通过选择单元格区域来提供组合框中的下拉列表值,这些值就是所选单元格区域中的内容;可以在组合框中输入内容来自动筛选组合框中的下拉列表,就像网页搜索中随着输入逐步缩小提示内容一样;并且还可以修改标题、修改提示;等等。如下图1所示。
fanjy
2023/10/04
2870
示例工作簿分享:可自动筛选的组合框
Java保护Excel工作簿和工作表
出于安全原因,你可能需要保护整个工作簿或工作表。 有时,你甚至可能还需要保护某个工作表,但却保留指定的单元格进行编辑。 本文将介绍如何使用Free Spire.XLS for Java来实现这些操作。
崔笑颜
2020/06/08
1.5K0
修改iview的标签为i-的形式而不是驼峰的形式
iview组件库中,通过Vue.use注册了iview到项目中后,在组件内调用iview组件时默认都是通过CamelCase的方式引用iview组件的,HTML本身是大小写不敏感的,vue官网也推荐在template中使用kebab-case标签,iview官网也提供了修改的方法,具体操作如下:
fastmock
2022/07/13
8620
自动合并工作簿中各工作表数据
合并多表数据是工作中常见的情形。本文介绍一种在Excel及Power BI中不使用任何公式,快速合并一个工作簿中多个工作表的方法。
wujunmin
2021/09/07
1.6K0
自动合并工作簿中各工作表数据
常用功能加载宏——一个工作簿的工作表另存为工作簿
前面实现了多个工作簿和合并到一个工作簿的功能,反过来,将一个工作簿里的工作表,另存为多个工作簿,然后分发给不同的人,应该也是经常会碰到的。让我们看看使用VBA如何实现:
xyj
2020/07/28
1.6K0
常用功能加载宏——一个工作簿的工作表另存为工作簿
ExcelVBA请按班别拆分为工作簿(筛选复制法)
请按班别拆分为工作簿 Sub 筛选拆分() Dim d As Object, sht As Worksheet, arr,brr, r, kr, i&, j&, k&, x& Dim Rng As Range, Rg As Range, tRow&,tCol&, aCol&, pd&, Cll As Range Dim wb As Object, mysht As Worksheet Set d =CreateObject("scripting.dictionary") '
哆哆Excel
2022/10/31
4560
如何把windows上的文件以web的形式发布出去
这种方式适用于同一局域网内,并且还要安装python,在一切都准备好之后,便可以使用以下命令来从别的电脑下载我们主机上的文件了
dogfei
2020/07/31
1.1K0
Excel-VBA复制工作表到新工作簿方法
如:在文件“自动工具.xlsx”中有一个工作表为“模板”。我想在“模板”工作表中输入数据,再另存为一个新的文件为“小龙女.xlsx”
哆哆Excel
2022/10/31
11.7K0
Excel小技巧31:引用工作表或工作簿
在使用公式时,我们可以引用不同工作表甚至是不同工作簿中的单元格或单元格区域。其一般语法是:
fanjy
2020/04/02
2K0
VBA: 将多个工作簿的第一张工作表合并到一个工作簿中
文章背景: 在工作中,有时需要将多个工作簿进行合并,比如将多份原始数据附在报告之后。一般的操作方法是打开两个工作簿(目标工作簿和待转移的工作簿),然后选中需要移动的工作表,右键单击以后选择“移动或复制”。接下来在新的对话框里面进行设置。
Exploring
2022/09/20
6.2K0
VBA:  将多个工作簿的第一张工作表合并到一个工作簿中
快速汇总多个工作簿/工作表中的数据(Excel工具推荐)
很多数据散落在很多工作表或者工作簿中,由于某项工作我们需要将这些数据做个汇总。比方,我们有以下三个工作簿
wujunmin
2021/09/07
10.9K1
快速汇总多个工作簿/工作表中的数据(Excel工具推荐)
Power Query-汇总文件夹中多工作簿多工作表到一个文件
如果当excel为电子表格的人,做了一辈子的工作也是重重复复的“复制—粘贴”的工作,因为Excel中有VBA编程的功能,能使用很多重复的工作一个小程序是搞掂,所以就是“Excel”了。
哆哆Excel
2022/10/25
2.1K0
Power Query-汇总文件夹中多工作簿多工作表到一个文件
Excel: 受保护的工作表使用筛选功能
文章背景:工作生活中,有时很多人都会用到同一份模板文件。为了防止文件内的公式被修改,以及单元格的误删除,往往都会给文件设置保护。受保护的同时,希望可以正常使用筛选等功能。
Exploring
2022/09/20
3.8K0
Excel:  受保护的工作表使用筛选功能
点击加载更多

相似问题

保护工作表而不是工作簿

21

以xlsx的形式保存在工作簿中而不是目录中

11

以csv文件形式发送结果

115

保存工作表而不是完整的工作簿

24

写入新工作簿而不是现有工作簿中的工作表

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文