【エクセル】計算50問テストを自動生成するシステムのひき算とわり算の設定が分からない【教育】

ここからの続き。

tohruyoshino.hatenablog.com

 

f:id:tohruyoshino:20200423150850j:plain

 

たし算とかけ算は簡単だけど、ひき算とわり算の設定が難しい!

難しいから、改めて書いておく。

 

前の数字をランダムに出すと、答えが意図しない数になり、

答えの数字として設定すると、狙った式になるかが分からない。

 

それぞれのメリット・デメリット

前の数をランダムにした場合

【メリット】

・前の数に目的の数字を出しやすくなる。

・意図した問題になりやすい

 

【デメリット】

・関数が複雑化する。

・答えの範囲を縛れない。

 

答えの範囲として設定した場合

【メリット】

・関数が簡単になる。

・答えの想定ができるので、テストしやすい。

 

【デメリット】

・こちらが狙いとした式になるか不明。

 

両取りしてみよう

だったら前の数はランダムで設定するけど、答えの範囲も設定できるようにしてみたら良いのでは?とも思った。

 

答えとしては無くは無い。

が、関数が死ぬほど複雑になるのと、まさしく”死に設定”が出てくる

 

例えば

 前の数:1000~800

後ろの数:  30~5

答えの数:  20~1

とかにすると、問題を作成することができない。

厳密には、前の数の設定が意味が無くなって死ぬ

 

勿論、それを回避する条件設定を作ることはできるが、そこまでして作るほどのものか?

あまりにも現実の設定から離れすぎているぞ。

 

結論

毎年使ってきた実感からすると、前の数より答えの範囲が未設定な方が使いにくいような気がする。

今までもそういう形式で使ってきたしね。

 

なので、以前と同じように答えの範囲を設定するような仕組みで作っていく。

続きはこちら。

tohruyoshino.hatenablog.com

 

【エクセル】計算50問テストを自動生成するエクセルをパワーアップさせたい【算数】

数年前に自動で計算50問テストができるエクセルファイルを作ったことがある。

 

元々は2年生を担任していたので、最初はかけ算の習熟のために作ったものだ。

なので一番最初に作った段階では、かけ算の問題が50問自動でできるだけであった。

f:id:tohruyoshino:20200423113832p:plain

 

ところが実際に使ってみたら思いのほか便利で効果があったので、今度は四則計算が全て自動生成されるように修正をした。

以降、うちのクラスでは算数の最初の5分でひたすら50問テストを解くのが習慣になっている。

 

 

修正の動機

このシステムに大きな問題があるかと言えば、あまり無い。

小テストで実施することを前提に作られているので、細かい設定の必要が無かった。

 

では現実的な運用に耐えらえれるシステムを何故修正しようかと思ったかと言えば、1つはその細かい設定ができない部分が気になったことだ。

そしてもう一つがエクセルの技術が未熟な頃に作ったので、関数がごちゃごちゃいるのが気に食わないからだ。

  

なので今回は細かい設定にも耐えうるシンプルな設計を目指して修正していく。

 

問題点の概要

では「細かい設定」とは何か。

一番大きなものは、「たし算とかけ算」とか「ひき算とわり算」のように特定の組み合わせの自動生成ができないことだ

 

どの演算を自動生成するかは、先ほどの画像のこの部分を設定するのだが、

f:id:tohruyoshino:20200423115251j:plain

ピンクの「ここから」「ここまで」に数字を入れると、下の黄色のマスの範囲から演算が選ばれる。

つまり『1から3まで』のようにすると、たし算、ひき算、かけ算が問題に現れる。

そのため「たし算とかけ算だけ」という選び方ができない

 

現実問題としてそういう選び方は殆どしないのだが、できそうなのにやっていないのが気に食わない

 

あと数字設定が雑。

f:id:tohruyoshino:20200423120106j:plain

ここで数字を設定するのだが、たし算とかけ算の時は前と後ろの数をランダムで生成する。

 

ところがひき算とわり算でそれをやると、答えにマイナスや分数が出てしまう。

パッとやって計算力を上げる小テストなので答えは自然数で出したい。

そこで苦肉の策だが、後ろの数字はランダムで生成するが、

前の数字に関しては、ひき算はランダムで出てきた数を後ろの数字に足すようにし、わり算は後ろの数字に掛けるように設定している。

なんかごちゃごちゃした感がある。気に食わない。

 

そして最後、この設定のせいで関数がなんだかごちゃごちゃしているのだ。

前の数字に入っている数式はこんな感じだ。

 

=IF(C8=$V$17,D8*ROUNDUP(RAND()*($U$8-$U$9)+$U$9,0),

 IF(C8=$V$15,D8+ROUNDUP(RAND()*10,0),ROUND(RAND()*($U$8-$U$9)+$U$9,0)))

 

なーんかごちゃごちゃ感がある。もっと何とかなるやろ。

 

まとめると今回の修正点はこんな感じだ。

  • 「たし算とかけ算」のように任意の演算を選べるようにしたい
  • もうちょい上手い数字設定にしたい
  • 関数をきれいにしたい

そんなわけで以上の三点を修正していく。

 

問題点① 任意の演算を選ぶ

今までは1がたし算、2がひき算と、それぞれに番号が付いていた。

単純に考えれば、これが並び変わればいいだけなので、リスト化すればいいか。

 

別のシートに今と同じような表を作っておく。

出来上がったのはこちら。

f:id:tohruyoshino:20200423135234j:plain

こんな感じで、どの計算をするかリストで選べるようにする。

とりあえずここはこれでいい。

 

問題点② 数字設定を考えつつ、関数をきれいにする

数字の問題と関数の問題は切っても切れないので、まとめて考える。

 

後ろの数字の関数をきれいにする

後ろの数字には今はこんな関数が入っている。

「=ROUND(RAND()*($V$8-$V$9)+$V$9,0)

 

Round関数の中に、任意の乱数を出す関数が入っている。

赤字の部分は任意の乱数を出すときの基本のような形なんだけど、実はもっと簡単な方法があった。

 

Randbetween関数だ

これは最小値と最大値を設定すると、その中で任意の乱数を出してくれる。

変えるとこんな感じ。

=RANDBETWEEN($V$8,$V$9)

 

入れ子構造が無くなったので、割とすっきりした。

 

特定の演算子をランダムで出したい

演算子はさっきの表から選べるようにした。

f:id:tohruyoshino:20200423135234j:plain

問題は選んだ演算子をランダムで選択できるようにすること。

 

今まではこんな関数が入っている。

「=VLOOKUP(ROUND(RAND()*($U$12-$U$13)+$U$13,0),$U$14:$V$17,2,TRUE)」

分からなくはないが、ごちゃごちゃ感もある。気に食わない。

もっとシンプルに行ける気がする。

 

要は「ある範囲からランダムに選択する」数式ができればいいわけだ。

ある範囲(列)から特定の文字を引っ張ってくるのは、まあIndex関数だな。

 

「=INDEX($U$12:$U$15,1,)」

赤の部分は演算子の範囲。今は行番号1なので「+」が引っ張ってきている。

この行番号をランダムにしたい。じゃあRandbetween関数やん。

 

「=INDEX($U$12:$U$15,RANDBETWEEN(1,4))」

でもこれだと1行目~4行目でランダムになる。

今だと、3,4行目は空白だからでなくていい。

じゃあ最大値を2で止めるには?

 

とりあえずCountA関数を使えば「空白でないセルの個数を返してくれる」ので、行けるかと思ったが、なんか上手くいかない。

あ、表の演算子の部分は空白に見えて、数式があるからか…

 

ならば解決策が2つある。

1つ目が演算子の左隣りの「たし算」「かけ算」との表をCountA関数の範囲にする。 

2つ目がCountbrankを使って、空白(数式も空白とみなされる)を数えて、4から引く

 

1つ目:=INDEX($U$12:$U$15,RANDBETWEEN(1,COUNTA($T$12:$T$15)))

2つ目:=INDEX($U$12:$U$15,RANDBETWEEN(1,4-COUNTBLANK($U$12:$U$15)))

 

うーん、どちらもあまり変わらない!

しかし2つ目は数式を定義すれば、もっと短くなる気がする!

 

「$U$12:$U$15」の範囲を「演算子」と設定する。すると、こうなる。

「=INDEX(演算子,RANDBETWEEN(1,4-COUNTBLANK(演算子)))」

 

最近知ったのだけど、名前定義はとても便利。

慣れている人ならすぐに活用すべきテクニック!

kokodane.com

 

最後は前の数字だ。

 

前の数字を細かい設定しつつ、関数をきれいにする

前の数字は演算によって、それぞれ数字を設定したい。

とりあえずマスを分けてみる。

f:id:tohruyoshino:20200423150850j:plain

 

たし算とかけ算の場合は簡単。

ここに入力した範囲内でランダムに数字が出るようにすればいい。

単純なRandbetween関数をする。

 

ひき算とわり算の場合は難しくて分からなくなったので、こちらで整理して考える。

tohruyoshino.hatenablog.com

 

結論として答えの範囲を設定することにしたので、表をこんな感じにする。

f:id:tohruyoshino:20200423173542j:plain

 

方針が決まったところで、実際に関数を組み立てていく。

それぞれの四則計算についてどうなるかと言えば、こういう計算をする。

  • たし算・・・表の範囲で数字をランダムに出す。
  • かけ算・・・表の範囲で数字をランダムに出す。
  • ひき算・・・表の範囲で数字をランダムに出し、それを後ろの数字に足す。
  • わり算・・・表の範囲で数字をランダムに出し、それを後ろの数字に掛ける。

そのため、まず「表の範囲で数字をランダムに出す」ところを組み立てる

 

基本はRandbetween関数でいく。

まずたし算(+)の場合。

「=RANDBETWEEN(U8,U9)」

 

以下かけ算(×)、ひき算(-)、わり算(÷)の場合とずらしていきたい。

じゃあさっきの表があるからHLOOKUP関数だな

 

「=RANDBETWEEN(HLOOKUP(C8,$U$7:$X$9,2,),HLOOKUP(C8,$U$7:$X$9,3,))」

こんな感じになった。これで「表の範囲で数字をランダムに出す」ことができた

この数式に「ランダム数字」という名前を付けておく。

 

あとは条件分岐なので、以下のように設定。

  • たし算orかけ算 → ランダム数字
  • ひき算     → ランダム数字+後ろの数字
  • わり算     → ランダム数字×後ろの数字

 

出来上がった数式がこちら。

「=IF(OR(C8=$U$7,C8=$V$7),ランダム数字,IF(C8=$W$7,ランダム数字+D8,ランダム数字*D8))」

 

よーし、そこそこシンプル!!

数式の名前定義ってめちゃくちゃ大事だね!!

 

無かったら、こうよ。

「=IF(OR(C8=$U$7,C8=$V$7),RANDBETWEEN(HLOOKUP(C8,$U$7:$X$9,2,),HLOOKUP(C8,$U$7:$X$9,3,)),IF(C8=$W$7,RANDBETWEEN(HLOOKUP(C8,$U$7:$X$9,2,),HLOOKUP(C8,$U$7:$X$9,3,))+D8,RANDBETWEEN(HLOOKUP(C8,$U$7:$X$9,2,),HLOOKUP(C8,$U$7:$X$9,3,))*D8))」

 

うーん、えぐい。

 

仕上げ作業

後は細かいレイアウトを調整して、印刷サイズを増やす。

今はA4版で作っていたので、B5版とB4版も作る。

B4版はもちろん100問設定。

 

そして完成!

f:id:tohruyoshino:20200423191059p:plain

 

やったー!できたー!

完成してみると分かる。

前とほとんど変わらねぇ。1日何をやっていたんすかねぇ

 

しかし中身を見てみると以前よりはるかにスマートに細かい設定ができるようになった。

関数も短くなって、満足

 

これも欲しい方がいたらツイッターとかでDMしてくれれば、差し上げるのでどうぞどうぞ。

今日はここまで。

【エクセル】ジェンダーレスな世の中だけど、男女別名簿は作りたい【教育】

名簿を作ろう

最近、うちの自治体でも男女混合名簿になった。

世の中の潮流からすると、ようやく感があるけど、まぁなった。

 

吉野と言えば、ジェンダーに疎いのでこんな始末。

 

混合名簿は構わないが、

保健関係とか赤白振り分けとかの関係もあるので、男女別の名簿も欲しい

 

なので今回は、

混合名簿に男女の属性をつけておくだけで男女別名簿が作れるようにする。

 

サンプル名簿

今回のサンプル名簿はこんな感じ。

f:id:tohruyoshino:20200321170328p:plain

 

左に番号があって、なんか名前が並んでいて、それから男女が振られている。

名前のところは、普通五十音順なんだろうけど、

今回は思いついた順番に並べているので、そこはご容赦を。

 

新しいナンバリングをする

とりあえず思いついた順でやってみる。

今は男女混合なので、各自に通し番号が付いているが

これに「男の1番」「女の1番」みたいな感じの番号が付けばいいはず

 

ということで、番号をつけてみた。

f:id:tohruyoshino:20200321171353p:plain

 

COUNTIF関数は「範囲内で検索条件に合うものを数える」という関数。

 

フランキーの行の場合、「=COUNTIF($C$2:C9,C9)」だが、

「C2からC9までの中でC9(男)を数えて」という命令になるので、

フランキーまでの「男」を数えてくれる

 

画像だと見えないが、フランキーは6番目になっているので

フランキーより前には5人の男がいる。

 

$C$2を固定しておくことで、オートフィルをかけた時も

一番上から自分までという範囲設定ができる

 

コニスの場合はこんな感じ

f:id:tohruyoshino:20200321172125p:plain

 

男女とナンバリングをくっつける

男女別のナンバリングができたが、これをそのまま参照すると

「1番」が2人になっていまう。

なので「男1」「女1」と区別をする

 

これは結構簡単でこんな感じにする。

f:id:tohruyoshino:20200321172519p:plain

 

ウソップの部分の場合、「=C5&D5」とすると、

「男(C5)」と「3(D5)」がくっついた「男3」という文字列が出せる。

文字列を足すには基本的に「&」でつないであげてばいい

 

応用編

今回はD列とE列で分けて、新しいナンバリングをしたが、

1回でもE列のような表示はできる

 

f:id:tohruyoshino:20200321173309p:plain

 

D列にはもともとCOUNTIF関数が入っているので、

「=C6&D6」のD6の部分にCOUNTIF関数を代入する感じ

 

折角なので、こちらのスマートな方を残して次へ行く。

(以降、D列とE列を削除するので、F列がD列に来ます。)

 

伝家の宝刀「vlookup」封じ

ここまで行けば後はvlookup関数で行けると思いきや、

検索したい文字列は検索値の左側にあるので、vlookupが使えない

 

vlookupは範囲の一番左の列からを参照するので、

この場合「ルフィ」と入力して「男1」を自動で出るシステムになってしまう。それは逆やん。

f:id:tohruyoshino:20200321175133p:plain


打開案1:「男1」を名前の左へ持ってくる

要は「男1」とかの列が名前の左にあればいいので、

そもそも名前の左に「男1」列を作る

f:id:tohruyoshino:20200321175613p:plain

 

ハイ。簡単。後はVlookup関数で行ける。

 

そもそも名簿エクセルって毎年コピペして使うケースが多いので、

性別列の右に入れておくと、コピペで消される恐れがあるんだよね

そういう意味でも、こちらの方法はとても分かりやすく、合理的。

 

打開案2:Match関数とIndex関数を組み合わせる

Match関数とIndex関数を組み合わせると、

Vlookup関数と同じ働きをすることができる。

しかも検索列がどこでも良いというVlookup関数の上位互換とも言える。

 

具体的には「=INDEX(検索範囲,MATCH(検索範囲,検索値))」という入れ子構造になる。

分かりにくいので、少し細かく解説していく。

 

まずINDEX関数は「=INDEX(検索範囲 , 番号)」という形になっており

検索範囲の中で上から何番目の文字列を教えて」という関数だ。

f:id:tohruyoshino:20200321181320p:plain

F2には、F3に示されたような関数が入っている。

「=INDEX(C2:C21,3)」なので、

「C2からC21の範囲で、上から3番目を教えて」という形になる。

上から3番目はナミなので、ナミが表示される。

 

後は「ナミ」は「女1」なので、

「”女1”は3番目だよ」と数字を教えてくれる関数が必要になる。

それがMatch関数

 

Match関数は「=MATCH(検索値 , 検索範囲)」という形になっており、

「検索値は、検索範囲の何番目だよ」と教えてくれる

 

なので「=MATCH(E4,B2:B21,0)」と入れると、

「E4の文字列は、B2からB21の中で3番目にあるよ」と返してくれる。

表示上は「3」とだけ出てくる。

 

因みにMatch関数の最後の「0」は、

検索文字列が元の文字列と完全に一致しているかの判定をする。

まぁ0で良いんじゃないかな。

 

組み合わせると、こんな感じ。

f:id:tohruyoshino:20200321182714p:plain

 

F2のルフィの中にはF3のような関数が入っている。

実際には、こんな感じ。「=INDEX(C2:C21,MATCH(E2,B2:B21,0))

 

具体的に見ていくと、

【E2(男1)はB2からB21の中で1番目で】、

 C2からC21で【1番目】は”ルフィ”だよ」となっている。

 

とりあえず、「男1」から「ルフィ」などを引っ張ってくる方法はできた。

 

男女別名簿を格好良く作る

じゃあ実際に名簿を作ってみる。

こんな感じで「男1」と書いて名簿だと楽だが、ちょっとカッコ悪い

f:id:tohruyoshino:20200321183832p:plain

 

できれば、こんな感じで番号だけで行きたい。

f:id:tohruyoshino:20200321183955p:plain

 

とりあえず分かりやすいから、Vlookup関数で行ってみるか。

f:id:tohruyoshino:20200321184119p:plain

Vlookup関数らしい感じで設定したが、

検索したセルの”G2”には「1」しか入っていないから正しく表示ができない

 

これを何とか「男1」にしたい。

なので検索値を「G2」から「”男”&G2」にしてみる

f:id:tohruyoshino:20200321184432p:plain

 

やったー!

「ルフィ」って表示された―!

 

因みに「”男”&G2」ではなく、「””」を取った「男&G2」ではダメ

文字列は「””」でくくらないといけないというルールがあるので。

 

後は少し調整して、できあがったのがこちら。

f:id:tohruyoshino:20200321184945p:plain

 

エラーメッセージがカッコ悪いので、IFERROR関数で消す。

f:id:tohruyoshino:20200321185702p:plain

 

これで完成かなー。

説明にすると長いけど、割とあっさりできたね。

 

振り返り

とりあえずできたが「男1」とかの列を足さないといけないのが少し気にかかった。

もう少し工夫すれば消せるかも?

 

あと今回は男女で列が分かれているケースだけど、

連続しているケースもあるわけで1列で表示するにはどうするか検討の余地があり。

 

とりあえず今日はここまで。

【プログラミング】職場でエクセルを教えていたら、プログラミング教育のねらいが分かった【教育】

今の職場で働き始めてから、気が付いたことが、

教員はエクセルの技能がそんなに高くないということ。

 

ネットでの様子を見ていると、教員だけに限らないのかもしれないが、

とりあえず自分は周りより少しエクセルの技能に長けているらしい。

 

吉野の立場に関しては、こっちの記事の方が少し詳しいので、よかったらどうぞ。

tohruyoshino.hatenablog.com

 

 

例外値

パソコン関係、特にエクセルに関しては

ベテランになればなるほど分からないことが増えるようで、

吉野への質問が増えてくる。

 

パソコン関係の質問はなんでも優しく教えるのを信条にしているので、

質問には熱心に答えていたが、今年度は少し違うことがあった。

 

今年度、ある中年の女性教員が移動してきたのだが、

この人がまたパソコン関係がめっぽう弱い

時折、質問をされるので答えるのだが、知識が無いのでなかなか話が通じない。

正直、教えていてイラっとするのだ

 

今までもこの人くらい分からない人はいたのだが、

この人だけは教えていてイラっとするし、教えたくないなと思わせる。

 

「教えたくない人」の登場

この人のもの言いとかいろいろな理由はあるのだが、

一番イラっとした原因は、この人は学ぶ姿勢が無いのだ

情報リテラシーが0のまま、何も変化が無い

 

振り返ってみると、うちの学校はベテランが多いが学ぶ意欲が高い人も多い

こちらが丁寧に説明をすると、それを理解しようと努める人が多いのだ。

 

そういう姿勢のおかげというか

職場全体として、エクセルを扱える人は多いし、扱おうとする雰囲気も見られる

他の人が作った便利なシステムとか、みんな積極的に使おうとする。

 

勿論、関数がそんなに使えるようになるわけでもないし、

質問に答えても理解しきれなくて、後日同じ質問をしてくる時もあるが、

なんとか理解しようとする頑張りが見られる

 

先程の中年女性はその態度が無いので、イラっとしたようだ。

 

質問の変化から見えてきたもの

イラっとしたのは、質問する態度の問題であったが、

じゃあ他の人は意欲があるから、全体的なパソコンの技能が上がっているかと言えばそうでもない

同じところで躓く人は多いし、自分関数を使ってシステムを組める人は殆どいない。

 

ただ数年間質問を受けてきて、最近は質問の内容が変化してきたのだ。

 

以前までは

「全く分からないから、やってくれないか」

「このエクセルが壊れちゃった」

というヘルプがよく来ていたが、

 

最近は

「こういうことがやりたいんだけど、作り方が分からない…」

「多分、この辺が壊れている感じがする…」

という質問が増えてきている。

 

つまりエクセルのできること(できそうなこと)を理解した上で、

自分はその技能が足りないので助けてほしいという感じになってきた

 

ここで思ったのが、「あ、プログラミング教育で身に着けたい力ってこれか」ということ

 

プログラミング教育のねらい

今うちの職場の人は、エクセルでできることを知り、

「こういうシステムが組めそう」とか

「多分こうしたらいい」とか

「この部分が怪しい」という『思考』ができるようになってきた。

ただしそれを実現させる『技能』が足りないのだ。

 

エクセルへの理解が進んだ分、エクセル的思考力が伸びたとでも言おうか

あるいは要件定義(?)ができるようになったというのかな。

 

プログラミング教育も

プログラマーを育てるわけではなく、プログラミング的思考力を育む」と言われている。

 

細かい思考力の定義の違いはあれど、うちの職場の人のように、

できることと、できないことを正しく理解し、

どのようなことができるか考えて扱うことができるという点が

根本的なねらいとして同じなのではないか。

細かいプログラムを書くのはさらに詳しい人がやればいい。

 

じゃあうちの職場の人は、どうしてそういう思考に変化したのだろうか。

それはまた今度考えることにする。

【成績・所見エクセル】要録対応とかをパワーアップさせた成績・所見エクセルができた【働き方改革】

tohruyoshino.hatenablog.com

 

上の記事の続き。

問題点の抽出

前回の最後にも書いたが、このエクセルの問題点はこんな感じだ。 

  • 教科が3~6年生用。生活科が無い。しかも低学年は2段階評価。
  • 低学年用の2段階評価シートが必要
  • 「要録成績」がうっかり打ち込みそう。要録類はシートの色を変更
  • つーかいじらない部分には保護をかけよう
  • 来年度から英語が教科化して、ABC評価かもしれないのに、成績欄がない!
  • 文体変更マクロがゴリ押し過ぎるので、マクロを組み替えて、辞書登録できるようにする。

上の5つはすぐに対応できそう。

今回問題なのは、一番下のマクロの組み替えである。

とりあえずは上の5つを変えていく。

 

細かい調整

とりあえず「要録成績」「要録用所見類」はシートタブの色を変更してみた。

 

生活科が無い問題は、

最初の学年の設定画面で2年生以下なら「理科」の部分に「生活科」が現れるようにした。

細かいの評価の観点はまた後で入れなおす。

f:id:tohruyoshino:20200314184436p:plain

 

要録の成績が低学年に対応していない件は、

とりあえず手打ちできるシートを用意したので、そちらに打ち込んでもらおう。

 

後は英語の成績を追加。

4観点だよね…?

やばい、違ったら勉強不足がばれる。

 

マクロを入れよう!

今回の改変の大きな目玉は、

辞書登録できるシートを作って、所見文を要録風に直すのをもっと簡単にしよう

という点である。

 

とりあえず辞書登録シートを作成。こんなのは凝らずにシンプルでいい。

f:id:tohruyoshino:20200314185019p:plain

 

問題はマクロの中身である。

今まではReplaceメソッドを使って、毎回ゴリ押しで変換していたようだが、

辞書登録するとなると、Replace関数の方がループの対応が簡単そう…?

 

ということで、出来上がったコードがこちら。

Sub 敬体から常体へ()
'文体を変更する
Dim i As Long
Dim k As Long
Dim p As Long
Dim cnt As Long
Dim a As String
Dim b As String

'置換する辞書の数
cnt = WorksheetFunction.CountA(Worksheets("辞書登録").Range("A:A"))

'通常所見から外国語まで
For p = 3 To 6

 '児童数
 For i = 3 To 44

  '変換する言葉の数
  For k = 2 To cnt
   a = Worksheets("辞書登録").Cells(k, 1)
   b = Worksheets("辞書登録").Cells(k, 2)

   Worksheets("要録用所見類").Cells(i, p) = Replace(Cells(i, p), a, b)
  Next
 Next
Next

MsgBox "なおしたよー" & vbCrLf & "後は自分でよろしくね"
End Sub
 

 思っていたより、短くなりました。

でもFor~Next文が3回出て来て、ぐるぐるするコードです。

これで辞書登録したものがどんどん置換されていきます。

 

実際に動かしてみると、以前のReplaceメソッドより遥かに重くなってしまったので、

それだけ何とかしたいが…何か良い知恵は無いですかね?

というかReplaceメソッドでループ対応させればよかった?

 

副産物

今回作ったマクロって、

「あるセルに書かれた文章の中から、登録した特定の言葉を置換する」というものなんですね。

 

あれ?

これって表記便覧も同じ仕組みじゃね

表記便覧とは

・・・文章の表記において、「この言葉は こう書いてね」という決まりが載っている

   便覧。

   例えば「色々な」は「いろいろな」とひらがなで書かないといけない。

 

前の画像で、左側は所見文→要録風に直すための辞書だけど、

右側は表記便覧用の辞書にした。

基本的には、上のコードの数字を少しいじっただけ。

あとは、どれくらい精度が高い辞書が作れるかだな。

 

振り返り

とりあえず「辞書登録をして、所見文から要録風に直すシート」は作ることができた。

さる先生いわく、これで2億年分くらい無駄しているらしいから、みんなで運用すれば1億年分くらいは削れるんじゃない?

 

今回の良かった点は表記便覧を直すシートができたことかな。

これでまた意味の無い仕事が少し減ったぞ。

後はどちらもどれくらい精度が高い辞書が作れるかにかかってくるから、

今度はその研究ができないかな。

 

ただ直せるけど、すげー重いから、職場のPCで止まらずにできるかが心配。

このエクセルが欲しい方は、またツイッターなりコメントなりで連絡をくれればと思います。

 

下のnoteにファイルを置いておきました。

note.com

 

因みに参考にしている本はこちら

たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】

たった1秒で仕事が片づくExcel自動化の教科書【増強完全版】

  • 作者:吉田 拳
  • 発売日: 2020/04/13
  • メディア: 単行本(ソフトカバー)
 

 

 

【成績・所見エクセル】要録対応もしてる成績やら所見やらを一括管理するエクセルを作ったー【働き方改革】

tohruyoshino.hatenablog.com

ここからの流れで。

 

先日、職場でふと思ったことから、年間の成績やら所見やらを一括管理するエクセルを作った。

ひとまず職場で活用してみたが、色々不備が出たので、紹介しつつ改善を考えていく。

 

なぜこのエクセルができたのか

元々このエクセルは、学期ごとの通知表を出すためのものだった。

所見と成績を入力すると、1番~40番のシートで児童それぞれの通知表ができるので、

それを印刷するという優れたエクセルであった。

 

ところがうちの自治体では校務支援システムが導入されたことによって

通知表をそちらで作るようになった。

 

成績や所見は今まで通りエクセルで処理するものの、通知表はエクセルで出さないので

1番~40番のシートが不要になったのだ。

 

通知表エクセルは、以前までいた先輩が作ったものだが、

先輩はさらに通知表から要録用に成績や所見を変換するエクセルも作っていた

マジパネェ。生きる支援システムだよ。

 

因みに先輩は校務支援システムが入る前に要録管理を電子化したいと思い、

自治体にかけあって、いち早く要録をエクセル管理にしたという強者中の強者である。

 

通知表エクセルに使い慣れていることもあり、今年度も使っていたが、

折角なら1~3学期まで1つのエクセルで良いんじゃない?

なんなら変換エクセルも一元化して要録まで対応させちゃおうぜ!

という考えに至ったのだ。

 

完成品

f:id:tohruyoshino:20200313220924p:plain



 

出来上がったのがこんな感じ。

下のシートを見てもらうと分かる通り、1~3学期の成績と所見、要録の成績と所見が打ち込めるエクセルになっている。

 

名簿~特別活動

「名簿」は…まぁいいよね。基本設定を入れる。

でもここの情報は後で色々と使うから、ちゃんと入れる。

 

「評価文言」シートは、通知表にどんな文言で出すか設定するだけ。

あ、今考えたら、このシートもう必要ねぇな。

 

クラブ委員会はこんな感じ。

f:id:tohruyoshino:20200313220849p:plain


上にクラブや委員会名を登録しておいて、

下に番号を入力すると、表示される。

 

f:id:tohruyoshino:20200313221715p:plain

 

「特別活動」シートでクラブ、委員会、1~3学期の学級活動とかの係を入力。

まとまってると楽かなー、くらいの気分で作った場所。

 

成績

学期ごとに成績を入れる。

Aだとピンク、Cだと青になる。

f:id:tohruyoshino:20200313222533p:plain

 

横の端っこには、その子のA、B、Cの数が分かるようになっている。

下には縦のABCの数が分かるようになっている。画像だと見切れちゃったけど。

 

こんな感じで、1~3学期の成績を入れると、

f:id:tohruyoshino:20200313223037p:plain

「要録成績」に自動で反映される。

ついでに評定も出してくれる。

 

所見

こんな感じで、通常・総合(生活)・道徳・外国語を書く欄があるので、

頑張って書いていく。

f:id:tohruyoshino:20200313223325p:plain

 

因みに書いた文字数は、その欄の隣に表示されている。

画像の右の方に標準文字数を設定できるところがあるので、

その標準時数を超えると文字数が青くなる。

 

f:id:tohruyoshino:20200313223853p:plain

標準時数を超えると文字が青くなるのと、D2のセルが1増える。

D2のセルは標準時数を超えた人数なので、これで書き終わった人数を把握できる。

 

D3のセルは、所見ヤッホイ指数になっている。

所見ヤッホイ指数

・・・所見がどれくらい進んだが%で教えてくれる指数。

   詳しくはさる@小学校教師(@saruesteacher)の

  『全部やろうはバカやろう』を参照 

 因みに1人が標準字数を超えても、標準字数以上の%は増えない仕組みになっているので

100%になるまでマジで終わらない

 

3学期まで書くと、いよいよ要録の所見作業である。

要録所見はこんな感じ。

f:id:tohruyoshino:20200313225120p:plain

 

右の方にマクロが入っているので、

「所見結合」を押すと、1~3学期までの所見を結合した状態で表示してくれる。

f:id:tohruyoshino:20200313225306p:plain

 

それから結合した後に「文体の変更」を押すと、敬体から常体に直してくれる。

f:id:tohruyoshino:20200313225500p:plain

ただ見て分かる通り、直らない部分も多いので、そこは人がチェックするしかない。

マクロの中に辞書登録していってもいい。

 

振り返りと今後の展望

一元化して少し楽になったかなーとは思う。

しかし実際に職場で運用すると問題点もたくさん出てきたので、今後の直す点をリストアップする。

  • 教科が3~6年生用。生活科が無い。しかも低学年は2段階評価。
  • 低学年用の2段階評価シートが必要
  • 「要録成績」がうっかり打ち込みそう。要録類はシートの色を変更
  • つーかいじらない部分には保護をかけよう
  • 来年度から英語が教科化して、ABC評価かもしれないのに、成績欄がない!
  • 文体変更マクロがゴリ押し過ぎるので、マクロを組み替えて、辞書登録できるようにする。

ひとまずはこんなところかな。

こんな機能があると良いんじゃない?と思いついた方は、教えてください。

下のnoteにファイルを入れておきますね。

note.com

 

tohruyoshino.hatenablog.com

 

【ロマネスコ先生】所見の「です」「ます」を要録風に変えるファイルを強化してみた【働き方】

先日、ツイッターでこんなのが流れてきた。

 

 

所見で書いた文章を要録の文体に直すものらしい。

簡単に言うと、「です」「ます」調を「である」調に直すシートのようだ。

 

現状

すげー便利だなーと思いつつ、3学期にこれを活用しなかったのは、

既にうちの学校ではこれに似たエクセルが運用されているからである。

 

エクセルに長けた先輩が作ったものだが、作られて以来みんなに活用されている。

具体的には1学期、2学期、3学期の所見文をシートに貼り付けると、

自動的に合体して要録文体に直すというものである。

 

因みに便利なのだが、うちの自治体は最近こそ電子媒体で要録を残すことを許可したが、

それまでは必ず紙で印刷しなければならなかった

そこで先ほどのエクセルで要録文体を作っても、

前年までの情報が書かれた要録用紙の指定位置に狙って上から印刷をするという

勇気の印刷」をしなければならなかった。

 

最近は電子媒体、つまりPC上での管理でいいよ(年度末に印刷はする)ということになったので、

勇気の印刷は必要なくなった。

 

先輩エクセルの問題点

うちの学校で運用されていたエクセルには2つの問題点があった。

  • VBA(マクロ)で作られているので、管理保守・改変が難しい。
  • VBA(マクロ)の中身がゴリ押し

このエクセルの問題点はマクロの中身は簡単なのだが、

マクロ自体を扱える人が少ないので改変が難しいことだ。

 

因みに中身は

『「理解しました」を「理解した」に変更しろ』

『「取り組みました」を「取り組んだ」に変更しろ』

『「見られました」を「見られた」に変更しろ』

のような命令が何個も並んでいるTHEゴリ押しの変換装置になっていた

なので登録された文言以外は変更ができない。

 

吉野はマクロの中身が分かるので、自分の文体に合わせて文言を登録していったが、

周囲の人はそれができないので、ある程度変更した後かなりしっかりとチェックする必要があった。

 

ロマネスコ先生の変換エクセル

翻って、今回紹介したロマネスコ先生のエクセルは、辞書登録機能が付いている。

おお!これは便利!

 

しかも関数だけ作られている。

なんか改変もできるかも?

note.com

 

ただこれを見た時ちょっと思ったのが、

辞書が16個は少なくないか…?もっと登録したいなぁ…

 

シートの分析

折角なので、もっと辞書を増やしたいと思い、

ロマネスコ先生のエクセルを改変してみることにする。

 

まずロマネスコ先生がどのようにこのシートを作っているか解析する必要がある。

これがロマネスコ先生のシートの中身である。

f:id:tohruyoshino:20200313221327p:plain

 

ぱっと見だと気が付きにくいが、

「②所見・通知表」がB列で「要録用」がR列なので、間に何列か隠れている

 

開けてみるとこんな感じ。

f:id:tohruyoshino:20200313221404p:plain



C~Q列まで出てきた。

ここにはSUBSTITUTE関数が入っていた。

 

SUBSTITUTE関数は、ある文章の文字列を指定の文字列に置換させる関数だ。

SUBSTITUTE(変更したい文 , 変化させたい文字列 , 変化後の文字列)と書くとできる。

 

なので、最初の見本はSUBSTITUTE(所見文 , ました , た)になっているので、

『所見文の「ました」という文字列を「た」に置換しろ』という命令になっている。

 

以下は『左隣りの文の「変化させたい文字列」を「変化後の文字列」に置換しろ』という命令になっている。

なるほど。分かりやすいし、面白い。

 

辞書を増やそう

ロマネスコ先生のシートだと、登録した文字列1つに対して、SUBSTITUTEが1回使われている。

なのでたくさん登録すると列が異常に増えることになる。

 

もちろん非表示にすればいいので、それでも問題は無いが、

今回は少し違うアプローチをとってみる。

 

先ほどのSUBSTITUTE関数だが、関数1個で1組の文字列しか置換できない。

では複数の文字列を1回で置換することはできないのか。

答えはできるSUBSTITUTE関数を入れ子にするのだ

 

SUBSTITUTE(変更したい文 , 変化させたい文字列 , 変化後の文字列)の

「変更したい文」の中にさらにSUBSTITUTE関数を入れる。

 

具体的には、こんな感じ。

SUBSTITUTE(SUBSTITUTE(所見文, ました , た), でした , だった)

これで『【所見文の「ました」を「た」に置換した文】の「でした」を「だった」に置換しろ』という命令になる

こんな感じで入れ子にすると、一回で複数の置換ができる。

 

スーパーマトリョーシカ現象

とはいえ、たくさんの登録した文言を一回で置換しようとすると

入れ子入れ子を重ねて、マトリョーシカのようになっていく

 

関数を書くのがくっっっっっそ面倒だし、何とかならんかなとググってみる。

そこで見つけたのが、以下の方法。

excelkamiwaza.com

 

なるほどー。こういう準備をすればいいのかー。

ということで、さっそくまねっこ

f:id:tohruyoshino:20200313221214p:plain



 

アホみたいな量や…これは手打ちは無理…

とりあえず250まで作って、一番下の関数を使ってみる。

 

………文字列化した数式を普通の数式に戻すのってどうするんだ?

 

技術と仕様の壁

上の関数っぽいやつは文字列なので、これを普通の数式にしなくてはいけない。

コピーして値貼り付けして、先頭に「=」つければできるけど、それじゃあ…アレー?

 

仕方ないので、コピーして…をやってたら

「64以上は、入れ子は無理やで」とかいうエラーが出た

引数が多いとダメなのは知ってたけど、やっぱり250はダメか。

いろいろ試して、66行目までならいけることが分かった

 

そんなこんなありながら、実際に入れてみる。

全部の行に対応させるのもちょっと色々やったが、そこは省略。

出来上がったのがこちら。

f:id:tohruyoshino:20200313221237p:plain



 

やったー!できてるー!

と、言っても分かりにくい。

 

因みに辞書登録するシートは新しく作ったが、こんな感じ。

66個まで登録できます!

f:id:tohruyoshino:20200313221258p:plain



 

振り返り

とりあえず当初の目標である辞書を増やすは達成された。

しかし登録数に限界があるのが、少し気に食わない。

個人的には無制限に登録できるようにしたい

 

因みに今回は66個で終わりにしたが、ロマネスコ先生のように間に列を挟めば、

1回目で、66個分を置換

2回目で132個分を置換( 67~132行目)

3回目で198個分を置換(133~198行目)

と言う感じで置換数を増やすことはできる。

3回もやれば、辞書的には十分かなー。

 

ただ関数でやるとSUBSTITUTE関数のスーパーマトリョーシカになるので、ちょっとスマートじゃない感じがした。

あと「要録用」でできる文章が関数であり文字じゃないのが気になった

 

というわけで、次回はマクロを使って、辞書登録が無制限にできるエクセルを作ってみようと思う。

 

今回作ったシートは公開したかったが、はてなブログってnoteみたいにファイルをアップできないのかな。

誰か教えて。

 

(2020.3.13追記)

21.gigafile.nu

アップしてみた。ダウンロードパスは1234。

5月半ばくらいまでダウンロード可能なので、以降欲しい方はコメントとか、ツイッターでDMしてください。

 

tohruyoshino.hatenablog.com

 

アプリ開発日記1

androidアプリが作りたくなったので、頑張って作っていく。

目標としては自分用のtodoリストを作ること。

 

今日はandroid studioをインストールして、少しいじってみた。

ちまちまやっていく。

とりあえず今回、参考にしたもの。

 


Android Studio入門 アプリ開発を始めてみよう【Kotlin プログラミング #1】