2017-08-24 526 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]] 
相關問題