Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用Ron de Bruin'时,从电池中移除不必要的线路;s';范围为HTML';_Excel_Vba_Outlook - Fatal编程技术网

Excel 使用Ron de Bruin'时,从电池中移除不必要的线路;s';范围为HTML';

Excel 使用Ron de Bruin'时,从电池中移除不必要的线路;s';范围为HTML';,excel,vba,outlook,Excel,Vba,Outlook,我已根据自己的需要修改了Ron de Bruin在邮件正文中的邮件范围/选择代码(从Excel范围到HTML Outlook)。罗恩的代码可以在这里找到: 请参阅此图: 工作表中的范围是根据用户在UserForm中提供的输入开发的。“注释”列包含用户输入的注释,这些注释可能跨越多行。例如,D8在UserForm的文本框中包含用户输入的注释。要在新行上输入注释,用户在文本框中使用Shift+enter 现在,Excel(D8)中的一切看起来都很好。但在使用Ron的过程将此范围转换为HTML并显示

我已根据自己的需要修改了Ron de Bruin在邮件正文中的邮件范围/选择代码(从Excel范围到HTML Outlook)。罗恩的代码可以在这里找到:

请参阅此图:

工作表中的范围是根据用户在UserForm中提供的输入开发的。“注释”列包含用户输入的注释,这些注释可能跨越多行。例如,D8在UserForm的文本框中包含用户输入的注释。要在新行上输入注释,用户在文本框中使用Shift+enter

现在,Excel(D8)中的一切看起来都很好。但在使用Ron的过程将此范围转换为HTML并显示在Outlook的电子邮件正文中之后,在每条注释之间添加了一行

如何阻止这种情况发生或删除这些不必要的附加行

注意:我没有对罗恩的代码进行重大修改。我已经按原样使用了它,除了一些小的调整和选择范围从A1到DN,其中N是最后一行数据(在本例中为8)

代码

Sub SendReport(shtname As String, nrows As Long, name As String)

Dim sht As Worksheet, wsdata As Worksheet
Dim sendrng As Range, rngdata As Range

'Set data sheet
Set wsdata = ThisWorkbook.Worksheets("Data")
Set rngdata = wsdata.Range("A2").CurrentRegion
Set sht = ThisWorkbook.Sheets(shtname)

'Select range to send
Set sendrng = Nothing
On Error Resume Next
Set sendrng = sht.Range("A1:D" & 6 + nrows)
On Error GoTo 0
If sendrng Is Nothing Then
    msg = MsgBox("Invalid selection or protected sheet!" & vbCrLf & _ 
    "Please correct and try again.", vbOKOnly + vbCritical, "Email Report")
    Exit Sub
End If

Application.EnableEvents = False
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

'Email To and CC details
emailcc = ""
factory = Application.WorksheetFunction.VLookup(name, rngdata, 2, False)
If factory = "Gas" Then
    emailto = wsdata.Range("K7").Value
ElseIf factory = "Electricity" Then
    emailto = wsdata.Range("K8").Value
End If

'Email, RangetoHTML
On Error Resume Next
With OutMail
    .To = emailto
    .CC = emailcc
    .BCC = ""
    .Subject = "Report: " & sht.Range("4").Value & ", " & 
sht.Range("B4").Value
    .HTMLBody = RangetoHTML(sendrng)
    .Display
    '.Send
End With
On Error GoTo 0

Application.EnableEvents = True
Application.ScreenUpdating = True
Set OutMail = Nothing
Set OutApp = Nothing

'Confirm send to user
msg = MsgBox("Report sent through Outlook. Check 'Sent Items'.", _ 
vbOKOnly + vbInformation, "Email Report")

End Sub

'---------------------------------------------------------------------
Function RangetoHTML(rng As Range)

Dim fso As Object
Dim ts As Object
Dim TempFile As String
Dim TempWB As Workbook

TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

'Copy the range and create a new workbook to paste the data in
rng.Copy
Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)
    .Cells(1).PasteSpecial Paste:=8
    .Cells(1).PasteSpecial xlPasteValues, , False, False
    .Cells(1).PasteSpecial xlPasteFormats, , False, False
    .Cells(1).Select
    Application.CutCopyMode = False
    On Error Resume Next
    .DrawingObjects.Visible = True
    .DrawingObjects.Delete
    On Error GoTo 0
End With

'Publish the sheet to a htm file
With TempWB.PublishObjects.Add( _
     SourceType:=xlSourceRange, _
     Filename:=TempFile, _
     Sheet:=TempWB.Sheets(1).name, _
     Source:=TempWB.Sheets(1).UsedRange.Address, _
     HtmlType:=xlHtmlStatic)
    .Publish (True)
End With

'Read all data from the htm file into RangetoHTML
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
RangetoHTML = ts.readall
ts.Close
RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", "align=left x:publishsource=")

'Close TempWB
TempWB.Close savechanges:=False

'Delete the htm file we used in this function
Kill TempFile

Set ts = Nothing
Set fso = Nothing
Set TempWB = Nothing

End Function
编辑:2020年5月1日

我注意到这个问题只发生在线条几乎达到整个单元格宽度的单元格中。我对所有列使用Range.AutoFit,然后为B、C和D设置宽度。这是我用于格式化的代码:

'Final formatting
sht.Range("A1:D" & 6 + nrows).Font.Size = 10
sht.Range("A1:D" & 6 + nrows).Font.Name = "Arial"
sht.Columns("A:D").AutoFit
sht.Columns("B").ColumnWidth = 18
sht.Columns("C").ColumnWidth = 18
sht.Columns("D").ColumnWidth = 80
sht.Range("D7:D" & 6 + nrows).WrapText = True
sht.Range("A1").Select
这可能是问题的根源吗

编辑:2020年5月5日


根据@teylyn的建议,我复制了表格并打开了Word中的隐形字符。在每行的末尾,似乎还有一个额外的回车字符。如何删除这些内容?

@BigBen,当然,我也会添加代码。在我看来,电子邮件中注释行之间的额外空间可能是由于段落样式在段落之前和/或之后使用空格造成的。你查过了吗?@teylyn,我查过Excel和Outlook中的段落样式。我认为这不是问题所在。如果是,我将如何从代码中控制它?在Excel中,当达到单元格宽度时的换行符是已知的。不可见换行字符占用空间并导致换行。显然,你电子邮件中的额外一行不是同一个原因。正如我所说,在Word中检查它以了解其原因。@BigBen,当然,我也会添加代码。在我看来,电子邮件中注释行之间的额外空间可能是由于段落样式在段落之前和/或之后使用空格造成的。你查过了吗?@teylyn,我查过Excel和Outlook中的段落样式。我认为这不是问题所在。如果是,我将如何从代码中控制它?在Excel中,当达到单元格宽度时的换行符是已知的。不可见换行字符占用空间并导致换行。显然,你电子邮件中的额外一行不是同一个原因。正如我所说,用文字来检查它,以了解它的原因。