Powerpoint VBAを使おう!

Powerpoint VBAやExcelのVBAで遊んでいます。Word VBAも始めました。

近況です

ずいぶんと書けていませんが,googleにきちんと登録されているようで,アクセス数はけっこうあるようです。

PROにして独自ドメインにした効果なんでしょうね。

現在はずいぶんとネタが無いので書けません & とてもとても久しぶりにFF14に手をだしてしまいました。

今日はメンテナンス中のようですので,生存報告だけ書こうと思い,書いています。

Powerpoint VBAネタをやめるつもりはないのですが,FF14を始めたとはいえ,朝も早く,帰りも遅い生活は続いていますし,その中VBAの取り組みは,

今年転勤した職場の既存のシステムのうち我慢ならない部分から手をいれるという程度しか取り組む時間はありません。

仕事が減らない。。

夏休みか,その直前になるくらいまでは,ちょっと新しいものを作って記事にするのは難しそうです。。

夏休みは・・教材作成がてら何かやれたらなぁと思いますし,忘れるのがとても早い私ですから,VBAを思い出しながらそれを記事にしていくのかもしれません。


幸いなことはあります。

blog.powerpointvba.club

これは本当に作ってよかったと思います。

今年は化学基礎と科学と人間生活を教えているのですが,両方とも原子の分野があり,原子核とその周りを回っている電子というところで,今までは動かない絵を黒板に書いたり,電子黒板に表示するにとどまっていたのですが,動きますし,原子番号が増えると,陽子や電子が増えていく。電子がある程度を超えると,次の電子殻が増えてそこに入っていくよ・・という話がしやすくなりました。

Powerpoint2010ではちょっと変な動きをして,ボタンを押したらくるくる回って応答なしになるので,タブレットのPowerpoint2013で動かさないといけないのは,たまに傷なのですが,まぁそれでも十分解説はできています。

作った瞬間からお気に入りでしたが,実際使ってしゃべってみてもやはりお気に入りです。

物質量molの話は表計算で考えるといいよ,と 最近ある研修で学びました。

その話にはとてもうなずけます。

その辺は作りたいんですよね。。

あとは化学反応式ネタもきちんとやりたい。

物理ネタは教えていないのですることがちょっとなくなりましたが,

化学のネタについてはやることはありますので,夏休みが近づいたら少しは書き始めようと思っています。

それまではもうしばらく放置が続きますが,googleさんのおかげで,初めてここをおとずれている方もいらっしゃるようです。

しばらくは今まで書いた分で放置が続きます。。

ファイル一覧続き テキストファイルに書き出してみました。

OfficeアプリをVBAで扱っているときは,それらが高機能であるために,あまり縛られることはないですが,

テキストに助けを求めると,いろいろと怒られるものですね。

前回のファイル一覧をテキストファイルに書き出そうとしたら,環境依存文字で怒られました。

Option Explicit
call getallfilename

Sub getAllFilename()
    Dim objFS 'As Object
    Set objFS = CreateObject("Scripting.FileSystemObject")
    
    Dim objWshShell ' As Object
    Set objWshShell = CreateObject("Wscript.Shell")
    
    Dim objFolder ' As Object
    Set objFolder = objFS.GetFolder(objWshShell.CurrentDirectory)
    
    Dim objFile ' As Object
    Dim strFileName ' As String
    
    Dim objText 'As Object
    Set objText = objFS.createtextfile(objFolder & "\new.txt", True, True)
    
    For Each objFile In objFolder.Files
        objText.writeline (objFile.Name)
    Next
    objText.Close

End Sub

テキストファイルの扱いは以前から毛嫌いしているので,書けたからいいや的なコードです。

以前のコードからの変更点は
ファイルシステムオブジェクトのCreateTextFileメソッドでテキストファイルを作成します。

 Set objText = objFS.createtextfile(objFolder & "\new.txt", True, True)

この部分です。

一つ目の引数は上書きオプションらしいです。今は常に上書きするように書いています。
二つ目の引数が環境依存文字にとっては大事な点になりますが,unicodeオプションみたい。
環境依存文字も使えるから普通に使ってファイル名を決めてしまっているので,ここをtrueにすることで,環境依存文字でも怒られずにテキストファイルにファイル名を書き出せました。

前のテキストに書き足すとかの処理を考えないなら,writelineは勝手に改行してくれるのでとても楽ですね。

ファイル名一覧とかめんどくさいので,いつもは SnippingToolでそのフォルダのSSを取ってWord等に貼っていましたが,

このスクリプトを同じフォルダに入れて実行するだけで一覧を作らせることができます。

望んだ機能拡張を気軽にできるし,excelやword等,立ち上げて終了させて,に少し時間がかかるのでこんな作業ならさくっとテキストに書き出させるのはいい。

FileSystemObjectってすごいんだなぁと感心する今日この頃です。

食わず嫌いはだめですね。CreateObjectで使うものにきちんと取り組んでいかないと。。

objText.Close

これって書かなくても怒られないんですが,必要なのかなぁ。

書かなくてもすみそうなものは,一行でも削ろうとしてしまうので,動くからいいじゃない派としては気になるところでした。


---

そういえばなんでVBAでどうのこうのにこだわっていたのに,飛び出してVBScriptなんだろうと自分で振り返るんですが,

今ExcelにしろPowerpointにしろ立ち上がるのがもっさりしているんですよね。

Excelは特に,職場とかだと開いてからセルに文字が入力できるようになるまでがとても長い。

ただ情報を知りたいというだけならテキストに書き出してメモ帳でさくっと開いて何にでも使えるよ,が楽な時によく出くわします。

なのでケースによってはword,powerpoint,excelを開かずに用を済ませたい。

次々に,適切なファイル名のテキストに自分好みの分類で出力していってさくさく作業したいとか,

そのテキストファイルを今度こそVBAで開いて操作したいとか

はたまた,正規表現オブジェクトとそれらテキストで最後までやってしまうとか,使えるツールが増えるとよりスマートにできそうですよね。。

いろいろできるようになりたいなぁ。

VBScript ファイル一覧続き

VBScriptのエディタとしてVBAでいつも使っているVBEditorがいいという話をthomさん達から聞きましたので,

早速職場でも試してみました。

使い慣れた部分のおかげや,参照設定無でも十分コーディングの手助けをしてくれますし,

ローカルウィンドウがやっぱりいい。

f:id:chemiphys:20170513222153p:plain

SpecialFolderとしてどんなものがあるか,とかプロパティをいろいろ見れるところとか とってもいいですね。

VBEditorにミスの指摘とかをずいぶんしてもらえるので,普通のテキストエディタで打つだけで精一杯の時より,ずいぶん余裕が出てきます。

あと,モジュールが使えることもとてもありがたいですし,

前回とほぼ同じですが,無駄とかあったので書き直してみました。

Option Explicit

call getAllFilename


Sub getAllFilename()
    Dim objFS 'As Object
    Set objFS = CreateObject("Scripting.FileSystemObject")
    
    Dim objWshShell' As Object
    Set objWshShell = CreateObject("Wscript.Shell")
    
    Dim objFolder' As Object
    Set objFolder = objFS.GetFolder(objWshShell.CurrentDirectory)
    
    Dim objFile' As Object
    Dim strFileName' As String
    
    For Each objFile In objFolder.Files
        strFileName = strFileName & objFile.Name & vbCr
    Next
    
    MsgBox strFileName

End Sub

msgbox "Test"

これを実行すると,callに従い,一度サブルーチンを実行した後,サブルーチンの部分は飛ばして下のメッセージボックスを実行する。

全く知識が無いので,

「へ~ そう動くんだなぁ」

と面白がれます。

いろいろと制限多いらしいですし,Like演算子が使えないのは,その便利さを最近実感していたところなので残念ですが,

十分高機能とも思える。

VBAとも連携できるのでしょうし,使い方だろうと思えます。

もうちょい遊んでいられそう。

VBScript ファイル一覧を取得

あるフォルダに入っているデータすべてに対して調査をしたい。

こんな処理をするのが私は好きなんですが,VBScriptでできるのかなぁというのを試してみました。

このコードを保存した場所のファイル一覧をMsgBoxに吐き出すスクリプトです。

set objFS=CreateObject("Scripting.FileSystemObject")

dim objWshShell
set objWshShell=WScript.CreateObject("WScript.Shell")
set objFolder=objFS.GetFolder(objWshShell.CurrentDirectory)

for each objFile in objFolder.Files
	strFileName=strFileName & objFile.Name & vbCr
Next

msgbox strFileName

大文字小文字がしっかりしていないのは許してください。適当です。

普通のエディタでコード打ってます。

いとも簡単にできるものなんですね。

しかも私が大好きなFor eachでできるのはとてもいい。Dir関数でやるの苦手なんです。

これって同じ風にExcelやPowerpointのVBAでもできるのかな。

できると,楽だなぁ。

このコードはほとんどは本を見ながら打ったものです。

VBScriptの本 買いました。

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

目からうろこが落ちる感じ。

数ページ進んだらもう クラスのことが書いてあります。

ExcelやPowerpointのように,元々が高性能な基盤があり,それを補助するならクラス無くてもやっていけることも多々あるんでしょうけど,

土台があんまりない場合はクラスは避けて通れないのかなぁと漠然と思ったり。

いろんな勉強になりそうです。

他言語はちょっと覚える気にはならないんですが,VBAの親戚あたりならやる気になる。

VBScript逆引き大全500の極意

VBScript逆引き大全500の極意

こちらの本も買いました。二冊で十分勉強になりそう。

こちらの本は井川はるきさん

今となっては極めて高いあのExcelVBA本を書いた方が携わられた本なのかな。

勉強にもってこいです。

あと,CreateObjectが苦手な私にはその辺の克服のためにもVBScriptはいい気がします。

暇をみつけてちょこちょこやっていこう。

VBScript を少しずつ

VBScript でちょこっとコードをメモ帳で書いて,職場で試してみると動きました。

ってことは使えるって思っていいよなぁと思い,少しずつ書いてみることに。

ちゃんとやったことはないので,VBAとの違いを楽しみながら遊んでみようと思います。

デスクトップにあるBook1.xlsmってファイルを開いてみる。

option explicit

dim xlapp
Set xlapp=CreateObject("Excel.Application")

xlapp.Application.visible=true

Dim WS, SP 
Set WS = CreateObject("WScript.Shell") 
SP = WS.SpecialFolders("desktop") 

dim WB
xlapp.workbooks.open sp & "\Book1.xlsm"
set WB=xlapp.workbooks(1)

WB.worksheets(1).cells(1,1).value="TEST"

上のコードをメモ帳にでも貼って,拡張子vbsのファイルを作ればコードは完成です。 test.vbsみたいな感じ。


activeworkbook.path の類が使えないんですね・・。

でもネットでちょっと探したらすぐSpecialFoldersの使い方が出てきました。やっぱりネットはアリガタイ。

Illustratorでもコードが使えればという気持ちも持ちつつ,コードの土台としてExcelかWordかPowerpointを選ばなきゃいけないことに抵抗がある時もありましたので,

学びたいですね。

VBScriptのいい本ってどれだろうなぁ。

WSHで調べないといけないのかな??

その辺からよくわかっていませんが,ちょっと楽しそうだなぁと思っているところです。

Powerpointとかも外部から操作して遊べるのかな。。そのあたりができ始めれば,ブログ名詐欺じゃなくなってくる・・かな(;´・ω・)

調べてみたら,どんどん出てきますね。

コードを保存している場所?をメッセージボックスで出力

option explicit
dim objWshShell

set objWshShell=WScript.CreateObject("WScript.Shell")

msgbox objWshShell.CurrentDirectory

パワーポイントも開いてみた

dim pptapp
set pptapp=createobject("powerpoint.application")

pptapp.visible=true

dim PS
pptapp.presentations.open sp & "\3択基本①.pptm"
set PS=pptapp.presentations(1)

小文字で書いても動くかやってみたら動いた。

vbaな気持ちで書いていくといろいろできそうだ。

夢が広がる。

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

効率的には 以前書いた

blog.powerpointvba.club

こちらのほうが,絶対使い勝手はいいんですが,改善させれれば面白いかもなぁと思いイベントと絡めて上付き文字の相対位置を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部分で同じ長い関数を書くことがあってあれがいやだなぁと長らく思っていますので,それを解決する方法ないのかなぁと思ったのがきっかけです。

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

戻ります(;´・ω・)