10年前のVBA

f:id:primeno:20200205005535j:image初心者に有名なFizzBuzz
f:id:primeno:20200205005542j:imagefuzzbuzzの変形・世界のナベアツ
f:id:primeno:20200205005523j:imageEuclid互除法
f:id:primeno:20200205005538j:imageエラトステネス篩
f:id:primeno:20200205005530j:image進数変換?
f:id:primeno:20200205005516j:image方陣
f:id:primeno:20200205005520j:imageウラムの螺旋
f:id:primeno:20200205005527j:image?(楕円曲線論。不定方程式)

 

◉ここに挙げたのはほんとに最初期のもので、慣れてきたら「文章を点字に変換するプログラム」とか、数独ソルバーを作るだとか・・・

野心的で意欲的なプログラムを組もうと挑戦していたんですけれどね。挫折しました笑

対称式・交代式・差積 など

◉対称式 a^2+b^2など。a、bなどどの2つの変数を入れ替えても元の式と変わらないから。(この場合は2変数)

◉交代式 a^2-b^2など。どの2つの変数を入れ替えても、 -1倍になるような式のこと。

◉差積(基本交代式)    変数のすべてのペアの差の積(2乗をとる場合もある)。[3変数の例] (a-b)(a-c)(b-c) 。

❇︎差積は交代式である。

❇︎交代式は、差積と対称式の積で表せる。

❇︎差積は、判別式として表せる。

判別式とは、もとの方程式の係数から新たに作る式に他ならない。

 

カシオ関数電卓のオーバーフロー表示

1234567×1234567=真の値1524155677489(13桁)

ですが、

◉通常の電卓(10桁表示の電卓)のオーバーフロー表示は

E  152.4155677

小数点みたいなドットの左が3桁なので、3桁の桁溢れ(489)を表す。

◉カシオ関数電卓のオーバーフロー表示は

1.5241556777 ×10(下付き文字 )12 (上付き文字)と表示される。少し分かりにくい。

excelのオーバーフロー表示は

1.52416E+12

とか? 電卓と似てるようで少し違う?

倍数判定法

例として巨大な数(xとする)x=98765432123456789と言う数を、いろいろな数で検算して、倍数検算する(素因数に何が入っているかを調べる)

 

◉2の倍数判定法

xは奇数なので、あまりは1

◉3の倍数判定法

xの各桁を足して新しい数になるとまた各桁を足していく

9+8+7+6+5+4+3+2+1+2+3+4+5+6+7+8+9 = 89 (これは真ん中の1がハンパなので1を追加してあえてペアを作って後から1を引くのがアイデア)。 さらに8+9=17、1+7=8 なので、3の倍数ではない。(3で割った余りは2となる)

◉4の倍数判定法

これは、末尾2桁が4の倍数なら良い。xは余り1なので倍数で無い。

◉5の倍数判定法

簡単に、1の位が0か5ならよい。xは余り4

◉6の倍数判定法

2の倍数 かつ 3の倍数なら良い

◉7の倍数判定法はややこしい

7の場合の検算方法が1番ややこしい。末尾から6桁ごとに足して、456789+432123+98765=987677

987677÷7 = 141096 、余り5

❇︎なぜ6桁かというと、どうも1/7 = 0.142857 と小数点以下6つづつ循環するのに関係あるらしい。

 

◉8の倍数判定法

末尾3桁が8の倍数なら良い。789÷8=98余り5

◉9の倍数判定法

これも3の時と似ていて、各桁の和が9の倍数なら良い。89÷9=9余り8

◉10は簡単。言うまでもない。xの余り9

◉11の倍数判定法

末尾から2桁ことに足していってその和が11の倍数なら良い。xの場合449になるから、49+4=53。53÷11=4余り9

もしくは、こんな方法もある。末尾から数学を足して引いてを繰り返していく。9-8+7-6+5-4+3-2+1-2+3-4+5-6+7-8+9 =9。よって、あまりは9です。

 

☆他にも、ある。

37の倍数判定法は、3桁ごとの和を見る。

101の倍数判定法は、4桁ごとの和を見る。

3も7も11も37も101も、背後には理論的な背景がある。といってもすごく難しいわけではないので皆さんも考えてみれば頭の体操にはなりましょう。

 

◯まとめ

1桁ずつ足す 3か9

2桁ずつ足す 11

3桁ずつ足す 37

4桁ずつ足す 101

末尾2桁   4

末尾3桁   8

 

1月27日 春節ど真ん中

24日〜30日 は、春節ですね。コロナウイルス影響で、日本でも4例目の感染者が出ました。街でも中国人らしき人がマスクをいっぱい買い込んでいました。

◯今回も、日付け・127と言う数字について考察してみます。

まず、127は素数です。どのような素数かと言うと、

4で割ると3余り、8で割ると7余る素数である。

古典数学者により、

◉4で割ると3余る数は、2つの平方数の和で表せない事がわかっている。

◉8で割ると7余る数は、3つの平方数の和で表せない事がわかっている。

◉しかし、1770年にラグランジュが、全ての数は高々4つの平方数の和で表せることを証明している。

 

なので127は4つの平方数の和で表すことが出来る。理屈では出来ることがわかっているが、実際その4ペアを見つけてくるのは難しさが違う。(と言ってもこの時代PCにアルゴリズム組ませて総当たりさせれば一瞬ですが) 数学は一般的に存在証明の方が簡単な傾向がある。


f:id:primeno:20200128052122j:image

f:id:primeno:20200128052119j:image

Motzkin number = モツキン数(wiki)(後述)

Occurrence = 発生 、convergents = 収束級数

f:id:primeno:20200128055011j:image↑収束級数を発生させた

f:id:primeno:20200128055552j:image↑30項までの収束級数の表  Tan^2[ (2 - π ) / 6 ] 

 

◉モツキン数は、円周上の相異なるn個の点を互いに交わらないような線分で結ぶ方法の数。組み合わせ論や数論に多様な応用がある。らしい。私はなぜか細矢治夫先生のホソヤ・インデックス・ナンバーに似ているな、と思った。組み合わせ論などにいろいろな応用があるところとか。

sloaneのオンライン整数列大辞典ではA001006である。以前のブログにて紹介させてもらった洋書の辞典(the encyclopedia of integer sequences) では、M1184である。生成関数(G.F) は、(1 - x - (1 - 2x - 3x^2)^(1/2) ) / 2x^2 と書いてある。

 

◉また、
2^127-1はメルセンヌ神父自身が見つけたメルセンヌ素数です。12番目です。ちなみに127自体も2^7-1ですからメルセンヌ素数です。メルセンヌが研究する遥か以前ギリシャ時代の発見だそうです。

現在のところ、最大の素数=メルセンヌ素数なわけで、コンピューターの性能の発達により、3年か4年ごとに記録更新されていっていますね。2010年代でも4つが新たに見つかりました。現在の記録は、51番目のメルセンヌ素数です。2018年12月7日以来、見つかってませんが、このペースで行くと今年か来年に記録更新はあるでしょう。

 

20181207 = 3 × 6727069

 

f:id:primeno:20200219162743j:image6727069は4n+1型

多くのフォルダの末尾に一括連番をつける処理

Q.

バッチ処理でファイル名の末尾に同一の文字を追加する処理は分かるのですが、フォルダ名の末尾に同一の文字を一括で追加するバッチファイルの処理はあるのでしょうか?

 

A.

★はじめに
●自分のPC環境では正常に動作しましたが、(PC環境・設定・フォルダー名またはファイル名などの理由で)もしかしたら多少の誤動作はあるかもしれません。すべてのパターンに合わせるのは何気に難しいので、一応、「自己責任」ということを予めご了承願います。

●(リネーム後は自動では元に戻せないので)本番前にいくつかのフォルダーまたはファイルを別フォルダーにコピーしてそのコピーでテストしてから行ってください。

●もし、パス内(ファイル名・フォルダー名)に半角記号が含まれていてエラー・正常動作しない場合は、リネーム(エラーになる半角記号→全角記号や記号以外)すると基本的に解決するかと思います。
※すべての半角記号が不可というわけではないみたいですが・・・

==========
■フォルダーの場合
-----↓から-----
@echo off
set DirP=[リネームしたいフォルダーがあるフォルダーパス]
set StringA=[先頭に追加したい文字列]
set StringB=[末尾に追加したい文字列]
pushd "%DirP%"for /f "usebackq delims="%%f in (`dir /ad /b /on ^| findstr "."`) do (
ren "%%f""%StringA%%%f%StringB%")
exit
-----↑まで-----

【例:】
-----↓から-----
@echo off
set DirP=D:\Sample\sample
set StringA=
set StringB=Sample
pushd "%DirP%"for /f "usebackq delims="%%f in (`dir /ad /b /on ^| findstr "."`) do (
ren "%%f""%StringA%%%f%StringB%")
exit
-----↑まで-----


指定箇所(↓)書き換え→上書き保存→ダブルクリックして実行
[リネームしたいフォルダーがあるフォルダーパス]
[先頭に追加したい文字列]
[末尾に追加したい文字列]


「リネームしたいフォルダーがあるフォルダー」内のすべてのフォルダーがリネーム対象です。


もし、フォルダー名に特定文字列が含まれているフォルダーのみをリネーム対象にしたい場合は↓

【例:】
フォルダー名に「テスト」という文字列が含まれているフォルダーのみリネーム対象
-----
findstr "."↓
findstr "テスト"-----

先頭に文字列を追加しない場合は「set StringA=」
末尾に文字列を追加しない場合は「set StringB=」


リネーム後のフォルダー名が重複する場合はリネームされません。

====================
■ファイルの場合
-----↓から-----
@echo off
set DirP=[リネームしたいファイルがあるフォルダーパス]
set StringA=[先頭に追加したい文字列]
set StringB=[末尾に追加したい文字列]
pushd "%DirP%"for /f "usebackq delims="%%f in (`dir /a-d /b /on ^| findstr "."`) do (
IF not "%%f"=="%~nx0"(
ren "%%f""%StringA%%%~nf%StringB%%%~xf")
)
exit
-----↑まで-----

【例:】
-----↓から-----
@echo off
set DirP=D:\Sample\sample
set StringA=
set StringB=Sample
pushd "%DirP%"for /f "usebackq delims="%%f in (`dir /a-d /b /on ^| findstr "."`) do (
IF not "%%f"=="%~nx0"(
ren "%%f""%StringA%%%~nf%StringB%%%~xf")
)
exit
-----↑まで-----


指定箇所(↓)書き換え→上書き保存→ダブルクリックして実行
[リネームしたいファイルがあるフォルダーパス]
[先頭に追加したい文字列]
[末尾に追加したい文字列]


「リネームしたいファイルがあるフォルダー」内のすべてのファイルがリネーム対象です。


もし、ファイル名に特定文字列が含まれているファイルのみをリネーム対象にしたい場合は↓

【例:】
ファイル名に「テスト」という文字列が含まれているファイルのみリネーム対象
-----
findstr "."↓
findstr "テスト"-----


先頭に文字列を追加しない場合は「set StringA=」
末尾に文字列を追加しない場合は「set StringB=」


リネーム後のファイル名が重複する場合はリネームされません。

 

おわり

詩()

この文章には3本程度の異なるスタイルのcontentsがあり、読了所要目安は約4分です。

 bensusan lylic

---

notitle

 

彼女を知る前はまったく見えませんでした
一般的な方法に簡単にだまされる
落ち方を学んだことがない
白とグレーにしがみついて
太陽は再び沈み、逃げました
彼らが言うかもしれないことが重要だった時代

私の周りのすべて、政治家、友人
善悪で本物でふりをした
その後、突然どこかから禁じられた、無料の
彼女は私の心を開いて、私は…私を見ることができました

ブループル
プライムを疑う色
限界は決して崇高ではないことを知っている
それほど混乱しないか、均等に
とてもシンプル…
わずかな人しか見ることができない

いつもそこにあった…
あまりにも多くの謎の後ろに隠れて-あまりにも多くのスパイ
嘘をいじるルールが多すぎる
とても明確で、あなたを待っています
恋人のようにチャンスをつかむために
青空を超えた場所の美しさ

彼女はどのように開いた状態と閉じた状態の間に自分自身をくさび止めましたか?
彼女はどのように、言われたよりも深く掘ることを知ったのですか?
私は本当に知りません、そして今では誰が気にします
彼女が私に敢えて教えてくれたことを知っているだけです

いつもそこにあったものを見てみろ
あえて…
いつもそこにあったものを見てみろ
私達…。

ブループル
プライムを疑う色
限界は決して崇高ではないことを知っている
それほど混乱しないか、均等に
とてもなだめる
恋人同士だけが自由にできる…

 

---

ラブガーデン


あなたの身長は
股間を歩くところ
庭で
花で覆われた
私は私の心を歩く

私の愛する人は私に花束を作りました
意味がわかりません
愛か後悔の場合
休暇をとってもいいところ

すべての鳥
空にいるのは誰
同じ母親からではない
すべてではない
一人のハンターのために
そして、一人の僕に対する私の愛

彼女は私に花束を作りました...

 

---

notitle

 

先日、羨望が私を連れて行った
映画館でのスピンのために。
元のアイデアを見つけて、
退廃的なキャンバスが本当に必要でした。
私の車のホイールの後ろに行き、
木の真ん中に、
気がついたに違いない
そのタイチンはすぐに私を落とそうとしていた。

この種のギャレーが必要でした
遅かれ早かれ私に起こります。
それは最初の飛行のようなものです
地面に足を乗せた状態で、ホバーするものはありません。
私の偉大な不名誉を認めなければならない
この件に関する私の知識不足、
運命のこの日を作りました
唯一の頼み事は、コンセッショネアのモンシニョールでした。

私は20日間歩いています
そして、私はあなたの許しを請う、
しかし、車が恋しいです。
私の士気は私の靴の中を走り、
郊外が私に隣接しているドローンと組み合わせて。
火曜日、木曜日、金曜日、生命の兆候:
私は電話を取ります
そして、虹のすべての色を通過し、
次の理由で、突然グリーンで停止します。

彼らは私のエンジン全体を再構築しました
それはほとんど新しいものでした。
彼らは私のラジエーターを変え、
タイヤ、クランクシャフト、クラッチ
カムシャフトについては説明しませんが、
マスターシリンダー、電気回路;
プレバートスタイルの在庫
倫理に欠け、あまり詩的ではない人。

あなたが選ぶ限り、楽しむために
第七芸術のこれらすべての傑作の中で:
美しいアメリカ人、ビクシレットの泥棒
私にとっては、お祝いの日のようなものです。
その日は空が低すぎた
そして、私の小さな星は眠りに落ちていました。
フェデリコ、ヴィットリオまたはトト、
あなたはシーンをとてもよく撮っていただろう。
ポスターでは、金の文字で読むことになります。
ディーラーはJavaに行きます。

昔独学でvbaスクレイピングをした事

webスクレイピングと言う技術を知っていますか。スクレイピングと言うのは、プログラムを組んでウェブページの必要な部分(箇所)のみを次々と自分のパソコン内にコピペしていく技術のことです。

私はプログラミングの本格的な講座は受けたことがないのです。しかし、いろいろな本を読み漁って結局VBAだけは1番簡単だし何とかそれなりにしたいことができるかな?と言うレベルまで上達することができました。(昔集中的にやっていたことなので、今は本を見たら思い出すと言う程度ですが)

そして、その集大成として自分が到達できたかな?と思う技術は、スクレイピングだったわけです。(しかもexcel2003使用)

具体的に言ってみると、例えばウィキペディアには野球選手の一人ひとりの詳細な情報が載っていますね。最初に選手名が書いてあって、目次と言う項目があって、「経歴」や、「選手としての特徴・人物」と言う項目の次ぐらいに、必ず"どの"選手にも「年度別成績」と言う、表のような形式の項目があります。

そこの表の部分だけを、昔から現在の選手に至るまで抜き出せたら、かなりVBAの技術としては到達点かなと考えたわけです。

このスクレイピングを習得したならば、野球選手の情報だけでなく、各地の気象観測台の年間データなども、自動的に一気にExcelのシートなどにコピペしていけるわけです。(そして実際に気象データも取得することに成功しました)

 

と言うことで、自分のVBA技術の1つの到達点として(洗練されたコードではないかもしれないが)一応自作コードを載せておきます。

ちなみに動作していたのはExcelの2003年度版のバージョンなので、今のExcelのバージョンでできるかどうかは不明です。

ではいかにコード画像を載せます。

f:id:primeno:20191219075519j:image
f:id:primeno:20191219075515j:image

ちょっとかすれて醜いところがあるかもしれないが、ご容赦ください。しかも不要なコメントもそのまま消さずにしています。

 

そして、ほとんどすべての選手をスクレイピングしたのですが、代表選手として、松井秀喜選手の部分を載せます。

f:id:primeno:20191219075811j:image
f:id:primeno:20191219075807j:image

 

個人的にVBAファンクションでかなり有効性が高い関数は、

current region 、used range、offset、redim

などでした。

※ちなみにVBAの紛らわしいところは、関数とメソッドの違いです。有名なところでは、msgboxとかですかね?

f:id:primeno:20191219081422j:image

メソッドは関数の十分条件

関数はメソッドの必要条件

 

VBAプログラマーからすると軽く見られがちですが僕はなかなか好きな方ですね。

Excel忘備録

Excelでセルに日付を入れようとして/で区切って、12/17 とかやってしまいがちです。しかしそれではExcelの標準機能で勝手に12月17日と表示されてしまいます。

そこでそこのセルの書式設定(ショートカットはctrl + 1) を文字列とすればよいのです。1つだけのセルを文字列に変換するには、先頭にシングルクォーテーションをつけた上で12/17と書けば良いのです。つまり、

「‘12/17 」と書けば勝手に変換される事はありません。

また、列や行ごと全てを文字列として表示させたい場合には、列や行全体を選択した後に、

「ホーム」タブの、配置と言うセクションの右下にある小さいボタン(ダイアログボックスランチャーと言うらしいが)をクリックして、セルの書式設定を開きます。そこの、表示形式タブの中に、文字列と言う項目がありますから、そこを選びます。するとその列や行全体が、文字列の表示携帯となります。

 

◯ちなみにctrl 1 はショートカットです

忘備録: Excel2列をまとめて合計、他

f:id:primeno:20191215122348j:image

=sum関数で、2列にまとまって範囲選択すると2列分の合計が計算されます。

 

この説明の後、範囲全体をデリートキーで消すと数字は消えてくれますが、罫線自体は残ったままです。そこでいっぱつで範囲内の罫線を削除するショートカットキーを紹介します。

範囲を選択して、「ctrl  shift   」範囲内の罫線がいっぱつで消えてくれます。( はキーボードで言うとひらがなの“ろ"の場所です)

 

◯非表示にした行や列をもう一度再表示する方法

⚫︎例えば、A列とC列に挟まれたB列を非表示していて、もう一度再表示したいとき→

A列とC列を同時選択して、右クリックすると再表示と言うのが出るから押す。

これは何も連続した列が非表示になっている場合に限らない。飛び飛びの列がそれぞれ表示になっていた場合でも、すべての非表示の列を覆うような選択をして、後は右クリックで同じようなことをするだけで飛び飛びの非表示の列が一括で現れる。

 

⚫︎ちなみに上記の際表示・非表示は別に、

"右クリック"

でしなくてもショートカットがちゃんと用意されている。

1.列の場合は、非表示したい列を選択して、→

(列全体の選択をするショートカットは、ctrl+shift)    

そうしてから、[ctrl 0 ] と押すだけで非表示になってくれる。(テンキーじゃなく、キーボードの“わ“の部分の0を押すこと注意)  

また、もう一度再表示したいときは、やはり両隣を選択して、[ ctrl  shift  0 ] を押すと良い。(これもテンキーでは無い)

 

2.行の場合も似たようなものです。同じやり方で選択して、コマンドが少し違うだけ。

[ ctrl 9 ] 非表示。 [ ctrl  shift  9 ] 再表示。

 

プリントアウトするときに余分なところを隠すために便利かもしれない