2017-08-24 3820 views
0

我有一个单元格A1中的公式是"=C1+$D$1"。我想用xlwings将这个公式复制到A3(保留相对单元格引用)。我希望单元格A3中的粘贴公式为"=C3+$D$1"而不是"=C1+$D$1"Python xlwings复制粘贴公式与相对单元格引用

是否有一个标志或函数会根据我们粘贴的范围调整公式?如果没有,我想最好的解决方案是在粘贴前处理公式本身。

rng_to_paste = ws.range('A1').options(ndim=1).formula 
ws.range('A3').options(ndim=1).formula = rng_to_paste 
+0

您正在按照原样复制公式值。事实上,你必须处理公式本身,或者更简单地分配一个**新的公式来反映你的例子中的当前行。 – stovfl

回答

0

我的解决方法是调用Excel宏为我做复制粘贴。尝试将Worksheet和Range对象传递给宏时发生错误,因此我的代码只使用字符串标识符。

的Python

def copypaste_range(wb_string, 
       ws_source_string, 
       rng_to_copy_string, 
       ws_destination_string, 
       rng_to_paste_string): 
import xlwings as xw 
xw.App.display_alerts = False 
folder = r'D:\My Documents' 
xls_path = folder + r'\xlwings_macros.xlsb' 
wb_macros = xw.Book(xls_path) 
wb_macro = wb_macros.macro('copypaste_range') 
wb_macro(wb_string, 
     ws_source_string, 
     rng_to_copy_string, 
     ws_destination_string, 
     rng_to_paste_string) 
xw.App.display_alerts = True 
wb_macros.close() 

VBA

Public Sub copypaste_range(wb_string, _ 
         ws_source_string, rng_to_copy_string, _ 
         ws_destination_string, rng_to_paste_string) 

Dim wb As Workbook 
Dim fso As New FileSystemObject 
If Not IsWorkBookOpen(wb_string) Then 
    Set wb = Workbooks.Open(fileName:=wb_string) 
Else 
    wb_string = fso.GetFileName(wb_string) 
    Set wb = Workbooks(wb_string) 
End If 

Dim rng_to_copy As Range 
Dim rng_to_paste As Range 
Set rng_to_copy = wb.Sheets(ws_source_string).Range(rng_to_copy_string) 
Set rng_to_paste = wb.Sheets(ws_destination_string).Range(rng_to_paste_string) 

rng_to_copy.Copy _ 
    Destination:=rng_to_paste 

End Sub 
0

可以指定将更新隐式分配单元在已调整的式(S)的范围内的范围的公式属性。但是,使用此方法,xlwings不知道从哪里复制公式,所以它只能相对于分配的公式递增行/列。

xw.sheets[0].range('A1:A5').value = [[i] for i in range(5)] 
xw.sheets[0].range('B1:C5').formula = [['=A1+1','=B1*10']] 

xw.sheets[0].range('A1:C5').value 
Out[3]: 
[[0.0, 1.0, 10.0], 
[1.0, 2.0, 20.0], 
[2.0, 3.0, 30.0], 
[3.0, 4.0, 40.0], 
[4.0, 5.0, 50.0]]