
※当サイトにはアフィリエイト広告が含まれます。本記事の本文に広告リンクはありませんが、記事の前後にサイト共通の広告が表示されます。
先に結論
エクセルの自動転記は、転記元を読み取り専用で開き、書き込む先を新しく作った別ブックだけに限定します。この分け方さえ守れば、何度自動転記を走らせても、提出用の様式ファイルは1度も書き換わりません。壊れるのが怖くて手作業を続けている人にこそ、この順番が効きます。
毎月、決まった様式のエクセルに、同じ場所から同じ数字を手で写す。項目を目で追い、セルを1つずつ埋めていく。終わったあとに、写し間違いがないか頭から見直す。この時間、本当は要りませんよね。
ただ、手間よりも重いものがもう1つあります。自動化に手を出した結果、提出用の空白様式を上書き保存してしまう不安です。配布元から受け取った様式は、壊しても自分では作り直せません。だから「自動化したい」と思いながら、毎月手で写す側に戻ってしまう。私も最初はそこで止まっていました。
どのセルをどこへ写すかは、AIにも書かせられます。その手順はエクセルの対応表をAIに渡すときの見せ方にまとめました。対応表まで自分で作る人は、ここは飛ばして構いません。
この記事で紹介するのは、私が実務で書いて今も毎月動かしている転記スクリプト群のやり方です。中身はPowerShellが26本とJavaScriptが1本、合計5,226行あります。守っている決まりはたった1つで、転記元には絶対に書き込まないこと。以下では、その分け方と、そこに至るまでに踏んだ失敗をそのまま書きます。
無料テンプレ配布中
AIにExcelを正確に指示する
2枚見せテンプレ
転記の指示をAIに投げるとき、言葉で説明しても伝わりません。今の表と、欲しい表。この2枚の渡し方だけをまとめました。 AIが行をこっそり飛ばしていないか確かめる検算3チェックもつけています。
LINEでテンプレを受け取る友だち追加するとすぐにリンクが届きます。いつでもブロックできます。
エクセルの自動転記で別ブックへ書き出すには何が必要?
用意するものは3つだけです。数字の出どころになる転記元のブック、出力先として新しく作る別ブック。そして「どのセルの値をどのセルへ入れるか」を並べた対応表です。この3つがそろえば準備は終わりです。あとはWindows標準のPowerShellがExcelを操作します。
追加で入れるソフトは要りません
追加でソフトを入れる必要はありません。Excel COMは、PowerShellからExcelを動かす仕組みです。ExcelがインストールされたWindowsなら標準で使えます。新しいツールの申請が通らない職場でも、ここは止まりません。
転記元と出力先を混ぜない
私が書いた27本を数え直しました。新しいブックを作って出力するものが13本。先にコピーを作り、そのコピーへ書き込むものが3本。読み取りだけで保存しないものが10本です。転記元をそのまま上書きするのは1本だけ。そこは動かす前に必ず控えを取ります。この差が、あとで自分を助けます。
マクロ禁止でも自動化できる?4つの手段を比べた
できます。マクロ有効ブックとは、拡張子がxlsmのファイルです。これを1つも作らずにエクセルの転記を自動化できます。エクセル 転記 自動化で検索すると、VBAとマクロの解説が先に並びます。私も最初はそれしかないと思い込んでいました。実際にはPower Automateでも組めます。Office スクリプト(Office Scripts)という手もあります。この記事で使うPowerShellも選択肢の1つです。
| 手段 | マクロ禁止の職場で使えるか | 覚える量 | 元の様式を壊す危険 |
|---|---|---|---|
| VBAマクロ | 使えないことが多い(xlsmが持ち込み禁止になりやすい) | 多い | 高い(様式ファイルの中にコードが入る) |
| 関数だけ(VLOOKUPなど) | 使える | 少ない | 中くらい(様式のセルを数式で埋める必要がある) |
| PowerShellとExcel | 使える(標準機能のみ) | 中くらい | 低い(様式は読むだけに固定できる) |
| Pythonとopenpyxl | Pythonの導入許可が必要 | 多い | 低い |
PowerShellを選んだ理由は2つ
1つ目は、様式ファイルの中にコードを入れずに済むことです。転記の手順はテキストファイル1枚に外出しされるので、様式は配布されたままの状態を保てます。2つ目は、追加の導入申請が要らないこと。Pythonとopenpyxlの組み合わせも壊す危険は低いです。ただ実務で使うには「入れていいか」の確認から始まります。
関数だけで組む案をやめた理由
提出用の様式に数式を書き込むことになり、提出前に値へ貼り直す手間が毎回増えるからです。自動化したいのに手作業が1工程増えるなら、意味が薄いと判断しました。
別ブックへ自動転記する5工程
ここからは実際のコードです。メモ帳に貼って拡張子ps1で保存し、右クリックから実行すれば動きます。私が実務で書いた形をそのまま短くしたもので、固有の業務名だけ差し替えてあります。
工程1 先に控えを取る
$Src = "C:\work\genpon.xlsx"
$Dest = "C:\work\teishutsu.xlsx"
$BackupDir = "C:\work\backup"
$stamp = Get-Date -Format "yyyyMMdd_HHmmss"
$backup = Join-Path $BackupDir ("genpon_" + $stamp + ".xlsx")
Copy-Item $Src $backupコードを1行も書く前に、Get-DateからCopy-Itemまでの3行を先に置いてください。ファイル名に秒までの日時が入るので、実行するたびに別の控えが残ります。同じ名前で上書きされる心配がありません。
工程2 転記元を読み取り専用で開く
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
# 第3引数が ReadOnly。ここが $true だと書き込みを受け付けない
$srcBook = $excel.Workbooks.Open($Src, $false, $true)
$srcSheet = $srcBook.Worksheets.Item(1)Openの3番目の引数をtrueにすると、転記元は読み取り専用になります。この1文字が、様式を壊さないための鍵です。仮にこのあとのコードに書き込みの命令が混ざっていても、Excel側が受け付けません。人の注意力ではなく、機械の側で止める形にしておきます。
VisibleとDisplayAlertsはfalseにします。画面を出さず、確認ダイアログを2つとも黙らせるためです。自動で回すときに「上書きしますか」の問いが出ると、そこで処理が止まります。朝まで待つことになります。
工程3 出力先として新しいブックを作る
$outBook = $excel.Workbooks.Add()
$outSheet = $outBook.Worksheets.Item(1)
$outSheet.Name = "tenki"Addは、まっさらなブックをメモリ上に1つ増やす命令です。ここが「書き込んでよい唯一の場所」になります。既存の様式ファイルを開いて上書きするやり方と比べると、失敗しても捨てるだけで済みます。
工程4 値を入れる
# 文字は string、数値は double に明示して入れる
$outSheet.Cells.Item(1, 1).Value2 = [string]$srcSheet.Cells.Item(3, 2).Value2
$outSheet.Cells.Item(1, 2).Value2 = [double]$srcSheet.Cells.Item(3, 5).Value2書き込みにはValueではなくValue2を使います。Value2は日付や通貨の書式を通さず、生の値だけを受け渡す窓口です。書式の解釈が挟まらないので、転記の結果が環境ごとに変わりません。
行頭の角カッコでstringとdoubleを指定しているのは、型を人間が決め切るためです。指定しないと、見た目は数字なのに文字列として入る事故が起きます。この指定を入れてからは、合計欄が0円になる症状が出なくなりました。
工程5 保存して目的地へ移す
# 51 は xlsx の形式コード
$name = "out_" + [guid]::NewGuid().ToString("N").Substring(0, 6) + ".xlsx"
$tmp = Join-Path $env:TEMP $name
$outBook.SaveAs($tmp, 51)
$outBook.Close($false)
$srcBook.Close($false)
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null
Move-Item $tmp $Dest -Force保存先を一度TEMPフォルダにしているのは、クラウド同期の影響を避けるためです。同期フォルダへ直接SaveAsすると、書き込みに失敗することがあります。Quitのあとに1行だけReleaseComObjectを書いています。裏に残ったExcelを終了させるためです。これを省くと、タスクマネージャーにExcelが積み上がっていきます。
無料テンプレ配布中
AIにExcelを正確に指示する
2枚見せテンプレ
ここまでのコードを自分の様式に当てはめるとき、セルの対応をAIに書かせると速く済みます。ただ、言葉で説明しても伝わりません。今の表と、欲しい表。この2枚の渡し方だけをまとめました。 AIが行をこっそり飛ばしていないか確かめる検算3チェックもつけています。
LINEでテンプレを受け取る友だち追加するとすぐにリンクが届きます。いつでもブロックできます。
保存が失敗するのはなぜ?一時フォルダを経由する理由
保存先がクラウド同期フォルダだと、SaveAsがそのまま通らないことがあります。OneDriveやGoogle ドライブの同期対象になっているフォルダです。同期の仕組みがファイルを見張っているあいだ、Excelが書き込みの権限を取れずに失敗します。
原因が同期だと気づくまでの遠回り
私はこれで2度つまずきました。手で開けば普通に保存できるのに、スクリプトから走らせると同じ場所で落ちる。原因が同期だと気づくまで、コードの書き方をあちこち疑って時間を使いました。今はスクリプトの中にコメントを残しています。「クラウド同期フォルダへ直接SaveAsが通らないため、一時フォルダを経由する」。
一時フォルダを経由させれば通る
対処はかんたんです。いったんWindowsの一時フォルダへ保存します。Excelを終了させてから、Move-Itemで目的地へ移します。ファイルの移動はExcelではなくWindowsの仕事なので、同期の見張りと競合しません。ファイル名には6桁のGUIDを混ぜています。同じ時刻に2回走らせても、名前がぶつからないようにするためです。
保存でつまずいたときの見分け方
保存先がOneDriveやGoogle ドライブの同期フォルダなら、まずデスクトップ直下を保存先にして試してください。それで通るなら原因は同期です。コードの書き方ではありません。
エクセルの自動転記でつまずくのはどこ?2点と直し方
数字なのに文字列で入ってしまう
転記した先で合計が0になる。セルの左上に緑の三角が出る。この症状は、数字が文字列として入ったサインです。転記元のセルに空白や全角の数字が混ざっていると起きやすくなります。
直し方は、書き込む側で型を宣言しておくことです。金額や人数のセルには角カッコでdoubleを付け、名前や区分のセルにはstringを付けます。数字になるべき値が空欄だったときは、0を入れるか、そのセルを飛ばすかを先に決めておきます。決めないまま走らせると、空欄が文字列の空文字として入り、あとの計算式が全部おかしくなります。
途中で止まったとき、どこで止まったか分からない
赤い英語のメッセージが流れて画面が閉じる。これが一番手が止まる場面です。私は次のtrapブロックを全部のスクリプトの先頭に置いています。落ちた行番号が出るので、直す場所がすぐ分かります。
trap {
Write-Host ("STOP line " + $_.InvocationInfo.ScriptLineNumber)
Write-Host $_.Exception.Message
if ($excel) { $excel.Quit() }
exit 1
}
if (-not (Test-Path $Src)) {
Write-Host "source file not found"
exit 1
}trapの中でQuitを呼んでいるのが大事なところです。途中で落ちたとき、裏で開いたままのExcelが残ります。それに気づかず次を走らせると、ファイルが使用中で開けないと言われて、また原因探しが始まります。落ちるときも必ず片付ける形にしておけば、この往復が消えます。
後半のTest-Pathは4行だけです。転記元のファイルが見つからないとき、その場で終わらせます。ファイル名を1文字間違えただけでも、これがないとExcelを起動してから落ちます。入り口で止める方が、あとの追跡が楽になります。
様式のドロップダウンは、書く前に一覧で抜き出す
提出用の様式には、選択肢から選ぶセルが混ざっています。入力規則が設定されたセルです。ここに一覧に無い文字を書き込むと、見た目は入ったのに、提出先の集計で弾かれます。
選択肢は3行で吐き出せる
私は書き込みの前に、選択肢を吐き出すだけのスクリプトを1本挟むようにしました。3行で済みます。
$cell = $sh.Cells.Item(21, 11)
$list = $cell.Validation.Formula1
Write-Host $listFormula1に入っているのが、そのセルで許されている文字列です。カンマ区切りで並んで出てきます。これを見てから、転記の対応表の右側を「一覧にある表記そのまま」で書き直します。半角と全角の違い、送り仮名のゆれ、末尾の空白。落ちるのはほとんどこの3種類です。
セル位置のずれも同じ場所で気づける
様式が改定されて行が1つ増えると、狙ったセルが別の項目になります。一覧を出したときに知らない選択肢が並んでいたら、それは行がずれたサインです。
去年の提出分から、答えだけを引き抜く
毎年出す書類なら、去年の提出分が一番いい参照元になります。配布されたままの空白様式と、去年提出した控えを、同じ行と同じ列で突き合わせます。値が違うセルだけが、去年あなたが書き込んだ答えです。
$last = $sh.UsedRange.Rows.Count + $sh.UsedRange.Row - 1
for ($r = 2; $r -le $last; $r++) {
$prev = $prevSheet.Cells.Item($r, 3).Value2
$blank = $blankSheet.Cells.Item($r, 3).Value2
if ($prev -ne $blank) {
Write-Host ("row " + $r + " has an answer")
}
}UsedRangeで最後の行を取る
1行目のUsedRangeは、値が入っている範囲の最後の行を出す書き方です。RowsのCountだけでは、表が2行目から始まっていたときに1行足りなくなります。Rowを足して1を引く形にしておけば、表の開始位置がずれていても最後の行に届きます。
様式が改定された年こそ差分が効く
去年の控えをそのまま流用すると、行が増減していた場合に全部ずれます。空白様式との比較にしておけば、ずれている行がその場で浮かびます。私はこの形で、去年の記入内容の洗い出しを手作業から外しました。
セルの対応を書き出す作業そのものは、AIに任せると速く終わります。ただ、渡し方に決まりがあります。今の表と欲しい表の見せ方はAIにExcelの状態を伝える指示の書き方でまとめました。指示が曖昧だと、AIは行をこっそり飛ばします。
この自動転記が向かない3つの場面
良いところだけ書くのは不誠実なので、弱点も出します。私が書いた27本にも、そのまま残っている弱点があります。
様式が改定されるとセル位置がずれる
セル位置は21行11列のように数字で直接書いています。様式の行が1つ増えれば、狙った場所が別の項目に変わります。見出しの文字からセルを探す書き方にすれば防げます。ただ、コードは長くなります。私は今のところ、改定のたびに数字を直す側を選んでいます。年に1回か2回なら、そのほうが早いからです。
ExcelのないサーバーやMacでは動かない
Excel COMは、Excel本体を裏で起動して操作する仕組みです。ExcelのないサーバーやMacでは動きません。サーバー上で動かしたい人は、別の道具を選ぶほうが先に進みます。Pythonのopenpyxlや、Node.jsのライブラリです。
数千行を超えると待ち時間が出る
1セルずつ値を渡す書き方なので、数千行を回すと待ち時間が出ます。私の用途は月1回か年1回の書類で、行数も百単位です。この規模なら遅さは気になりません。数万行を毎日処理したい人には向きません。
向いている条件
Excelが入ったWindowsで、月1回から年1回、数百行までの書類を同じ様式へ写している。この3つに当てはまるなら、別ブックへの自動転記はこの記事の手順がそのまま使えます。当てはまらないなら、別の手段を先に検討してください。
無料テンプレ配布中
AIにExcelを正確に指示する
2枚見せテンプレ
自分の様式でどのセルをどこへ写すか、対応表を作るところが一番面倒です。そこをAIに書かせるための渡し方を1枚にまとめました。 AIが行をこっそり飛ばしていないか確かめる検算3チェックもつけています。
LINEでテンプレを受け取る友だち追加するとすぐにリンクが届きます。いつでもブロックできます。
明日から真似する手順のまとめ
エクセルの自動転記で別ブックへ書き出す手順は、5つです。控えを取る。転記元を読み取り専用で開く。出力先のブックを新しく作る。値を入れる。一時フォルダへ保存してから目的地へ移す。この順番を守れば、提出用の様式は1度も書き換わりません。
最初の1本はセル2つだけで試す
まずはセルを2つだけ写すところから始めてください。私も最初はそうしました。2つが正しく入ったのを目で確認してから、対応表の行を増やしていきます。いきなり全項目を書こうとすると、どこで間違えたのか分からなくなります。
自動化しても確認の目は残す
私は出力したブックを開いて、合計欄と件数だけは毎回見ます。自動で作ったものをそのまま提出しないというだけで、事故はほとんど防げます。手で写す時間は消えて、確認の時間だけが残る。これが今の私のやり方です。
次の一歩に進む記事
コードを書く部分をAIに任せたいなら、ChatGPTとClaudeを非エンジニア目線で比較した記事を先に読んでください。転記のコードを書かせるなら、どちらを選ぶかで手間が変わります。
自動化を仕事として受けるところまで考えているなら、AI主導でWordPressの予約決済まで受託した実録が参考になります。私が実際に納品した案件の中身です。
この手の自動化を小さく稼ぐ入口にしたい人は、Claude Code副業を非エンジニアが始める手順と単価相場を見てください。Excel作業の代行は、実際に募集がある仕事です。
エクセルの自動転記でよく出てくる疑問
受託で書いているあいだに、同じ質問を何度も受けました。そのまま並べます。どれも実際に手が止まった場所です。
エクセルの自動転記はマクロなしでもできますか?
できます。私が実務で動かしているのは、Windows標準のPowerShellです。ここからExcelを操作しています。マクロを禁止している職場でも、ファイル自体にマクロを持たせずに自動転記が回ります。
転記元のブックが書き換わらないようにするには?
転記元は読み取り専用で開いてください。Workbooks.Openの引数で読み取り専用を指定します。スクリプトが途中で落ちても、元のブックには何も書き込まれません。
別ブックへ保存したあと、ファイルが開けなくなりました
保存形式の指定漏れが原因です。SaveAsのファイル形式を指定しないと起きます。拡張子だけxlsxにしても、中身と拡張子が食い違ったファイルができます。xlOpenXMLWorkbookを明示してください。
自動転記で数字が文字列として入ってしまいます
セルの表示形式が文字列のまま値を入れると、右寄せにならず合計も出ません。値を入れる直前にNumberFormatLocalを数値の形式へ変えてから代入すると直ります。
転記先の様式にドロップダウンがある場合はどうしますか?
書き込む前に、選べる候補を一覧で抜き出してください。Range.Validationから候補を取り出し、転記したい値がその中にあるかを先に照合します。候補外の値を入れると、後から人が開いたときに弾かれます。
自動転記を走らせる前に何を控えておけばいいですか?
転記元のブックのコピーを1つ取ってください。私はスクリプトの先頭でCopy-Itemを実行し、日時を付けた控えを別フォルダに残しています。これがあると、失敗しても手作業に戻らずに済みます。
Excelを開いたままでも自動転記は動きますか?
同じファイルを開いていると保存でつまずきます。転記先のブックは閉じてから走らせてください。私は一時フォルダに書いてから目的地へ移す形にして、開きっぱなしの事故を避けています。
途中でエラーで止まったとき、どこまで書けたか分かりますか?
何行目まで書いたかを記録すれば分かります。私は1行ごとに転記した位置をログへ追記し、trapで止まった行番号を残すようにしました。これを入れる前は、毎回先頭から目で追っていました。
自動転記の対応表はどこまでAIに任せられますか?
対応表の下書きまでは任せられます。ただし出来上がった表は人が1度見てください。私が試した範囲では、似た名前の項目をAIが取り違えることがありました。行数が合っているかの検算は必須です。
出典
- Workbooks.Open メソッド(Excel VBA リファレンス)
- Workbook.SaveAs メソッド(Excel VBA リファレンス)
- XlFileFormat 列挙(保存形式の一覧)
- Range.NumberFormatLocal プロパティ(表示形式)
- Range.Validation プロパティ(入力規則の取得)
- Worksheet.UsedRange プロパティ(使用範囲の取得)
- about_Try_Catch_Finally(PowerShell のエラー処理)
- Copy-Item(PowerShell でファイルを複製する)
- Move-Item(PowerShell でファイルを移動する)
上記はいずれもMicrosoft Learnの公式ドキュメントです。2026年9月25日に全URLの表示を確認しました。公開日: 2026年9月25日 / 最終更新日: 2026年9月25日




















