これはDTP Advent Calendar 2018の8日目の記事になります。
たまたまTwitterのTLに「ネ申Excel」の話があったのを読んで、そういえば以前に集計用シートのことを書いておいて実際の作例とかは形にしたことがなかったなあ、と思い出しましたのでこの機会に書いてみようと思います。
まあ実際、話題にはなっていてもDTPの現場で困っているケースは少ないのではないかと思っているのですが、DTP界隈だとMicrosoft Office関連の話題がとかく敬遠されがちなので最低限知っておいてほしい正しい(かどうかはわかりませんが)対処法の例という趣旨で書いていきますので、そんな感じで読んでいただければ。
はじめに。
まず本題に入る前に、俗に言う「ネ申Excel」の何が問題か、ということを書きたいのですが、長くなりそうですし、のっけから説教くさいことを書くと本題への興味を失わせてしまいかねないので、たまたま自分が言いたいことほぼすべてが親切丁寧わかりやすく書きつくされているWebサイトを見つけましたのでそちらを紹介するだけにしておきます。
要点のみ引用します。
問題は、「Excel方眼紙」の何が悪い?
ここで述べられているように、「作る側」と「使う側」の対立
これこそが問題の本質にあるのだという事です。
Excel方眼紙を作る人は、その中のデータを二次使用することなど毛頭考えていない。
そして、それを考えないことが、必ずしも悪とは言えないという事です。
その人にとって、Excel方眼紙で目的を達成しているのなら、他人がとやかく言う事ではないからです。
そう考えれば、Excel方眼紙の作り手に説明しても理解してもらう事は難しい〔ことがわかる〕でしょう。
むしろ、それを二次使用する側ににこそ、しっかりとした意識を持ってもらう事が必要なのです。
(中略)
Excel方眼紙を作る人に、それに代わる道具の提供こそが問題解決なのです。
その道具を持たない人に対して、何かを言う事では何も解決しません。
※〔 〕内引用者補足
「ネ申Excel」問題 への同意と反論
https://excel-ubara.com/excel5/EXCEL821.html
ということで「二次使用する側がしっかりとした意識を」持てればできるであろう、ごく一般レベルのExcelの使い方で「ネ申Excel」に対処してみる、ということに入りたいと思います。
Excelは表計算ソフトです。
これはAdobe Illustratorはイラスト作成用ソフトです、と同じくらい当たり前のことのように思えますが、実際にはIllustratorを組版ソフトと混同したような使い方をする人が存在するように、Excelを表組作成ソフトと混同している人が多いです。(だからこそ「ネ申エクセル」が作られている)
Excelが持っている表組作成の機能(罫線とか)は言ってみればおまけでしかありません。(そう認識していればExcelのファイルをPDFにした際にその罫線を利用しようとか考えるのは危険だということも自ずとわかるのではないでしょうか:余談)
「表計算」と「表組作成」を分かつのが関数の存在です。
関数という名称だとなんだか難しい印象を持ってしまうかもしれませんが、Excelの関数の多くはいわば単純な機能です。
例をあげるとたとえばTODAY関数は「今日の年月日を表示(厳密に言うと「現在の日付を表すコードを返す」)」です。適当なセルに「=TODAY()」と入力すると「2018/12/8」(現在の日付)と表示されます。
TODAY関数だと引数(()の中身)がありませんが、たとえばSUM関数(オートSUM機能で使われているのがSUM関数です)なら「=SUM(A1:A3)」と入れるとそのセル(A1~A3以外)にA1セルからA3セルの合計が求められます。
関数以前にもっと基礎的なことを。
セルに半角で最初に「=」を入力するとそのセルは関数やセル指定、つまり数式を入力するセル扱いになります。
A1セルに「=A2」と入力し、続けてA2セルに適当に数字か文字を入力すると同じ内容がA1セルに表示されます。(A2セルに何も入力していない状態では標準では0を表示します)
さらに別シートのセルも指定可能です。
これをセル参照と呼びます。
そしてセル参照には相対参照と絶対参照があります。
基本的にExcelは相対参照で動作します。A2セルを参照しているA1セルをB1にコピペするとB1セルはB2セルを参照するセルになります。
どのセル(A2セル以外)にコピペしてもA2セルを参照したいというときには列名行名それぞれの前に$をつけて「=$A$2」と入力します。
$をどちらかのみにしてそちらだけ固定することもできます。
取りあえず覚えておく必要があるのはこれだけです。
現在Excelの関数は500近くあるようですが一般的な使い方ならそれらを暗記するような努力は必要ありません。(私も何も参考にせずに書ける関数は数個しかないです)
何か機能が必要になったら関数一覧から探すというやり方でいいのです。実際に必要にならない状況で覚えようとしてもその関数が何のために存在しているのかもわからないものが多いので。
ここで今回の「ネ申エクセル対策集計用シート」の基本的な考え方を。
今回やろうとしていることは、できればセル参照だけでやりたい、でもそれだけでは実現できないのでINDIRECT関数やCONCATENATE関数などを使う、という感じです。あとせっかくなのでテキスト整形にJIS関数やASC関数なども使っています。
サンプルの「ネ申Excel」は実際に行政関連のホームページにあったものをもとに作ってみました。
現物はもっと多くの項目がありましたが多すぎると面倒くさいわかりにくくなるのでいくつか項目を省略しました。(水色の網掛けが消去した部分、薄オレンジ色の網掛けは改造した部分です)
もっとひどいものも世の中にはたくさん存在しているでしょうが、このサンプルで対処法を覚えればだいたい同じ考え方でいけるぐらいにはなっていると思います。
このサンプルの下のほうには機関紙その他への掲載云々が書かれていたので、実際の現場でも集計して一覧を作る必要が出てくると思われます。
それを想定してやってみます。
では実際の作業に。
まずバラバラのExcelファイルをまとめます。
数が少なければ新規Excelファイルに手作業でコピーしていってもいいのですが、数百枚以上になるとかなり手間がかかるのでマクロか外部アプリを利用することになるでしょう。
自分はマクロが書けないのでVectorで見つけたオンライン・ソフトを使ってExcelファイルをまとめました。
ネットで調べてマクロもコピペ&改造で試してみて一応動いたのですが、私が始めから作ったものではないので参考で。
Sub Sample()
Dim sFile As String
Dim sWB As Workbook, dWB As Workbook
Dim dSheetCount As Long
Dim i As Long
'コピー元ファイルを保存しているディレクトリを指定する
Const SOURCE_DIR As String = "C:\sample\"
Application.ScreenUpdating = False
'フォルダ内にあるブックのファイル名を取得
sFile = Dir(SOURCE_DIR & "*.xlsx")
'ブックがなければ終了
If sFile = "" Then Exit Sub
'集計用ブックを作成
Set dWB = Workbooks.Add
'集計用ブック作成時のシート数を取得
dSheetCount = dWB.Worksheets.Count
Do
'コピー元のブックを開く
Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile)
'コピー元の「このシートに記入」シートを集計用ブックにコピー
sWB.Worksheets("このシートに記入").Copy After:=dWB.Worksheets(dSheetCount)
'コピー元ファイルを閉じる
sWB.Close
'次のブックのファイル名を取得
sFile = Dir()
Loop While sFile <> ""
End Sub
VBA/VBSやスクリプトが得意な方であればもっとスマートに書けるのではないかと思いますが専門外なのでご容赦を。(それにしてもMicrosoftはPower Queryみたいな形で機能を追加するより先にこういう単純な機能をつけてくれればいいのに…)
集計用ブックにまとめた後に新たに集計用シートを作成します。(上記マクロの場合は新規作成時に作られるシートを利用すればいいです)
この時、一番最初にコピーされたシートのシート名には番号がついていないので後ろに、
「 (1)」(半角空白を忘れずに)
を加えておいてください。
集計用シートの一行目に集計する各項目を配置していきます。
サンプルでは最初のA列はシート番号にしました。
二行目からがいよいよ今回の本題です。
関数を使っていきます。
ざっと入力してみたのがこの図です。
(記事の最後にこの一歩手前の状態の.xlsxファイルをPDFに添付の形で置いておきます)
まずA2セルには次のように入力しました。
="("&(ROW(A2)-1)&")"
スマートな方法でなくて恥ずかしいのですが、説明すると「"("」で「(」の文字、「&」でつないで「ROW(A2)」はROW関数で指定されたセルの行番号を返してくれますのでこの場合は「2」、実際は1を引いた数が欲しいので「-1」をつけてそれを「()」で括って数字「1」を表示、最後に「")"」で「)」の文字を加えています。(一行目からデータを始めるのであれば当然「-1」はいらないです)
なんでこんなまわりくどいことをするかというと、下の行にコピペしたときに自動で数字を変更していくためです。
次はB2セル。
=INDIRECT("'このシートに記入 ("&(ROW(A2)-1)&")'"&"!$I$3")
今回一番紹介したかったのがこのINDIRECT関数です。
この関数を文章で説明しようとすると「セル参照を文字列で指定する関数」となってどんな場面で必要になるのかさっぱりわかりにくいのですが、要はコピペでも別シートのセル参照ができるようにしてくれる関数です。
内容を説明していくと「"'このシートに記入 ("」で「'このシートに記入
(」の文字(文字間に空白があるシート名はアポストロフィで括らないとエラーになるようなので先頭につけています)、「&」でつないで先ほどの「(ROW(A2)-1)」とシート名の残り「")'"」でシート名が指定されて、あとは「"!$I$3"」で別シートのセル参照の残り(I3セルを絶対参照)を指定しています。
試しに「="'このシートに記入 ("&(ROW(A2)-1)&")'"&"!$I$3"」をどこかのセルに入力してみるとわかりますが、シート名を指定しているつもりの文字列をそのまま文字列として表示してしまうのでセル参照できません。
これをセル参照できるようにするのがINDIRECT関数の役割です。
次のC2セルは後回しにしてD2セルを。
CONCATENATE関数です。
「2つ以上のテキスト文字列を1つに結合する関数」です。
その性格上、そのまま書くと長くなってしまうので省略形で。記入の際は《INDIRECT関数》のところを補完してください。
=CONCATENATE(《INDIRECT関数$L$4》,"/",《INDIRECT関数$P$4》,"/",《INDIRECT関数$T$4》)
結合する文字列の間にはコンマが入ります。ここでは年・月・日のセルを「"/"」(/)で区切ってつなげています。
長くなってきたので、あとは簡単に。
C2セルは一見大変そうに見えますがD2セルと同じようにCONCATENATE関数でまとめて、その外側を半角カナ対策のためにJIS関数で括ってみました。
G2セルは逆に全角英数字を半角に統一するためにASC関数で括っています。
E2セルで使っているのはTRIM関数です。「不要なスペースを取り除く」ので消し忘れたスペースを消去するのに使ってみましたが、文字間のスペースは1つ残るようになっているので使いどころは限られるかも…
取りあえずここまで。
L2セルまで作業を終えて、2行目を必要な分だけコピペしてみたのがこれです。
サンプルのデータにいろいろイレギュラーを仕込んでいたのが直せない部分があり後処理は必要になっていますが、まあ、このくらいできていればあとは何とかなりそう。
私もそれほど詳しくないのでもっとスマートな方法があるのかもしれませんが、それはこれを読んでくださった有志の方に託します。
最後に「ネ申Excel」について私が思うところを。
このネーミングは見事だとつくづく感心してはいるのですが、どうも言葉のイメージが強すぎて実態以上に対処不能な難物のように思われているのでは、とも感じたりします。
でも素人の方々の間で広まっているやり方が専門家に対処不能のわけがないのです。(面倒かどうかは置いておいて)
素人の方々の間で広まる、ということは、つまり「考え方はシンプル」なはずなのですから。
これはWordの場合でもよく思うことなのですが、
「そんなに貰って嫌なケースが多いなら先に簡単な雛型でも作ってあげて、自分の都合のいい方向に誘導してあげればいいんじゃない?」
貰った後の苦労でコストがかかるというなら、その分先回りして予防していくしかないのですよ、誰がわざわざ自分のために余分な苦労をしてくれるというのですか。
他人に自分のために勉強してくれと言うなら、まず自分が勉強してその人に学ぶ方法を教えてあげるべきではないですか。
「ネ申Excel」という言葉の響きには、そういう現実から心地よく逃避できる、甘い誘惑が潜んでいるように思うのです。
それがまさに「ネ申の魔力」なのかもしれません。
聞いたところによると「ネ申Excel」が最初に猛威を振るい始めたのは霞が関の官庁からだったそうですが、先日サンプルを探していた時に見つけたExcelファイルは「ネ申」どころかむしろなかなかよくできているものでした。
偉い人が号令をかけたこともあるのかもしれませんが、個人的な実感としては、地方でも役所から渡されるExcelファイルは昔よりスマートになってきていると感じています。
優秀な役人の皆さんもずっと努力されているのですから、遅いとしても進歩が無いということはないでしょう。
「二次使用する側」がしっかりと問題に取り組む意識を持つことこそがその進歩の速度を速める最初の一歩なのだ、と再度強調してこの記事を終えたいと思います。
この記事を書く機会を与えていただいたのえるさん、「ネ申Excel」見本を探すのにアドバイスをいただいたMD5500さん、mars_teruさんに感謝いたします。(サンプルはmars_teruさんが見つけてくれたものを元に作りました)