Ans. 申し訳ございません。Python記述にバグがありました。
<変更前>
def get_sheet_name(): s=daydef[制約開始日] year_str=s[0:4] month=int(s[5:7]) sheet_name=year_str+'年'+str(month)+'月' print("シート名=",sheet_name) return sheet_name def get_year(): s=daydef[制約開始日] year_str=s[0:4] return int(year_str) def get_year_str():#DEC202024 追加 s=daydef[制約開始日] year_str=s[0:4] return year_str def get_month(): s=daydef[制約開始日] month=int(s[5:7]) return month def get_day(): s=daydef[制約開始日] day=int(s[8:10]) return day def find_address(moncal,D): row=0 for r in moncal: if D not in r: row+=1 continue return (row,r.index(D)) #次月最初の日:最終行の最終列+1を出す tuple=find_address(moncal,D-14) row=tuple[0]+2 col=tuple[1] print("find_address",row,col) return (row,col) raise IndexError def init_row_columns(): global start_row global start_column global row_interval global column_interval start_row=6 start_column=2 row_interval=6 column_interval=2 def findcell(ws,moncal,D): tuple=find_address(moncal,D) init_row_columns() row=start_row+row_interval*tuple[0] column=start_column+column_interval*tuple[1] c=namedtuple("Row","Column") c.Row=row c.Column=column return c def clear_cells(ws): init_row_columns() for r in range(6): for d in range(7): row=start_row+r*row_interval column=start_column+d*column_interval print(row,column) ws.Cells(row ,column+1).Value="" ws.Cells(row ,column).Value="" ws.Cells(row+1,column+1).Value="" ws.Cells(row+1,column).Value="" ws.Cells(row+2,column+1).Value="" ws.Cells(row+2,column).Value="" ws.Cells(row+3,column).Value="" ws.Cells(row+4,column).Value="" def post_main(): print('\n\n*********ポスト処理を実行中です。*************\n') import win32com.client#pywin32をインポート #すでにExcelが起動されている場合はそのタスクが使われる #エラー終了するとタスクは残ります try : xl = win32com.client.Dispatch("Excel.Application") except: print("can not invoke excel") exit() #動いている様子を見てみる xl.Visible = False #file=get_open_file_name("Open Excel File") #print(file) os.chdir(project_file_path) filename=get_year_str()+"当直拘束表.xlsx";##DEC202024 BUG FIX "2024当直拘束表.xlsx" file=os.path.join(project_file_path,filename) file1=file.replace("/","\\") #なぜか逆スラッシュでないと動かない print(file1) wb = xl.Workbooks.Open(file1) # Excelシートオブジェクト ws = wb.Worksheets(get_sheet_name()) # 指定したシートを選択 # Select()の使用前にシートのActivate()が必要 ws.Activate() calendar.setfirstweekday(6)#日曜日を最初に mon_cal=calendar.monthcalendar(get_year(),get_month())#行列でリスト print(findcell(ws,mon_cal,1)) clear_cells(ws) for day in 今月区間: D=day-制約開始日+1 print(D) c=findcell(ws,mon_cal,D) n=findcell(ws,mon_cal,D+1) #print(c.Row,c.Column) day_solution_analysis(ws,c,n,day) wb.Close(True)# Trueで保存。False=Defaultでブックを保存せずにクローズ # Excel終了 xl.Quit() print('\n\n*********ポスト処理を実行終了しました。*************\n')
<変更後記述>
def get_sheet_name(): s=daydef[制約開始日] year_str=s[0:4] month=int(s[5:7]) sheet_name=year_str+'年'+str(month)+'月' print("シート名=",sheet_name) return sheet_name def get_year(): s=daydef[制約開始日] year_str=s[0:4] return int(year_str) def get_year_str():#DEC202024 追加 s=daydef[制約開始日] year_str=s[0:4] return year_str def get_month(): s=daydef[制約開始日] month=int(s[5:7]) return month def get_day(): s=daydef[制約開始日] day=int(s[8:10]) return day def find_address(moncal,D): row=0 for r in moncal: if D not in r: row+=1 continue return (row,r.index(D)) #次月最初の日:最終行の最終列+1を出す tuple=find_address(moncal,D-14) row=tuple[0]+2 col=tuple[1] print("find_address",row,col) return (row,col) raise IndexError def init_row_columns(ws):#DEC272024 global start_row global start_column global row_interval global column_interval test_range= ws.Range("A1:C9")#DEC272024 ### example if you want to find out the column of search result #ResultColumn= test_range.Find("Series ID").Column #print(str(ResultColumn)) sun=test_range.Find("日")#DEC print("日アドレス=",sun.Row,sun.Column) start_row=sun.Row+2# 6 start_column=sun.Column#2 row_interval=6 column_interval=2 def findcell(ws,moncal,D): tuple=find_address(moncal,D) init_row_columns(ws) row=start_row+row_interval*tuple[0] column=start_column+column_interval*tuple[1] c=namedtuple("Row","Column") c.Row=row c.Column=column return c def clear_cells(ws): init_row_columns(ws) for r in range(6): for d in range(7): row=start_row+r*row_interval column=start_column+d*column_interval print(row,column) ws.Cells(row ,column+1).Value="" ws.Cells(row ,column).Value="" ws.Cells(row+1,column+1).Value="" ws.Cells(row+1,column).Value="" ws.Cells(row+2,column+1).Value="" ws.Cells(row+2,column).Value="" ws.Cells(row+3,column).Value="" ws.Cells(row+4,column).Value="" def post_main(): print('\n\n*********ポスト処理を実行中です。*************\n') import win32com.client#pywin32をインポート #すでにExcelが起動されている場合はそのタスクが使われる #エラー終了するとタスクは残ります try : xl = win32com.client.Dispatch("Excel.Application") except: print("can not invoke excel") exit() #動いている様子を見てみる xl.Visible = False #file=get_open_file_name("Open Excel File") #print(file) os.chdir(project_file_path) filename=get_year_str()+"当直拘束表.xlsx";##DEC202024 BUG FIX "2024当直拘束表.xlsx" file=os.path.join(project_file_path,filename) file1=file.replace("/","\\") #なぜか逆スラッシュでないと動かない print(file1) wb = xl.Workbooks.Open(file1) # Excelシートオブジェクト ws = wb.Worksheets(get_sheet_name()) # 指定したシートを選択 # Select()の使用前にシートのActivate()が必要 ws.Activate() calendar.setfirstweekday(6)#日曜日を最初に mon_cal=calendar.monthcalendar(get_year(),get_month())#行列でリスト print(findcell(ws,mon_cal,1)) clear_cells(ws) for day in 今月区間: #D=day-制約開始日+1 D=day-制約開始日+get_day()#DEC272024 BUG FIX #print(D) c=findcell(ws,mon_cal,D) n=findcell(ws,mon_cal,D+1) print("Day=",D,c.Row,c.Column) day_solution_analysis(ws,c,n,day) wb.Close(True)# Trueで保存。False=Defaultでブックを保存せずにクローズ # Excel終了 xl.Quit() print('\n\n*********ポスト処理を実行終了しました。*************\n')
mainのDの記述を暦日に修正しました。また、init_row_columnsで、日曜日の「日」を検索・検出してそれを基準に
Excelデータを記述するように変更しました。
0 件のコメント:
コメントを投稿