インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Powerpoint VBA 上付き文字の調整マクロ(イベント利用)

効率的には 以前書いた

chemiphys.hateblo.jp


こちらのほうが,絶対使い勝手はいいんですが,改善させれれば面白いかもなぁと思いイベントと絡めて上付き文字の相対位置を50%にするマクロを書いてみました。

今,酸化還元の教材作成中で,とにかくひたすら上付き文字が登場します。

電子のe^-とか MnO_4^- とかです。_の直後は下付きにしたい,^の直後は上付き文字にしたいやつです。

平打ちして後で変換させてもいいのか。。また考えるか。。

実用的ではないにしろ,イベントの使い方とか,自分が完璧に忘れていたのでそういう意味でも書いておきます。

標準モジュール

Option Explicit
Private cls As AppEvent

Sub スタート()

Set cls = New AppEvent
Set cls.App = Application

End Sub

クラスモジュール AppEvent.cls

Option Explicit

Public WithEvents App As Application

Private Sub App_WindowSelectionChange(ByVal Sel As Selection)
    On Error GoTo Escape
    
    Dim tr As TextRange
    With Sel
        For Each tr In .TextRange.Runs
            If tr.Font.Superscript = msoTrue Then
                tr.Runs.Font.BaselineOffset = 0.5
            End If
        Next
    End With
    Exit Sub
Escape:
End Sub

パワーポイントの場合は残念ながら自動的にイベントは発生しませんので,それをスタートさせるために スタート というマクロを標準モジュールに準備
スタートを実行させた後はしばらくはイベントが発生しています。表現が曖昧ですみません。

選択部分が変更されたとき,というイベント部分にコードを書きこんでいます。
選択部分を限定するのが面倒だったため,今回は 極めて大雑把な方法でエラーを無視しています。 On error Goto でふっとばしています。

選択部分に 上付き文字を見つけたら,相対位置を50%にするよ,というのが中身です。 (BaselineOffset のとこ)

動かしているとこんな感じになります。
f:id:chemiphys:20170505130216g:plain

微妙な違いが見えますでしょうか。。事前に上付き文字にしている(相対位置30% デフォ)が 選択し終わったら上にすこーし上がります。(相対位置50%)

イベントを利用しているのである程度自動化でき・・る・・・。

まぁ,最初に書いたように,作り終わった後まとめてやればいいことなんです。

または,平打ちしたものを編集させるようにマクロを組むのもいいですよね。。そちらの方がいいかなぁ。

上付き文字を適用したときをイベントで捕捉して勝手に50%にする,というのを本当はやりたかったんですが,そういうイベントは見つけきれませんでした。

何かの役に立つこともあるかもしれないということで,これ自身は実用性に乏しいですが,書いてみました(;´・ω・)

GW

教材作成が捗ります(ΦωΦ)

職場の方々に甘やかしてもらい,休日をきちんと取らせてもらっていますので,その分教材作成中。

PowerpointVBAのほうは今のところは全く捗りません。

夏休み近くまで無理なのかなぁと正直思っていて,そこまで1,2か月ブログ名&アドレス詐欺の日々を甘んじて過ごします。

OneNoteの教材作成のツールとしてはPowerpointは大活躍中です。


OneNoteには,印刷という手段を通してどんな形式のデータであってもプリントアウトできるものはOneNoteに落とし込んでいけます。

ただ,私のように授業に使うとなる場合,

みんなに同じところを見てもらうということが必要な場合があります。

プレゼンで視線を誘導する際と同じだと思いますが,自分の指示が明確でクラス40人全員にムリなく伝わる,という前提を作らないといけない。

10インチのタブレットPCを生徒は使っています。画面は必要最小限のサイズ。

そして,同じ情報を電子黒板に映して,説明をするんですが,電子黒板に映したものも生徒から見えないといけない。

私の決まりは

・パワーポイントで 16:10のスライドサイズで32pt以下の文字を使わない。
・基本1スライド1スライドで内容を区切る。(画面を頻繁に切り替えながら説明するのは,説明側はいいんだろうけど聞く側からするときっとうざい。)
文章部分には装飾は極力せず,OneNoteの蛍光ペンや通常のペンで生徒自身が大事なところを装飾できるように配慮するが,Boldだけは自分に許容する。

です。32pt縛りがほんっとに厳しい(;´・ω・)文字の色も基本はゆだねれるようにするためにできるだけつかわないのもきつい。。

そしてこれに,ページ数やそのページの内容を示す一文を付け加えるので,キビシイデス。

ページ数や内容の一文を示す,というのはとても大事なんですよね。○○の教材の,▲▲ページを皆さん見てくださいね,と言ったときにみんなが迷わずそこを見れないとはじまらない。

聞きそびれた子も,電子黒板のその部分を見て,あぁ今はこれをやってるんだなぁと思えないといけない。

電子黒板はとても便利ですが,
 ・小さいものは見えない。
 ・ICTの良さは素早く見せれることだろうけど,素早く切り替わると結局受ける側には何も残らない。
    ↓
 ・素早く切り替えたりするなら,電子黒板で表示するものについては,生徒の手元にも同じものを配布しておくことが前提。任意に戻って確認できるように授業を設計しないといけない。


ICT機器は制約も多いです。うまく付き合わないとせっかくの便利グッズの長所が出ず短所だけが出ます。。生徒のタブレットに配る教材は著作権面ほんっとうに厳しくて,泣けますし。。

でも,そこはやらないとなぁと思っているんです。。

f:id:chemiphys:20170504004026p:plain

中央部分にはさすがに耐えきれなくて黄色で塗っちゃってます。どこかアクセントが無いときつくて。。

本来は空白をもっと活用して,見やすくするべきですが,そこは残念ながら文字サイズに負けて活かせていません。

文字もタブレットで見るだけならもっともっと小さくていいんですが,電子黒板で表示して,教室の後ろからでも見えるように,とすると32pt以下はやはり駄目。

著作権表示等,タブレットで見れたら十分な情報はそれなりに小さくすることはありますが,説明する内容については,

  見えないなら書いていないのと同じ。

と思っているので,小さくはできません。


アクセントとして,教材のどこかにちょっと憩い部分をつくりたいなぁと思い,

イラストACの しげるさんの白ネコさんを最近借り始めました。

f:id:chemiphys:20170504011130p:plain

www.ac-illust.com

とてもかわいく,シンプルでいろんな表情があるので,大のお気に入りです。

私は犬派で,自分が描く方は,カクカクした犬を書きます。カクカクしてますので,フレーミーを思い出す子が多いようですが,全く別。比べたら全然違うことにみんな気づいてくれます。

画力が無いので,せっかくイラストACのプレミアム会員になっているので,そこは使わせていただくことにしました。(ΦωΦ)


さて,書きたいことにたどり着かないで余談だらけになってきたんですが,

Excelの関数を調べてて,2016でけっこう関数が追加されてることに関心したので,書き始めたところでした。

dekiru.net
こちらのページを眺めていて,
CONCAT関数の使い方。複数の文字列の連結にセル範囲を指定できる! | Excel関数 | できるネット
TEXTJOIN関数の使い方。区切り記号を挿入しながら複数の文字列を連結する | Excel関数 | できるネット
IFS関数の使い方。複数の条件を順に調べた結果に応じて異なる値を返す | Excel関数 | できるネット
SWITCH関数の使い方。複数の値を検索して一致した値に組み合わせられた結果を返す | Excel関数 | できるネット
このあたりの関数に強く惹かれました。

職場がOffice2016を採用してくれていますし,家では365を使っているので,安心して使えます。

vba Split関数好きとしてはTEXTJOIN関数とか魅惑的すぎてしょうがないところです。

このページにたどり着いた理由は,IF文で評価する部分とTrueまたはFalse部分で同じ長い関数を書くことがあってあれがいやだなぁと長らく思っていますので,それを解決する方法ないのかなぁと思ったのがきっかけです。

それは解決できませんでしたが,多くの便利そうな関数に出会ってとても得した気分になり,教材作成をちょっと一呼吸置いて,こちらに書きに来ました。

戻ります(;´・ω・)

雑記

イラストAC で,自分が使えそうな素材をたくさんダウンロードしたりする日々です。

職場ではネットは使えませんから,保存,整理して使いたいときに使いたい画像に行きつけるように,,としていました。

epsにしていたらOfficeで読めると思って集めていて,実際貼り付けてみると表示されないものもあり,(;´・ω・)すこしがっかりしたところです。

でも,aiやeps形式ならIllustratorで少し修正することもできますので,その形式は大事。

自宅とかでならIllustratorから切り取って貼り付けて,と使いたい部分だけとかでもいける。

職場ではそうはいかない・・(;´・ω・)ドウシタモノカ


pngは安定して読めるので,それじゃあpngとaiまたはepsの二種類を常に持っとけば,便利なのかなぁとか

ふらふらと考えているところです。

無駄な作業にはなったのですが,

途中でai形式をeps形式に変換する,という操作をIllustratorのスクリプト機能で処理していました。

そのスクリプトはJavaScriptで書かれていたんですが,バージョンを一つ付け加えるとかならコードは読めるので,簡単にできた。

ほうほう,JavaScriptができればIllustratorにスクリプトが使えるのかぁと少し調べてみると,そこにVBScriptも使えるよ,という話がありました。

これは興味をそそる話です。

Illustratorはまだまだまったく使えていない現状なのですが,違う方向から惹かれることに出会う。

興味としてはとりあえずai形式をIllustratorでたくさん読ませておいて,それをpngで書き出して閉じるという操作をさせてみたい。

それができれば私の作業はかなり捗りそう。


まったくもって,横道のさらに横道で,手を出すべきところではありませんが,

いつかそれが役に立つ時もありそうですし,そのうちいろいろ試したいなぁと思う出来事でした。

ブログ名に偽りあり状態でしばらく来ていますが,まだVBAで遊べる日は遠い(;´・ω・)

自転車操業中。。

EXCEL HYPERLINK関数 続き小ネタ

数日前HYPERLINK関数について書きました。

とても便利だなぁと思っていますが,数式を併用することで当たり前ではありますが,少し便利な機能にもなりました。

f:id:chemiphys:20170427221229p:plain

上の黄色いセルは,色ついているだけで何の工夫もありません。日付っぽいのを入れてくれたらExcelが勝手に日付に変えてくれる。

その下のセルには次の関数

=HYPERLINK("#"&TEXT(K10,"mmdd")&"!a1",TEXT(K10,"mmdd") & "へジャンプ")

K10というのが黄色いセルです。

この仕組みだと,黄色いセルに伴いハイパーリンク先が変わるので,

ついVBAが使えると,VBAでページジャンプ機能とか作ってしまうんですが,とても簡単な関数で選べるページジャンプ機能になります。

もちろん,入力規則のリストを併用して,ジャンプ先を日付ではなく,特定のリストから選ばせることも簡単にできますね。

やっぱりExcelはすごいなぁ 便利だなぁと思う今日この頃です。

方法を制限されなければ,面倒なのでちゃちゃっとマクロで作る方に逃げちゃうわけですが,関数もいろいろ眺めるとまた新しい発見がありそうです。

続きの小ネタでした。

まだ,パワーポイントのパの字も触れない(;´▽`A``

授業の基本の教材はパワーポイントどんどん使っていますがVBA遊びまでは手がまだ戻りません。

授業で話したネタの一つとして,好きなページへのリンクを貼っておきます。

www.ptable.com

こちらのページですが,元素の導入のあたりで,授業中にも生徒のみんなの端末にアドレスを送って紹介をしています。

ウィキペディアに飛べる機能も面白いですし,各元素にまつわる動画に飛べる機能がスゴイ。

f:id:chemiphys:20170427222111p:plain

左上のウィキペディアとなっているところをクリックするとVideoとか選べます。

普通手に入らない元素についての動画が見れる。

元素の導入にうってつけのページです。

また,Photosを選ぶとセオドア・グレイさんのWeb版世界で一番美しい元素図鑑に行けます。

ここもまた,十分に面白い。

Excel HYPERLINK関数

マクロを極力使わずにワークシート関数で勝負の仕事をやっていたので,関数つながりでもうひとつ。

日報みたいなものを共有機能を使ってやりたいという話。

最初のシート作成はマクロでやりますが,日々の運用ではマクロを使いません。

でも,3ヶ月分くらいの日報をだーーーーーっと一つのファイル内に作ります。どうやって,今日や明日というページをさくっと表示するか・・

と悩み,HYPERLINK関数を使いました。


=HYPERLINK("#" & TEXT(NOW()+1,"mmdd")&"!a1","明日のページ")

=HYPERLINK("#" & TEXT(NOW(),"mmdd")&"!a1","今日のページ")


各日付のシート名 ( 4/25なら 0425 )みたいなルールでシート名をマクロで付けています。


HYPERLLINK関数内の補足ですが,

・同一ブック内なので#をつけます。
・日付のシート名はNOWを利用し,それをTEXT関数で思った書式にすることで解消しています。

これだけでその日その日に応じたハイパーリンクになるようでした。マクロじゃなくてもちゃんと飛べるようになる。


実際運用してみないとわからないわけですが,少し試した感じではちゃんと動作しているみたい。

便利な関数だなぁ。

Excel Row関数とColumn関数とVLOOKUP

仕事で,今までなんで思いつかなかったのか,びっくりしたことがありました。

ほんとに あれぇ?という感じ。

時間はないので手短に書きますが,

VLoopup関数はとても便利で,VBAでやらないときはとても感謝する関数ですが,その列を与えるときに直接値を与えてしまうため,数式のコピーがうまくできなくて,いつももやっとしていました。

f:id:chemiphys:20170424221432p:plain

第3引数の列のところです。直接値を入れてしまうもんだから,横にコピーしても数値をいちいちどうにかして変えないといけないんですよね。

今まではどこかにその列情報を書いておいてそこを参照するとか,置換を使うとかしか思いつかずに,VLOOKUPはとても便利だけどここだけはめんどくさいよなぁと思っていました。

なんででしょう,今日はふっとColumnと打ち込んでみたくなって(VBAのせいとしか思えないけど)打ち込んでみたら
f:id:chemiphys:20170424221745p:plain

普通にそれらしきワークシート関数がありまして,

期待通りの答えを返します。

=VLOOKUP($G$12,$A$1:$C$15,COLUMN(B1),FALSE)

Columnの中身を相対参照にしておけば,コピペと一緒にきちんとずれていってくれますし,足したり引いたりしてずらすとか,掛け算等を併用すればどうにでも値は操作できる。

なんでこんな簡単なこと思いつかなかったのか,愕然としつつ,これでだいぶ楽になるやんとラッキーな気分です。

ちなみにROW関数もあるので, ワークシートの INDEX関数やMATCH関数,OFFSET関数と併用してやれば大概のことはやれますね。

今まで直打ちしていた列や行の引数もコピペに対応させれるように書けますね。

とても地味で小さな発見でしたが,今後とても楽になるなーと思う出会いでした(ΦωΦ)

ちなみに引数を省略すれば,そのセルの行や列を返してくれるようです。これも応用しがいのある挙動。

もっと早く知っておくべきでした(;´▽`A``

Powerpoint VBA パワーポイントで元素記号タイピング

元素記号を20番目まで覚える。

これは,とても頭が痛い悩みなんですが,化学を学ぶ上でどうしても避けるわけにはいかない内容です。

自分が高校生の頃よりは少しましなのは,

www.youtube.com
以前NHKエレメントハンターという番組がありました。そのテーマになっているこの曲があるので導入はしやすい。

でも,とにかく覚えないといけない,という現実は変わりません。

どうしようかなぁ,自分にできる手立てはないかなぁと思い,思いついたのはタイピング。

まだまだプロトタイプですが,ちょっと作ってみました。

時間を測定してタイムアタックをするとかしないと何度もやる気は起きません。

タイムアタック機能を作れば,一部の子にはたぶん闘争心が生まれますので,一部の子には役に立つものになる気がしますし,

単純にタイピングの訓練の場が今の高校生には不足していますので,その一つとしても意義が無くもない。



はたまた別のアプローチとして3拓問題を作って,何度も繰り返すことで定着を図るとか,いろんな手はありますね。。

やっぱブログにネタとして書こうとすると,書きながらいろいろなアイディアが出ます。

なんとか今年も書かないと!

時間を作るよう努力しようと思っています。



コード
Side1 テキストボックスのChangeイベントを使います。

Option Explicit

Private Sub TextBox1_Change()

    Call 元素チェック

End Sub

標準モジュール

Option Explicit
Public 原子番号 As Long
Public 元素(1 To 20) As String, 位置(1 To 20) As String
Public 元素記号表 As Table
Const TypingText As String = "H_11,He_18,Li_21,Be_22,B_23,C_24,N_25,O_26" & _
    ",F_27,Ne_28,Na_31,Mg_32,Al_33,Si_34,P_35,S_36,Cl_37,Ar_38,K_41,Ca_42"

Sub 元素記号タイピング()
    Dim TargetSlide As Slide: Set TargetSlide = ActivePresentation.Slides(1)
    Set 元素記号表 = TargetSlide.Shapes("元素記号表").Table
    Dim i As Long
    For i = 1 To 20
        元素(i) = Split(Split(TypingText, ",")(i - 1), "_")(0)
        位置(i) = Split(Split(TypingText, ",")(i - 1), "_")(1)
    Next
    
    Slide1.TextBox1.Text = ""
    原子番号 = 1
    
    Dim c As Cell
    For i = 1 To 4
        For Each c In 元素記号表.Rows(i).Cells
            c.Shape.Fill.Visible = msoFalse
        Next
    Next

End Sub

Sub 元素チェック()
    If 原子番号 = 0 Or 原子番号 = 21 Then
        Call 元素記号タイピング
        Exit Sub
    End If
    
    Dim 元素長さ As Long
    元素長さ = Len(元素(原子番号))
    
    DimAs Long,As Long= CLng(Left(位置(原子番号), 1))= CLng(Right(位置(原子番号), 1))
    
    If Right(Slide1.TextBox1.Text, 元素長さ) = 元素(原子番号) Then
        元素記号表.Cell(,).Shape.Fill.ForeColor.RGB = vbYellow
        原子番号 = 原子番号 + 1
    End If
    
    If 原子番号 = 21 Then
        MsgBox ("おつかれさま!")
    End If
End Sub

動画
f:id:chemiphys:20170422225216g:plain

まぁ今の段階では,極めてまじめでやる気がある子しかやってくれないものなので,もちょいシステム側をきちんとしないといけません。

時間を計る機能は絶対(シツコイデスネ)

いろいろと腑に落ちないことと,やり方がわからないこと,改善すべきことがあります。

一つ目は ActiveXのテキストボックスにフォーカスを自動的に持っていく方法がわかりません。あるのかな。。?これができないとちょいつらい

二つ目は 今は元素記号が大文字1文字か,大文字と小文字のセットだよというのにこだわり,きちんと大文字にしないと認識しませんが,これだとめんどい。

シフト押す回数が多く,タイムアタックさせるとするなら,やる気をなくす要素になります。これはLike演算子で比較させて小文字でもなんとかなるようにすべきかなぁ。

三つめは腑に落ちないこと。タイピングスタートのボタンを押してもリセット処理がされないことがあります。なんでかよくわかりません。

四つ目は時間をどうやろうかなぁですね。タイマー作ったときにやったAPIのSetTimerとか持ってこないといけないかなぁと思っています。

まぁ何はともあれ,形にはしてみたいですね。。

数人でも食いつくものが作れれば,それで追加教材としては十分ですから(;´▽`A``