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

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

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``