cyborg’s blog

たまに更新します。

VBAをやろうかなぁ

ここのところ、仕事ではC#を使ってゲーム開発をする業務が大半を占めていまして、たまにGoogleAppsSript(GAS)も使っております。

そして今頃になって、VBAをもう少し真面目に勉強しようかなぁと思ったりしております。

 

社内ドキュメントをエクセルやパワポで作る業務もちょいちょいあるわけですが、便利そうなVBAのプログラムをネットで見つけてコピペして使うことはあったのですが、何と言いますか、改めてプログラムを見てみると、C#やGASあるいはjavascript(GASはjavascript準拠ですね)とはけっこうお作法が違うわけです。

 

定年迎えるまでにエクセルやパワポを使うことが無くなる可能性も低そうだし、ここいらでVBAも勉強してみようかと思ったりしております。

VB.NETでもなくVBAと言うと何か言われかねない気もしつつ、でも覚えとくと仕事の効率化は進みそうな気がしております。

【スプレッドシート関数】空白を詰めたい

textjoin関数とsplit関数を使うと、空白セルを簡単に詰めることができます。

*1

 

*2

textjoinで区切って、splitで分ける

textjoin関数は、各セルに割り振られた値をつなげることができます。

例えば、A列に市町村名が飛び飛びに記載されています。

これを、C1から始まる1行目に空白を詰めて表示されるようにします。

 

A列に飛び飛びに市町村名が記載されており、C1~Q1に空白を詰めて表示

スプレッドシート

 

 C1のセルには以下の関数を入れています。

 

= split(textjoin(",",true,A1:A23),",",true)

 

まず、

textjoin(",",true,A1:A23)では、A1:A23の文字を空白を抜かしてカンマ(,)で結合します。

C1セルに

 

= textjoin(",",true,A1:A23)

 

と入力すると、C1セルに

富山市,高岡市,魚津市,氷見市,・・・・と表示されますね。

 

C1セルにtextjoin関数を使っています。空白を飛ばしてカンマで文字列を結合しています。

C1セルでtextjoinで文字列を結合

三つ目の引数が結合する文字列の範囲です。今回はA1:A23の範囲となります。

一つ目の引数は、文字列を結合するときに使用する区切文字です。ダブルクォーテーションで囲んでください。

二つ目の引数で、Trueとすると、空白を無視します。

 

しかしこのままでは、空白を詰めたというよりも、文字を連結しただけになってしまいます。そこでスプレッドシートの独自関数であるsplitを使います。

split関数は以下のように使います。

 

= split(分割する前の文字列,どの文字を目印に文字列を分割するか,空白を削除するかどうか)

 

今回は

  1. 分割する前の文字列はtextjoin(",",True,A1:A23)
  2. カンマで分割。分割する目印となる文字はダブルクオーテーションで囲みます。今回は "," ですね。
  3. 空白を削除(今回は空白はありませんが)。Trueと入力します。

となります。

これらを合わせて

C1セルに

 

=split(textjoin(",",True,A1:A23),",",True)

 

とすれば冒頭の画像のように、C1セルに富山市、C2セルに高岡市というように空白を詰めて表示してくれます。

 

まとめると、カンマで区切って連結し、カンマを目印にセルに分割表示するというやり方になります。

今回は富山市高岡市など、もとの文字列にカンマが含まれないため、区切り文字にカンマを用いましたが、区切り文字は元の文字列に含まれない文字にすると良いでしょう。

\\のように2文字使っても構いません。その場合は

 

=split(textjoin("//",True,A1:A23),"//",True)

 

となりますね。同じ結果になるはずです。

エクセルで空白セルを詰めて表示したい場合は、match関数やindex関数を駆使していたような記憶がありますが、スプレッドシートだと、とても楽にできますね。

 

おまけ

 C1セルからQ1セルまで横向きに展開しましたが、これ、縦にしたいこともありますよね。

そんな場合には縦と横を入れ替えてくれるtransposeという関数を使います。

transposeはエクセルでもサポートしている関数です。

縦方向のセルの値なら横方向に並び替え、横方向のセルの値なら縦方向に並び替えてくれます。

今回の場合は、C1セルの関数にさらにtransposeをかませます。

 

= transpose(split(textjoin("//",True,A1:A23),"//",True))

 

f:id:s_ryusei:20210518212449p:plain

transpose関数で縦方向に並び替え

C1~C15に並び替えができました。

 

ひとりごと

 

普段は、C#を使うことが多いのですが、そんなにレベルが高いプログラマーではないので、エクセルやスプレッドシートの関数って便利だなぁと思ってしまいます。

 

エクセル関数ベースのプログラミング言語なんていうのができたのですね。

 

Microsoft Power Fx

 

という言語らしいです(ITMediaの記事はこちら)。

Visual Studioとの親和性も高そうです。

 

 

*1:2021年5月現在、エクセルにはsplit関数が無い(と思われる)ため、スプレッドシートのみで処理ができる方法です。

*2:ちなみに、QUERYやFILTERという関数を使っても簡単にできるようですが、それはまた次回以降に。

a^3-b^3=65

a3-b3=65を満たす整数の組(a,b)をすべて求めよ。

 

たまたまなんですが、Youtubeでこんな数学の問題があるのを知りました。

せっかくなので答えを見る前に自分でもやってみるぞ!と一念発起してみました。

かなり違う解法をしていたので、せっかくなので自分流の回答を掲載してみます。

(そして気づいたのですが、手書きするよりもパソコンで清書するほうが時間がかかる・・・)

 

任意の実数bに対して、f(a)=a3-b3は単調増加関数。

(∵ f’(a)=3a2 ≧0)

f(a)は次のような関数になる。

なお、f(a)はy=a3をy軸方向に-b3だけ平行移動したもの。

 

f:id:s_ryusei:20200208100337p:plain

a3-b3=65のグラフ

 

a軸との交差箇所近傍を拡大する。

 

f:id:s_ryusei:20200208100459p:plain

 

ここでf(a)=a3-b3=65を満たすためには、いくつかの条件がある。そのうちの1つは以下。

条件)a=b+1の時のf(a)が65以下であること

整数に範囲を絞ると、a=b+1の時、f(a)はf(a)>0の中の最小値となる。

f(b+1)>65となってしまうと、そもそもf(a)=65を満たす整数はない。

したがって、(b+1)3-b3 ≦65

b3+3b2+3b+1-b3 ≦65

3b2+3b ≦64

3b(b+1) ≦64

b(b+1) ≦21.33333・・・・

これを満たす整数bは、 b=-5、-4、-3、-2、-1、0、1、2、3、4

 

さらに条件を絞っても良いが、簡単な計算なので、ここから総当たりの方が短時間でできそう。と余計なことをつぶやいてみる。「条件を絞るスキルは持ち合わせているぜ!」というさりげないアピール。さりげなくない? 前面に出しすぎ?)

 

a3-b3=65( a3=65+b3)を満たす整数aがあるかを考えてみる。

 

b

b3

a3(=65+b3)

a

-5

-125

-60

×

-4

-64

1

1

-3

-27

38

×

-2

-8

57

×

-1

-1

64

4

0

0

65

×

1

1

66

×

2

8

73

×

3

27

92

×

4

64

129

×

 

よって、aとbの組み合わせは

(a、b)=(1,-4)、(4,-1)

//

 

こんな感じです。

もっと簡単に解けるかもしれないけれど、それを数学的な言語に置き換える術を持っていない。。。

整数nに対して、n3をツラツラと書いていく。( )はn。

・・・、-216(-6)、-125(-5)、-64(-4)、-27(-3)、-8(-2)、-1(-1)、0(0)、1(1)、8(2)、27(3)、64(4)、125(5)、-216(6)、・・・

n=-6以下とかn=6以上だと、もう、どんな3乗の整数を足しても引いても、絶対値65を超えちゃいますよね(ここの部分を数学的な言語で記載できれば、この解法もOK?)。なので、aもbも-5以上5以下でしょう。なので、a3もb3も取りうる範囲って以下じゃないですかね?

-125、-64、-27、-8、-1、0、1、8、27、64、125

これって眺めてるだけで絶対値が1と64のものを組み合わせる以外なくないですかね?

なので、aとbの組み合わせは4、-4、1、-1のいずれかだけでしょ。

総当たりで考えても1分くらいでわかるんじゃないですかね?

で、答えは冒頭と同じです。

 

数式をいじるのも面白いですが、視覚的に分かるのも嬉しくなります。

 

 

 

未来は?

現場ではまだまた人不足の実感も多いことだろう。
現場から遠い人たちは、労働力がいくらでもあるとか、AIがあれば何とかなるとか思ってやしないか?
甘い見込みで予想して、後で「そんなはずじゃなかった」と言う。

圧力による公文書書き換え

財務省の書き換えが問題になってますね。

結果を見れば、当然やってはならないことなのですけれど、今の情勢を見るとなんか仕方ないよね、という気持ちもあったりします。

 

森友問題に関しても、本人たちに特に瑕疵のあることをした意識はなかったんじゃないかなぁ。

 

書き換え前のもともとの文書を見れば、特に過失があるわけでもないというのが大半の意見ですよね。

 

にも関わらず書き換えたのはアベさんへの忖度だとか、佐川さんの国会答弁との整合性のためだとか言われていますが、まぁなんて言うんでしょう。

私には結局のところ、悪いのは政治家に見えちゃうんですよね。

 

これは指示をしたとか忖度されるほどのものがあったというようなものではないと思います。

 

問題がいつの間にか、国会等における発言と文書に整合性があるかないか、というところに向かってしまったところにあると思います。

 

通常、発言者は膨大な文章の内容を全て把握しているわけではないので、細かいことを聞かれれば記録文書との整合性はとれない状況が出てきても仕方ないですよね。

 

整合性がそこまで重要ならば、AIでも導入して文書をそのままコンピューターに読ませればよいだけではないか。

 

それを人にやらせておいて、いざ、間違っていたら、野党議員を中心に「虚偽」、「虚偽」、「虚偽」、「嘘」、「嘘」、「嘘」という言葉が飛び交う。

 

そこまで整合性が重要で、間違ってたら「悪」と判定されるならば、書き換えしちゃう人の気持ちも分かりますよね。

で、それが発覚したら「改ざん」「改ざん」。

 

私、これまで生きてきて、「虚偽」とか「改ざん」なんて言葉を日常(プライベートでも仕事の中でも)で使ったことってないんですよね。これってもはや今話題のイジメのレベルも超えてるような発言じゃないのですかね。

 

本当に人格を否定する言葉で、軽々しく使ってはいけない言葉だと思うんです。

これを言われる人の気持ちになってみたら、どう感じられますかね?

 

そして官僚のクビをとることを議員たちは目的にしている。

クビをとるというのはまさしく実際のところは仕事をクビにすると同じことなんだよね。たとえ本人による依願退職だったとしても実際はクビですよね。

 

官僚で高給もらってきただろうし、クビになって生活に困らないかもしれないし、あるいは次なる就職先もすぐに見つかるかもしれないけど、でも人の職業を奪うことの重大さを国会議員は分かってるのですかね?

準備も何もなしにいきなり職を失うわけです。

 

もう、発言食い違いからここに至るまでは負の連鎖ですよね。

 

文書の書き換え(これを正当な手続きを踏んでいないため改ざんと言うにしても)は、もし自分10人いて当事者だったら、4~5人くらいはやっちゃうんじゃないかな。

 

本来、変えなくてはいけないのは官僚の組織・仕組みではなく、虚偽とか改ざんとか人格否定につながりかねない発言を軽々しくしちゃう政治家を当選させないような選挙の仕組みの方じゃないのでしょうか。

 

野党が人格否定ではなく政策否定をしっかりできるようになれば、多くのことが解決されると思う。

やむにやまれぬ不正行為もかなり減るのではないですかね。

 

文書との整合性がとれない発言をどうしても「虚偽」ということを言いたいならば、国会で発言する人に対して1年以上の準備期間をあげないといけないかと思う。

そんなことしてたら「さっさと出てこい」と言うし、さっさと出てきて「わかりません」と答えたら「しらばっくれるな」と言うし、本当にどうしちゃったんですかね?

 

議論の応酬で、政策に不満があることだってあるでしょう。しかし、その時に人格否定のような発言、威圧的な発言を最初に行ったものは厳しく罰せられるようなそういう仕組みを作りませんか。

 

国会論戦とか見てても、本当に気分が悪くなることが多いのです。

 

森友問題のちょっと傍流

久しぶりのコメントです。

ちょっと新聞を読んでて気になったもので書いてみました。

森友問題、加計問題などなど世間を賑わせてますが、前者に絡んで疑惑の多くの人が不起訴になりましたね。

ここでは、それを論ずるわけではありません。

6月1日の読売新聞の3面を見ていてふと思ってしまいました。

 

f:id:s_ryusei:20180601085416j:plain

 

「ごみがあったと証明できるのか。なかったのではないか」のくだり。

こいつら、大阪地検特捜部ですよね。

確か、村木さんの冤罪事件で反省していた奴らですよね。

けど、反省してないんじゃないのかね。

ストーリーありきの圧力をかけた物言いが許されるのですかね。

取調べる側であっても、もっと先入観を排除して客観的に物事を見ないといけないのではないのですかね。

大阪地検特捜部、解体しちゃえば?