在Excel中复制范围时,PasteSpecial不保留源格式

时间:2019-07-17 13:16:28

标签: excel vba access-vba outlook-vba

我要将一系列单元格从现有工作簿复制到临时工作簿,并希望保留源工作簿的确切格式。 我正在使用Ron de Bruin的RangetoHTML函数的修改版本。

目的是将范围从源工作簿复制到邮件正文。

但是,当我运行宏时,它仅将值中的范围粘贴到邮件中。所有其他粘贴类型的PasteSpecial要么失败,要么给出相同的结果。

我尝试过PasteSpecial方法的每种粘贴类型都没有运气。

如果我尝试为PasteSpecial函数指定更多参数,则会引发1004错误(不过,我不需要使用默认值以外的任何东西)。

源工作簿已经合并了单元格,但是我尝试删除了合并的单元格,但这并没有改变输出。

此代码被多次调用,因为我要插入其他工作簿中的范围。结果始终是正确的范围,但没有格式。

它是从Access运行的,因为我正在尝试从表单运行此脚本。它在公共模块中,并在另一个模块中创建邮件正文时被调用。 这是删除注释时引发错误的部分摘录:

client.cmd("wget http://%s:8000/DCN.py &" % server.IP())

我希望范围显示在邮件正文中,与源工作簿相同。

尽管我进行了所有尝试,但我似乎找不到任何可以阻止复制格式的代码问题。

编辑

如果我更改行:

import pandas as pd

df_prices = pd.read_csv('data/prices.csv', delimiter = ',')


# sample data from prices.csv 
# date,symbol,open,close,low,high,volume
# 2010-01-04,PCLN,222.320007,223.960007,221.580002,225.300003,863200.0
# 2010-01-04,PDCO,29.459999,28.809999,28.65,29.459999,1519900.0
# 2010-01-04,PEG,33.139999,33.630001,32.889999,33.639999,5130400.0
# 2010-01-04,PEP,61.189999,61.240002,60.639999,61.52,6585900.0
# 2010-01-04,PFE,18.27,18.93,18.24,18.940001,52086000.0
# 2010-01-04,PFG,24.110001,25.0,24.1,25.030001,3470900.0
# 2010-01-04,PG,61.110001,61.119999,60.630001,61.310001,9190800.0


df_latest_prices = df_prices.groupby('symbol').last()

df_latest_prices.iloc[115]

# date      2014-02-07
# open           54.26
# close          55.28
# low            53.63
# high           55.45
# volume    3.8587e+06
# Name: CTXS, dtype: object

df_latest_prices.iloc[115].volume

# 3858700.0

df_latest_prices.iloc[115].Name

# ---------------------------------------------------------------------------
# AttributeError                            Traceback (most recent call last)
# <ipython-input-8-6385f0b6e014> in <module>
# ----> 1 df_latest_prices.iloc[115].Name

至:

Public Function RangetoHTML(rng As Range)
' Changed by Ron de Bruin 28-Oct-2006

    Dim xlApp As Excel.Application
    Dim TempWB As Excel.workbook

    Set TempWB = xlApp.Workbooks.Add(1)
    rng.Copy 'This is passed as an argument of the RangetoHTML function
    TempWB.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteValues ', Operation:=-4142, SkipBlanks:=True, Transpose:=False
    TempWB.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteFormats ', Operation:=-4142, SkipBlanks:=True, Transpose:=False
    TempWB.Worksheets(1).Range("A1").PasteSpecial Paste:=xlPasteColumnWidths ', Operation:=-4142, SkipBlanks:=True, Transpose:=False

'The rest is similar to the original version of RangetoHTML

    'Close TempWB
    TempWB.Close savechanges:=False
    xlApp.Quit

    Set TempWB = Nothing
    Set xlApp = Nothing

End Function

然后输出格式正确,但是有一个Excel实例在子结束后仍在任务管理器中保持打开状态。

1 个答案:

答案 0 :(得分:1)

如果要保留格式,则需要使用xlPasteAllxlPasteAllUsingSourceTheme值。参见XlPasteType enumeration