転記用にExcel操作(範囲コピー)を拡張してみた
これから転記のシナリオを作るかたや、転記目的で、コピペ、変数を経由した値の取得/設定、繰り返しを使ってるシナリオを運用中のかた向けです。
Excel操作(範囲転記)を作りました。
お裾分けです。
このへんのトピックに、軒並み適用できる想定です。
長いです。ミニマムで★だけで試せます。
ライブラリ加工の練習にも適したレベル感です。
もし値だけの転記で充分ならお試しください。
- 書式とかは大抵は運用でカバーできるはず(予め指定しておくとか、条件付き書式とか)
転記作業に対する思い
「世の中から転記作業なんて無くなれば良いのに...」と日々思ってます。
- 元データが使い易ければ良いだけの話(元データをそのまま使えるのが理想)
- システムとか、データの作り手が、初めからデータを使うユーザーの要望も聴く
- ユーザー部門がシステムの計画段階から一枚噛む
- 働き方改革の時代、これが当たり前になってくるはず
- 転記しなきゃいけない時代はいずれ終焉
- もうしばらくは辛抱が必要なのかも
- システムの入出力(入力/取得/抽出の類)は、CSVインポート/エクスポートとかAPIとかに対応していないと、RPAによる転記も検討せざるを得ない
- 非システム、特にExcel周りの転記は、ラストワンマイルとしてRPAが担いがち
- セル/行/列/のコピペ、変数を経由した値の取得/設定、繰り返しは、RPAらしい反面、効率が気になる
- せめて手作業より効率的にしたい
- Excel操作(範囲転記)はここにフォーカス
考えかた
- 値の一括代入が速い(きっと最速かと)
- 最下部のリファレンスサイト参照
- 転記のトピックで同じ手法を紹介済み(既成ライブラリの組み合わせで)
★ベースライブラリ
- Excel操作(書式を含めたコピー)内、Excel操作(範囲コピー)
Excel操作(範囲転記)のカバー範囲(ベースライブラリに準ずる)
- Excel ⇔ CSV
- Excel ⇔ Excel
- CSV ⇔ CSV
★加工のポイント
- ファイルの処理を複製
- 先頭からメイン処理のこの行↓の手前までを複製
worksheet.range(range).COPY - 複製したほうのすべての変数の末尾に1を追記
変数がオブジェクトと同じ表記みたいなワナがあるので、取り違えに注意
range(range)
この場合は、カッコの外側はオブジェクト、内側が変数
- 先頭からメイン処理のこの行↓の手前までを複製
- 変数の表示名を修正
- 変数の表示名の案
転記元ファイル名
転記元シート名
転記元開始セル
転記元終了セル
転記先ファイル名 ← ここから複製したほう
転記先シート名
転記先開始セル
転記先終了セル - コメントやエラーメッセージの扱い
変数の表示名を踏まえて変更しておくのがベター
- 変数の表示名の案
- メイン処理を値の代入に差し替え
- この行↓をコメントアウト(行頭にシングルクォーテーションを追加)
'worksheet.range(range).COPY - 代わりにこの行を挿入
worksheet1.range(range1).Value = worksheet.range(range).Value
- この行↓をコメントアウト(行頭にシングルクォーテーションを追加)
- 不要な行をコメントアウト
'worksheet.Activate
'worksheet1.Activate
- お作法に準拠
終了処理にも、末尾1の変数分を複製しといたほうが無難
- 補足
加工箇所はまあまあ多いものの、実質3.の1行だけ
ほぼベースライブラリのままなので、権利に配慮してスクリプト丸出しは見送り
気づき
- .xlsxのほか、.xlsmでも.csvでも成功する
- .csvから.csvへの転記にも成功する
- 総当たりは未試行
- いずれも元ライブラリの仕様に準ずるはず
- .csvの場合は、拡張子なしのファイル名がシート名になる(Excel側の仕様)
メリデメ
- ◎ 1パーツだけで転記が完了する
- ◎ 一括処理(繰り返さないで済む)
- ◎ 値用の変数が不要
- ◎ クリップボード不使用
- ◎ 一瞬*
- ▲ 設定項目数が元ライブラリの倍に増える
転記先を指定するから当然
コピペ、変数を経由した値の取得/設定、繰り返しのアプローチ等の設定より圧倒的にラクなはず - ▲ 値の代入に特化しているので、形式を選択して貼り付けのオプションには非対応
範囲どうしは掴めてるので、きっと少々の加工で対応できちゃうとは思われる - ▲ 最終行/最終列とかを加味するのが面倒
ほかのライブラリと同じように、手前でうまく変数に掴んでおく
1列まるっとみたいな横着でも充分速い
もっと横着する方法もありそう
*パフォーマンス実測
- 10文字 × A1:Z1000 = 6秒(繰り返しだと、、行ごと転記で1秒/行だとしても1000秒 ≒ 17分)
- 大抵の場面は、1秒未満 ≒ 一瞬と思われる
- いずれも体内時計で計測
- Excel操作(範囲転記)自体は、ファイルが開いてなければ開くところから始めてくれる(ベースライブラリの仕様)
- ファイルの格納場所がネットワークフォルダだったり、10MB以上の巨大ファイルを開いてない状態からだと、開く分が所要時間に加わる
- 今回は、転記元/転記先ファイル共に開いた状態で計測
希望
- どこかで誰かが使って「ラクできた」みたいな声が耳に入ると嬉しい
- ここがイマイチとか、もっとこうなら良いのにとか、フィードバックをいただけると嬉しい
- スイートライブラリやプチライブラリ、あわよくば標準ライブラリに採用されたら嬉しい
既に同じコンセプトのものがあるのだろうか、、 - このへんのサンプルシナリオのアップデートに繋がればなお嬉しい
CSVファイルの指定した列を文字列としてExcelファイルへ転記するサンプルシナリオ
https://winactor.biz/samplescenario/2019/11/15_1475.html
更なる拡張案
- ValueをNumberFormatLocalに置き換えたら、セルの書式設定 > 表示形式 の転記に成功した
- 設定タブにプルダウンを2つ設けて、ValueとNumberFormatLocalをそれぞれオンオフできるようにするとか
- 両方ともオフだと想定外になりそうなので、1つのプルダウンで、各のみと併用の計3つの選択肢でも
- ニーズと時間見合いで
- きっと誰かが「できたよ」と叶えてくれるはず
- NumberFormatLocal以外にも拡張の余地があるのかも
リファレンス
Office TANAKA - セルの操作[セルのコピー]
http://officetanaka.net/excel/vba/cell/cell09.htm
Office TANAKA - VBA高速化テクニック[値貼り付けは遅い]
http://officetanaka.net/excel/vba/speed/s13.htm
クリップボードを使わないセルのCopy|VBA技術解説
https://excel-ubara.com/excelvba4/EXCEL254.html
セルの書式(表示形式,NumberFormatLocal)|VBA入門
https://excel-ubara.com/excelvba1/EXCELVBA331.html
(ここから未踏)
- Textで表示されてるままの文字列、Value2でシリアル値、Fomulaで数式を扱えるという情報
Office TANAKA - Excel VBA Tips[セルのValue2プロパティ]
http://officetanaka.net/excel/vba/tips/tips115.htm
- 無限に広がりそうな情報
Rangeオブジェクトのプロパティ一覧|Excelリファレンス
https://excel-ubara.com/EXCEL/EXCEL906.html
誰かがダイブして、どこかでクールな解きかたに繋げていただければ
ユーザーフォーラムのサークル機能を軸に、アウトプットを促進する運動を展開してます。
お時間のあるときにでも覗いてみてください。