【VBA】カット・アンド・ペースト、そして一括削除

隣から同僚が「問題発生しちゃった。」と深刻そうに言ってきたから何事かと聞いてみたら、マクロである程度解決出来たというお話。

問題となったのは、前任者の引継書に手順が記載されていなかったタスク。前任者の足跡を見る限り、どこからかデータを(恐らく)CSV形式でダウンロードし、それをもとに更新作業をしていた。後任のスタッフは、データをどのように更新するかについては何となくわかるようだったが、今回の問題はその前段階のデータ取得で発生していた。

まず、彼女は、会社で契約しているデータベースにアクセスしてデータをダウンロードしたのだという。でも、結果を見ると、数十件と明らかに少ない。そこで、データベースの会社へ連絡。すると、現行の契約内容では主だったもののデータしかダウンロードできない、ウェブページに載っている情報を見て対応してほしい、と回答されたのだという。ウェブサイトを見ると、めちゃくちゃスクロールする必要があるものの、データは全部載っているとのことだった。いつもなら力技(地道に一件一件目視・・・)で頑張る彼女だけど、報告期限まで時間が迫っていて、私に相談してきた。

【リクエスト】一列に並んだデータを別の行に分けて表示させたい

とりあえず、該当ページで全選択(【Ctrl】+【A】)して、空のエクセルブックに貼ってみた。(形式を選択して貼付→Unicode text)

結果はこんな感じ。

Item A -1
xxx
(blank row)
Item A -2
xxx

理想は、こんな感じ。

Item A -1 xxx
Item A -2 xxx

【解法】VBA|カット・アンド・ペーストを使って2行に分ける

10行以内の短いマクロで解決する。

おまけ【解法】VBA|3行以上に分ける

今回は、めちゃくちゃ単純な例だったけど、これがもし、以下のような感じだったらどうするか。(括弧内の数値は行番号とする)

Item A -1
Description 1
Description 2
(blank row)
Item A -2
Description 1
Description 2

あまり良くない解法かもしれないけど、私の回答は以下。

空白行の削除を最初に入れてループの回数を減らすのが良いのかな、と。

同様に、2回目の空白行の削除をループの中に入れるのも非効率な気がするけど、もしそうするのであれば、ループは下の行から順に回すこと。

おさらい

こんなのはHelpとかにまとまっているんだけど、一応。。。

今回のおさらい

カット・アンド・ペースト

[最初のセル].Cut [移動先のセル]

空白行の一括削除

[空白行が含まれている列].Cells.SpecialCells(xlCellTypeBlanks).EntireRow.Delete

下の行から順にループ(1行ずつ):

For i = ループする回数 to 1(もしくはゼロ)Step -1

2行おきの場合は-2

日常業務には【Go To Special】を使った処理

私の場合、空白行を削除したいと思うデータに遭遇する機会は結構ある。今回のようにデータの移動など不要の場合には、エクセルの標準機能で対応可能。所要時間は5〜10秒。マクロを作るより断然速い!(というか、上の方法は、この標準機能をマクロにさせている。)

GoToSpecial

空白行を一括削除する方法

  1. 空白を削除したい範囲を選択
  2. 【F5】(もしくは【Ctrl】+【G】)
  3. 【Alt】+【S】
  4. 【Alt】+【K】(了)

上記手順の2以降をマウスでの操作でするのはオススメしない。めちゃくちゃ奥に埋まっているから。

【Go To Special】は空白の選択以外にも便利なので、機能を調べておいて損はないと思う。私は、空白の選択のほか、可視セルのみ選択というのもよく使う。行列が非表示になっている表のコピペの際に便利(【F5】→【Alt】+【S】→【Alt】+【Y】→【Ctrl】+【C】(コピー)→【Ctrl】+【V】(ペースト))。

Advertisements

備忘録かチートシートか|Dynalistの使い道

毎朝、Notepad++とOutlookを立ち上げてタスクを確認。仕事中のちょっとしたメモは、Notepad++に入力している。

最初のうちは、プレーンテキストのメモはわかりづらいかとも思っていたが、サクサク動くその速さ、マークダウンに慣れてきて以降はその手軽さから、もう文書は全部Notepad++で済ませたいというほどにハマった。

ということで、備忘録を含めドキュメント作業の80%近くはNotepad++を使用。15%くらいは、文書の整形作業で他のMSアプリと格闘1。最近、はじめだしたのが残りの5%、Dynalistでのメモの作成。

Dynalistは使いはじめてまだ1ヶ月ということもあって、まだまだ、自分の中で使い方が定まっていない2。毎月のトピック制限もないので、以前使っていたように思考の整理用に使おうかとも考えたけれど、せっかくNotepad++に慣れてきたのだから、ここで戻す必要性が感じられない。

今のところ「これがしっくりくるかな」と感じている使い方は、パソコン関連の断片情報の寄せ集め(備忘録)や、チートシートとしての使い方。精度の低い超個人用素人Qiita3のような感じ、とでも言おうか。。。

パソコン関連で調べたサイトのうち、後から見返したいサイトの情報を貼ったり、覚えておきたいコードを書き留めておいたり、ということに利用し始めた。(まだ実験段階故、この使用法が定着するかは不明。。。)

仕事用に作ったDynalistの現在のフォルダはこんな感じ。

dynalist_1

最初は、年間のモデルスケジュールだとか入れてみようかなとか、昔のように引継書を作成してみようかなと思って、いろいろフォルダを作ってみたのだけど、結局そのほとんどはNotepad++で対応しているので使っていない。何だかんだで、PC関連の備忘録用に作っておいたフォルダだけしか使っていない。

PhraseExpressも大凡の使い方は理解できてきたものの、たまに書き方を忘れるので、よく忘れるものをまとめたチートシートが必要。忘れるごとに5分はロスしていると思う。

覚えておきたいコマンドをまとめたもの。外部リンクの他、Dynalist内の項目のリンクを貼ることも可能。

dynalist_2

参考:dosコマンドを使ったfile listの作り方(windows)

dynalist_3

現状わからないこと、解決できていないことには@Question?というタグを付けてみた。解決法がわかったら更新予定。

マークダウンでコードをハイライト出来るので、チートシート用には使い勝手がいいかな、と。

未解決の問題もメモしている部分と、チートシートとして完結している部分が混在していて若干気持ちが悪い。グループ分け(フォルダ分け)が間違っているのだと思うが、今はDynalistの利用法を考えている途中なので、我慢する。両方の使い方をしていくと決めた時点で、このあたりの整理法を再検討したい。


  1. 一番苦手なのは、エクセルである必要性が分からないエクセル文書の整形。地味に時間がかかるから、計算とかテーブルがないならやめてほしい。 ↩︎
  2. そもそも決めなきゃいかんのか、という感じがしなくもない。ただ、闇雲にツールを増やすと収集がつかなくなるし、一応は決めておきたいな、と。 ↩︎
  3. プログラミングに関する知識を記録・共有するためのサービス。個人的には、素人のブログ情報とは違ってやや敷居の高い印象。 ↩︎

フォルダ作成、バッチコーイ

毎月もしくは毎四半期ごとにやってくる業務が私にはある。数種類のファイルが別の拠点や本社(もちろん内部データも)から送られてくる。

私が引き継いだときは、月のフォルダがひとつ、そこに全てが突っ込まれているという状態だった。前任者のスタイルは、「最終版を最後に保存」というもの。【インボックスゼロ】信奉者(なのに、今年に入ってすでに1,000以上受信箱に積み上がっているのはなんでだ?)の私には、そんな高等な技を使える能力はなく、とりあえず、届いたデータをフォルダに移動させて、メールは【Inbox】フォルダから【DONE】フォルダへ、というスタイル。私のようなスタイルをとると、とりあえずはメール地獄からは回避出来るものの、ドラフトも最終版もフォルダに入れておくことになってしまうので、フォルダを階層化する必要が出てくる。

例えばあるレポートは以下のような形で整理されている。これは、あくまでサンプルで、実際の業務では、2階層目のフォルダの量はもっと多いものもある。(3階層目は減らす方向で鋭意努力中。)

sample_folders

 

単に月のフォルダを作って終わり、というのに比べるとフォルダの作成作業が増えた分、効率が悪くなったようにも思えるが、後からデータにアクセスすることを考えると、2階層くらい増やすのは、ま、仕方がないように思っている。(前任者が1階層だけで仕事をこなしていたのが本当に信じられない。。。恐ろしく記憶力のいい、出来る人でした。)

複数のフォルダを作成する(これまでの方法)

前置きが長くなったが、こういうのを毎回作成するのは面倒くさい。ので、私が最初にやったのは「Excelでフォルダ作成のマクロを作る」というもの。というのは言い過ぎで、実際には、2つのExcelマクロを使って対応してた。(一発で作成する方法もある模様。)

作業手順は以下の通り。

  1. 【Ctrl】+【Shift】+【N】を何回か押して、必要なだけフォルダを作成する。
  2. マクロ1でフォルダ名を取得。(→A列に現在(変更前)のフォルダ名を出力)
  3. マクロ2でフォルダ名を変更。(→B列に変更後のフォルダ名を入力(業務内容に応じて作成してあるフォルダ名のリストをコピペ))

複数フォルダを作成するバッチファイル

これでもそれなりに上手くいっているしいいと思っていたけど、最近、pandocなどでコマンドというのを使っていることもあって、コマンドで私でもできそうな簡単な方法ないかなと。

作ってみました、バッチファイル。やっぱり素人なので、上手くいかない部分もあって、最終的には背伸びをしないやり方を選択したけど、新しいことを学ぶことができたので良しとしておく。

大まかな手順はExcelマクロと同じ。2つのバッチファイルで対応。

  1. 【フォルダリストの作成】以前作成したフォルダの親フォルダにバッチファイルを置いてダブルクリック。
    dir /ad /b > folderlist.txt
  2. 【フォルダの作成】2つ目のバッチファイルで、1.で作成したリストのフォルダを作成。
    for /f %%a in (folderlist.txt) do md %%a

ほぼ同じ手順だから、これまでと変わりないように思えるけど、ちゃんとモノグサな私仕様になっている。ただ、最初だけ設定しなくちゃいけない。(これも本来はコマンドで一気にできちゃうんだと思うけど、如何せん、知識がないので、今は身の丈にあった方法で。)

階層の浅いフォルダに関しては、上の1.の手順でOK。でも、毎月使ってしかも、サブフォルダも複数設定する必要がある場合には、以下の手順でフォルダリストテンプレを作っておく。

前述の1.【フォルダリストの作成】用バッチファイルで出力されるのは親フォルダのみ。/bの前に/sと入力するとサブフォルダまでリスト化される。但し、これだとフォルダ名だけ取り出されるのではなく、パスが出力されてしまう。なので、出来上がったテキストファイルを開いて、最初の部分を置換で消してしまう一手間が必要。そうやってやっとサブフォルダ付きリストの完成。次月以降は、このサブフォルダ情報付きフォルダリストを用いる。

各方法の違い(体感)

私の試した方法はこれで3つ。

  1. 全て手作業でフォルダを作成
  2. Excelマクロでフォルダを作成
  3. バッチファイルでフォルダを作成

1.と2.の差が量にもよりけりだけど、15〜30分だとすると、2.と3.の差は5〜10分程度にすぎないかもしれない。(注:あくまで体感。実測はしていない。)この作業は、単純作業で引継ぎに失敗する話でもないので、とりあえず当面は個人的にバッチファイルで対応していく。

【PyQ】|《Python初級》修了

PyQでのPython初級まで終わった!

PyQでは、学習開始時点でのレベルや目的に合わせてオススメの単元の組み合わせがコースとして設定されている。私は、その中から、「未経験からのPython文法」コースを選択して受講している。

コースの内容は以下のとおりで、写経のみの例題を含めた問題数は「358」、目安の学習時間は「77時間〜」となっている。

「未経験からのPython文法」コース

はじめてのプログラミング

Pythonはじめの一歩

Python初級 ←今日ここを修了1

Python中級

実務でPython

まだまだ初級だけれど、それでも素人の私にとっては理解に時間のかかる問題が増えてきた。ひとつ前の「はじめの一歩」に取り組んでいたときのスピードの倍とはいかなくてもそれに近いくらいの時間がかかるようになってきた。

例題では、コードを全て入力する問題は少なく、学習トピック部分のみを写経させるというスタイルが採られていて、他のプログラミング言語の知識がある人たちにとっては学習を要領よく進められる作りになっていると思う。

そして、自分が初学者であるにも関わらず、私もそのスタイルをとって、前回は失敗してしまった。学習しているトピックのコード部分だけでなく、各問のコード全体をせめて80%くらいまで理解した上で、次に進まないとある日突然「何やってたんだろう」となってしまう。何を当たり前の話を、と自分でも呆れてしまうのだけれど、ゲーム感覚で出来るために次第に「次へ次へ」という思いの方が勝ってしまった。

さて、初級の内容。初級では、その単元で学習することだけでなく、これまで学習してきたこととの組み合わせで問題を解いていく。内容も、「あー、こういう状況仕事でもありそう」と思えるものが増えてきた。

写経の段階でメモを取り、問題演習では模範解答を見ず、自分のメモを頼りに解く。エラーが出ても慌てない。面倒くさい気持ちを抑えて、最初からじ~っと見て、直していく。段々と繰り返していくうちに、エラーが何を言っているのか、自分のエラーの傾向がつかめてくる。

私の場合、インデントを適当にしてエラーが出ることが多い。何も考えずに、Enterを押下して、そのまま書き続けることが多いから。見直して、ループや条件分岐から抜けてないことに気づく。ちょっとした見直しで気がつかないときには、Excelマクロのときにイミディエイトウィンドウでやっているように、途中にprint()を置いて確認している。(Pythonでの見直しの方法がまだわかっていない。。。)

辞書を使った集計も、初級の最初のあたりではまだまだ苦手だった。とりあえず、例題のコードを書き写して暗記。後から理解がついてくることもある。いくつか問題を解くうちに、「この前使ったあの書き方で」とやっと気がつくようになってきた。やっと。


  1. 問題数での進捗率は273/358。 ↩︎

【PyQ】|《Pythonはじめの一歩》修了

無駄遣いをやめる》と目標を立てたものの上手く進めることが出来ずにいる。今月は、ちんたら取り組んできたPyQ1を真剣にやることに決めた。

私がPythonに興味を持ちはじめたのは、Amazonで『退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング』というタイトルの本の存在を知って、「え、Pythonってデータサイエンティストだけのものじゃないの?」と気になり始めたのがきっかけ。(本は購入していない2
) 具体的に「Pythonで○○がしたい」などということはなく、単純に「Pythonがノンプログラマーの仕事に便利なものだっていうんなら・・・」という軽い気持ちだった。

本を読んですぐに理解出来るタイプではないこと、また、いろんなところで写経(お手本のコードを実際に手を動かして自分で打ち込むこと、らしい)がプログラミング習得の第一歩みたいに書かれていたのを見て、PyQを始めることに決めたのが秋頃。それから数ヶ月経っても、初級も終わらせることなく、時間が過ぎ、月謝だけが引き落とされていく。

取り組み方そのものが間違っていたのだと、ここ数日取り組んでみて反省。

当初、私は、写経を字の如く捉え、全く理解しようという気持ちを持っていなかった。「とりあえずお手本どおりに打ち込んでいけば私もPythonが習得出来る!」と思い込んでいたのだからおバカとしか言いようがない。打ち込んでいる内容をきちんと理解しようとせずに進めるので、タイピング練習以外のなにものでもなかったのだけど、そんなことには全く気付いていなかった。自分が打ち込んでいるコードがどういうものなのか全くわからない、つまらない、そして《挫折》。でも《挫折》したとは思いたくない諦めの悪い私は月謝を払うことで「まだ、学習を続けている」という気分に浸っていた。

学習を再開して今日で3日目。これまで学習した履歴をリセットし、もう一度【はじめてのプログラミング】から取り組み、【Pythonはじめの一歩】まで終了した。

今回は、解説をしっかり読んで、ノートまで付けている。コースそのものは、ノートを取る必要がないような作りになっているが、自分の性格上、自分で重要と思った部分に付いてはメモを取っておいた方が理解が深まるような気がしている。ちんたら取り組んでいたときには、すぐに模範解答を見て、タイピングしていたけれど、今回は問題はノートなどを参考にあーでもない、こーでもないと悩みながら取り組んでいる。

ノートを取る時間の分だけ時間はかかるものの、前と比べると雲泥の差でコードの意味がわかる。そして、楽しい。

明日からはやっと【Python初級】に進む。これからもっと難しくなって、スピードが落ちそうだけど、今月中に何とか【実務でのPython】まで終わらせたい。


  1. オンラインPython学習サイトで、月額2,980円〜(2018年2月現在)利用できる。 ↩︎
  2. 英語版であれば、著者の【Automate the Boring Stuff with Python】というサイトで読んだり、ダウンロードすることが可能。 ↩︎