MS Wordの描画キャンバスの使い勝手Hack その3

どっっっぷりIT系の話しアゲイン。

先日のMicrosoft Wordの描画キャンバスの話しその続編のさらに続きです。

英語のブログの方に『「左右に整列」と「上下に整列」もできるようにしてくれない?』っていうコメントと言うかリクエストが来たのでやってみた、って話。

マクロを追加しただけなのでやり方は以前の記事を参照して下さいませ。

変更点は以下のとおり。
・関数を追加(DistributeHorizontal,DistributeAlignVertical,SortHorizontal,SortAlignVertical)
・以前の関数内の変数の型を修正(AlignHorizontal,AlignVertical)

整列させたいモノはそんなに多くないという前提で、速さよりも簡潔さを重視したソートアルゴリズムにしています。

Private Sub AlignHorizontal(ARate As Single)
Dim Min, Max, i As Single
    Min = 32768
    Max = -32768
    For Each AShape In Selection.ChildShapeRange
        If Min > AShape.Left Then
            Min = AShape.Left
        End If
        i = AShape.Left + AShape.Width / 20
        If Max < i Then
            Max = i
        End If
    Next AShape
    For Each AShape In Selection.ChildShapeRange
        AShape.Left = Min * (1 - ARate) + Max * ARate - AShape.Width / 20 * ARate
    Next AShape
End Sub

Private Sub AlignVertical(ARate As Single)
Dim Min, Max, i As Single
    Min = 32768
    Max = -32768
    For Each AShape In Selection.ChildShapeRange
        If Min > AShape.Top Then
            Min = AShape.Top
        End If
        i = AShape.Top + AShape.Height / 20
        If Max < i Then
            Max = i
        End If
    Next AShape
    For Each AShape In Selection.ChildShapeRange
        AShape.Top = Min * (1 - ARate) + Max * ARate - AShape.Height / 20 * ARate
    Next AShape
End Sub

Private Sub AlignShape(AHorizontal As Boolean, ARate As Single)
    If Selection.ChildShapeRange.Count = 0 Then
        Exit Sub
    End If
    If AHorizontal Then
        AlignHorizontal (ARate)
    Else
        AlignVertical (ARate)
    End If
End Sub

Sub AlignHorizontalLeft()
    AlignShape True, 0
End Sub

Sub AlignHorizontalCenter()
    AlignShape True, 0.5
End Sub

Sub AlignHorizontalRight()
    AlignShape True, 1
End Sub

Sub AlignVerticalTop()
    AlignShape False, 0
End Sub

Sub AlignVerticalMiddle()
    AlignShape False, 0.5
End Sub

Sub AlignVerticalBottom()
    AlignShape False, 1
End Sub

Private Sub SortHorizontal(ByRef ACol As Collection)
Dim TmpCol    As Collection
Dim l_cls       As Object
Dim l_clsMin    As Object
Dim MinID As Integer
Dim i           As Integer
    Set TmpCol = New Collection
    Do Until (ACol.Count = 0)
        MinID = 1
        For i = 2 To ACol.Count
            If ACol(MinID).Left > ACol(i).Left Then
                MinID = i
            End If
        Next i
        TmpCol.Add ACol(MinID)
        ACol.Remove MinID
    Loop
    Set ACol = TmpCol
End Sub

Private Sub SortVertical(ByRef ACol As Collection)
Dim TmpCol    As Collection
Dim l_cls       As Object
Dim l_clsMin    As Object
Dim MinID As Integer
Dim i           As Integer
    Set TmpCol = New Collection
    Do Until (ACol.Count = 0)
        MinID = 1
        For i = 2 To ACol.Count
            If ACol(MinID).Top > ACol(i).Top Then
                MinID = i
            End If
        Next i
        TmpCol.Add ACol(MinID)
        ACol.Remove MinID
    Loop
    Set ACol = TmpCol
End Sub

Sub DistributeHorizontal()
Dim Min, Max, i, Total, Interval As Single
Dim ShapeCol As Collection
    If Selection.ChildShapeRange.Count > 1 Then
        Min = 32768
        Max = -32768
        Total = 0
        Set ShapeCol = New Collection
        For Each AShape In Selection.ChildShapeRange
            If Min > AShape.Left Then
                Min = AShape.Left
            End If
            i = AShape.Left + AShape.Width / 20
            If Max < i Then
                Max = i
            End If
            ShapeCol.Add AShape
            Total = Total + AShape.Width / 20
        Next AShape
        SortHorizontal ShapeCol
        Interval = (Max - Min - Total) / (ShapeCol.Count - 1)
        Total = ShapeCol(1).Left
        For Each AShape In ShapeCol
            AShape.Left = Total
            Total = Total + AShape.Width / 20 + Interval
        Next AShape
    End If
End Sub

Sub DistributeVertical()
Dim Min, Max, i, Total, Interval As Single
Dim ShapeCol As Collection
    If Selection.ChildShapeRange.Count > 1 Then
        Min = 32768
        Max = -32768
        Total = 0
        Set ShapeCol = New Collection
        For Each AShape In Selection.ChildShapeRange
            If Min > AShape.Top Then
                Min = AShape.Top
            End If
            i = AShape.Top + AShape.Height / 20
            If Max < i Then
                Max = i
            End If
            ShapeCol.Add AShape
            Total = Total + AShape.Height / 20
        Next AShape
        SortVertical ShapeCol
        Interval = (Max - Min - Total) / (ShapeCol.Count - 1)
        Total = ShapeCol(1).Top
        For Each AShape In ShapeCol
            AShape.Top = Total
            Total = Total + AShape.Height / 20 + Interval
        Next AShape
    End If
End Sub

追い込んで

先日生まれて初めて金だわしなるものを購入。
178円なーり。

それを使ってヤカンのこびりつきをゴシゴシ。絶大な威力に感心しきり♪
ほかにきれいにする鍋はないか、フライパンはないか、と次から次と。
塗装まで落ちちゃうものはさらっとしかできなかったけど、ヤカンと雪平鍋は相当新品に近くなった感じ☆

この前の冷凍庫の霜取りみたいにBefore & Afterを写真にとっておけばよかったなぁと後悔。
・・・というか、この前の霜取りを写真に取りながら、「これってUSTERAMで流したら何か起きるかな」ってのは考えてた。
掃除の生中継。

「ほらー、そこがまだ出来てないじゃん」みたいなツッコミを受けながらの作業ってやる側としてはどうなんだろう。。。
まぁ誰も見てないって展開になる可能性のほうが高いけど。

緊急度の低いToDoは自分を追い込まないとやっぱりなかなか手がつかないままになっちゃうので
「やります宣言」→「USTREAMで公開実行」
っていうのもいいかもな。有言実行の新しい形。

USTREAM配信環境確認してからこそっと実行します。(←一応宣言)

イケてない

今日は小さくイケてない。

仕事場にて。

「これ印刷したら出掛ける!」ってときにプリンターのインク切れ。
インクの詰め替えでインクがはねても大丈夫なように洗面所に入ろうと電気をつけたらパチっと電球切れ。
電球2つのうち1つは生きてたからなんとか詰め替えも印刷もできたけど。
あたふたと出かけましたとさ。

仕事場に戻る道すがら。

バスを待ってたら左の耳元に虫っぽい感覚。
払いのけたものの直後からかゆみが・・・
耳たぶを蚊に刺された~。
かゆいのかゆくないのって。。。かゆいの。
指の関節のとことがくるぶしとか刺されるとかゆいけど、張るぐらいかゆい。
でもって触ってみたら刺されてない右側より明らかに膨れてるし熱持ってるし。
鏡なんて持ってないから見えなかったけどきっと激しく赤かったに違いないし、片方だけ耳たぶ激しく赤いなんて誰も気づかないだろうけど万が一気づかれたら恥ずかしいなとか思ってたら自分がいたたまれなくなってくるし。。。

かゆみこそなくなったものの3時間近く経った今も左の耳たぶのほうがまだ腫れてるし熱持ってる。
もちろんまだ赤い。

今日の結論。
耳たぶを刺されるときには鏡を持ってたほうがいい。

気づいたり対処したり

大学によるけど今週・来週から後期(秋学期)が始まり、いわゆる夏休みも終了。
講義がない期間に行ったところ、やったことはまた改めてまとめるとして、今日は久々に大学へ行き事務所に戻るという流れで動いてみてふと気づいたこと。

  • 松屋(丼物屋さんの方)

以前は寸胴みたいな鍋に入ってたはずの味噌汁が、自動の味噌汁メーカーに変わってた。
ちなみに好物の豚丼は変わらずうまかった。

ケンタッキーだったように記憶をしてる場所が薬屋さんに変わってた。
オープンしたばかりらしく、花が飾ってあってキャンペーンのチラシみたいなの配ってたなぁ。

  • イチョウ並木

学校にも自宅近くにもイチョウ並木があるけど、早くも銀杏が落ち始めてる。
この臭いをかぐと秋だなぁって思う。
あの臭いの内側にこれまた好物の銀杏の可食部分があるのが不思議。

  • 冷凍庫

ふと気づいた、というか気づいて慌てたんだけど、事務所に戻ったら冷凍庫が半開き。
開けたら冷凍庫の中全体が霜。霜。霜。。。

スチームクリーナーとマイナスドライバーととんかちで緊急オペ。

まぁびっくりするくらいの氷が取れましたとさ。

  • ノートPC

緊急オペに専念してから机に戻ったらノートPCからなにやら異音が。。。
ファンに何かが引っかかるような音。
こちらも緊急オペ。
カバー外して分解してファンをばらしてからダストブロワーでお掃除。
終わってからしばらく使ってるけど異音はしなくなった模様。

いろんなものに気づいたり対処したり。
音楽の仕事も進んだし、盛りだくさんな一日。
そしてまだ作業は続く。。。

備えって重要

日常の朝を遮る消防車の音。

「あれ、近いねぇ」なんて言ってたらうちの目の前に。
あれよあれよとうちの集合住宅の入り口にホースが引き込まれ、「え、これ、やばくね?」状態。

避難路の安全を確認する中で、斜め下のうちのぼやらしいことが判明した。
下はまずいよ、下は。
取る物も取りあえず避難ですよ。

鍋を火にかけたまま出かけてしまったらしく、住人不在の消火活動。
まぁ結局は鍋の空焚きで済んで、炎が出る前におさまったから「消火」ではないのかもしれない。
漏れ聞こえる消防士さんの話では「火事扱いにするかしないか」とか言ってたから、扱いによって保険金とかも変わるのかな。

着てるだけで熱中症になりそうな防火服を着た消防隊、ガス漏れ引火を警戒してる(?)東京ガスの人、状況を把握する警察などなど、わらわらと人が集まって、それぞれがてきぱきと動いてました。
いざというときのために、訓練・待機をしている皆さんに感謝です。

それから、おそらくは空焚きの早期発見に最も貢献したであろう火災報知器。
設置の義務化がされてなくて炎が上がってからの発見だったら状況は全然違ってたはず。

日頃の備えって、やっぱり重要。

しばらくはあたりに焦げ臭いにおいが残っていそうな感じです。