VBAの勉強を始めてみた

色々試しています。

エクセル女学院に極秘潜入(雑記-14)

今回は、エクセル女学院と呼ばれる謎の学院に極秘潜入したので、その様子を報告いたします。

本校は、双子の妖精が通っていたり、アンドロイドが徘徊していたり、魔法使いが魔術を学んでいたりして、設定が破綻している。バラエティーに富んでいる。

名簿の中から、以下の生徒達にコンタクトをはかってみた。

  • 文城愛真(ぶんきえま)・・・・・・白黒はっきりさせる仕切り屋さん
  • 飛木アレイ(ひきあれい)・・・・・・正確無比で忠実な”表引き”アンドロイド
  • 羽矢川希依、羽矢川愛音(はやかわきい、はやかわおと)・・・・・・入力が苦手な人にやさしい妖精姉妹
  • 書上彩葉(しょがみいろは)・・・・・・目立ちたがり屋の書式アーティスト
  • 書上数葉(しょがみかずは)・・・・・・見せ方にこだわる数値の書道女子
  • 華表頼々(とりいらら)・・・・・・表加工が得意なフォークリフト女子
  • 軸原美賢(じくはらみさと)・・・・・・データ集計&分析の一級建築士
  • 門司希里香(もじきりか)・・・・・・関数もかなわない文字列の魔法使い

 

まずは、妖しい魔方陣の描かれた薄暗い教室で魔術を学んでいる「門司希里香」にコンタクト!

彼女からフラッシュフィルっていう、エクセルの便利機能を教えてもらった。(魔術は?)

 

f:id:kouten0430:20180418231655j:plain

f:id:kouten0430:20180418231709j:plain

f:id:kouten0430:20180418231721j:plain

f:id:kouten0430:20180418233249j:plain

f:id:kouten0430:20180418233307j:plain

f:id:kouten0430:20180418231810j:plain

f:id:kouten0430:20180418231820j:plain

f:id:kouten0430:20180418231835j:plain

 

(ドスッ!)※鳩尾に何かカタイものが当たる音色

 

f:id:kouten0430:20180418231927j:plain

f:id:kouten0430:20180418231937j:plain

f:id:kouten0430:20180418231950j:plain

 

こんな感じで、他の女生徒達ともエッチな関係に、仲良く


・・・・・・。

 

・・・・・・。

 

・・・・・・。

 

なりはしませんが、日経PC(2018年5月号)の「エクセルキャラクター大図鑑」という、記事を読ませてもらいました。

実際の記事は萌えキャラ達が漫画ふうにアレコレ説明してくれる訳ではありません。

なので、コレ、擬人化する意味あるん?

と思ってしまいましたが、もしかして、こうやって雑誌を手にしている時点で、日経BP社の戦略にハマッている?

 

f:id:kouten0430:20180418232414j:plain

自分の資質の低さと向き合うためには(雑記-13)

(前回の続き)

もともと人の脳なんて不確実なものであり、それに加えて私は資質が足りない・・・・・・ので、徹底的にそれを補う方法を模索しなければなりません。
(卑屈に聞こえてしまうかもしれないけれど、実際にそうなのでしょーがない)

 

私は、時々刻々と変化する状況を、才能で乗り越えていけるほど、先天的な資質に恵まれていない。
・・・・・・ということをこれまでの経験から自覚している・・・・・・ので、それを補うためには知識やスキルをプラスし、磨くしかない訳です。
でも、知識やスキルも、自分の衰えとともに劣化し、薄れていく可能性があることも知っているので

  • 思考を冷凍保存しておき
  • 壊れたり失うこともなく
  • 世界のどこからでも取り出すことができる
  • しかも、それは自立歩行する(条件分岐や繰り返し処理)

といった類のもの(プログラミングとか)で、時間的に、空間的に、物質的に、補う必要があるのではないかとおぼろげに考えていたりします。

 

自分の資質に頼らなくても済むようにするには?
と、いうことをこれまでの人生で考え・模索をし続けてきましたが、今は、そうせざるを得ない自分を誇りにも思っています。

 

なぜなら、永久にそうすることに飽きることがなく、同時に、うまくいった時の喜びも知っているからです。

プログラミングの魅力について稚拙ながら語ってみる(雑記-12)

VBA生命科学研究所 所員の好天です(*v.v)
プログラミングを生業としていない者の視点から、プログラミングの魅力などについて、稚拙ながら語ってみたいと思います。
私が感じている、プログラミングの魅力をいくつか書き出してみます。

  • 意図通りに動いたとき、単純に嬉しい
  • 好きなだけ修正し、バージョンアップすることができる
  • ネット上にコードがあれば、世界のどこからでも取り出すことができる
  • 無形であるため、壊れたり失うことがない
  • 自分以外の誰かの役に立つ(かも知れない)
  • 自分が組んだコードは唯一のものであるため、愛着が湧く(似たようなものはどこかにあっても、変数の使い方や条件分岐・ループ処理等に必ず自分の色が出る)
  • 自分がコードの意味を忘れたとしてもプログラムは生き続ける

 

このうち、最後に挙げた理由が特に気に入っていて、コーディングが済み、正常に動くことを確認されたプログラムは、自立した生命のようであり、世界で唯一のものであることも手伝って愛着が湧いてきます。
人の知識や技能は、時間の経過と共に衰え、薄れていくものです。
ですが、一度自分の手によって生み出されたプログラムは、起動する方法さえ覚えていれば、コーディングをした際の当時の思想そのままに、・・・・・・自分の劣化や衰えに関係なく・・・・・・いつまでも忠実に、かつ正確に処理を実行してくれます。

 

電子計算機に命を与えるために、プログラムという形に冷凍保存された、思考の塊り。

思考の塊りは、オフラインの端末に留まらず、ネットワークを通じて地球の裏側の端末にも命を与えることができる。

 

そのような頼もしい生命達が、能力の足りない私を(永遠に)補ってくれるように思え、知識や金品の蓄えとは違う安心感を与えてくれるのです。

私はプログラミングを生業としておらず、特別にプログラミングが得意という訳ではありません。
・・・・・・が、私を(または、私と同じような誰かを)補うためのプログラムを、稚拙ながらも考え、共有したい・・・・・・、という欲は無限に湧いてくるのです。

(続く)

妖しい遊びを探して夜の街を徘徊(雑記-11)

18時00分
パチンコで5万円勝つ。
確変が終了し、終わったと思いきや、時短で引き戻しトータル12連チャンヽ(*´∇`)ノ
回転の良い台だったのでもう少し打ちたかったが、このあと予定があるので換金してホールを出る。

 


18時30分
予定とゆーのは、PRIMEというキャバクラのキャバ嬢との同伴。
今日は「明太じゃがマヨピザ」を食べたい気分だったので、待ち合わせ場所で嬢と合流して、和民へと向かう。
店に着いてとりあえず、プレミアム・モルツ生で乾杯!

f:id:kouten0430:20180323221525j:plain

 

ほのか「好天さん、ええ声してるってよう言われるやろ?」
好天「たまにね」
・・・・・・
ほのか「担当キャバで遊んどるやろ?」
好天「そんなことないよ!」
・・・・・・
ほのか「好天さんて、他のお店にも通ったりしてるん?」
好天「いや」
・・・・・・
ほのか「ほんなら、ついでにもう1コ聞いてもええ?好天さん、彼女、おるん?」
好天「いないよ」
・・・・・・


そんな話をしながら、明太じゃがマヨピザ、石焼あんかけ炒飯、デザートに白玉抹茶アイスなんかを食べた。
お会計は私持ち。

 

その後、PRIMEで2回延長し、トータル3万円以上使ってしまった!

 


22時00分
店を出て少し歩いていたら、いい匂いが漂ってきたので「まぐたこ」でたこ焼きを買い、歩き食いする。

f:id:kouten0430:20180323221550j:plain

このあと、ほのかとのアフターまで時間があるので、近くにあったコインロッカーを片っ端から開けてみるヽ(‘ ∇‘ )ノ
アーミーナイフなんかが出てきたけど、怖いので元にもどした。

 


23時00分
もう少し時間があるので、BARで飲みなれないブランデーを飲んでみることにする。
ブランデーの「V.S.O.P」は、
Very:非常に、Superior:優良な、Old:古い、Pale:透きとおったという意味なんだって。
ちびちび飲んでたつもりだったけど、やっぱアルコール度数が強いのでけっこう酔いが回ってきた。

 


0時00分
呼び込みの黒服に何回も声をかけられるけど、酔ってフラフラなのでスルー。
通り過ぎたあとに舌打ちが聞こえたけど、振り返る余力がない。聞いた話だと、彼らはテリトリーの外にまで追ってこれないらしい。

 


0時30分
むしょうにラーメンを食べたくなってきたので、ラーメン屋「金龍」に入ってチャーシュー麺と、瓶ビールを頼む。
さらに追加で瓶ビールを頼む・・・・・・そこから記憶が・・・・・・。


・・・・・・。

・・・・・・。

・・・・・・。

・・・・・・。

・・・・・・。

・・・・・・。

・・・・・・。

・・・・・・。

 

f:id:kouten0430:20180323222234j:plain

 

 


というアレコレを、龍が如くで疑似体験した金曜の夜でした。

 

f:id:kouten0430:20180324120248j:plain

(若干古い・・・・・・。)

ブログ以外の趣味を探して街を散策(雑記-10)

AM10:00
目が覚める。
季節の変わり目で、疲れがたまっているのか10時間近く眠ってしまった・・・・・・。
夜中の3時くらいに一度目が覚めた時は、まどろみに心地よさを感じたけど、今は寝すぎで体が重い・・・・・・。

 

今日は、ブログや読書以外の趣味を見つけるために、街に出てみようと思う。

 


AM11:00
玄関から外に出ると、薄暗い空からまっすぐな雨が降っていた。
(めずらしく風が無いので、地面に向かって一直線に降っていた)
そのまま玄関を閉めて家の中に戻ろうと思ったけど、とりあえず、街に繰り出してみる。

 


AM11:10
天気はともかく春分の日でお休みなこともあって、車が多かった。
街を見渡すと、色んなモノや人があふれ、楽しいことはどこにでもあるような気がしたけど、それを自分の実体験にするには、ほんの少しの勇気と時間が必要。
それらに、何も考えずにとりあえず足をつっこんでみるのか、計画的に考えてから足をつっこんでみるのか・・・・・・。
どっちが正解という答えはない。
そんなことを考えながら、街を散策して、とりあえず自販機で缶コーヒーを二つ買う。(一つは今飲む用で、もう一つは帰宅してから飲む用)
まぁ予想してたけど、あても無くただ単に街に出ただけという感じになってしまった。

 


PM12:00
手作りパン屋で、おいしそうなサンドイッチを買う。ハムやたまご、レタスその他もろもろ。
やっぱり手作りのヤツはコンビニのとは全然違うね!

 


PM12:30
見たことないゲームセンターがあったので入ってみる。(元々、ゲームセンターでゲームをするタイプではないけど・・・・・・)
ビデオゲーム、UFOキャッチャーや、オンラインの麻雀ゲームなど一通り見て、プレイせずに外に出る。
リーゼントで煙草をくわえた、ヤンキーはたむろしていなかった。

 


PM13:00
久しぶりに大型電機店に入ってみる。そして、ハイスペックなPCを眺める。
今使っているGatewayがそろそろ8年くらい経つので、いつ壊れてもいいように、そろそろリプレースの検討を始めてもいい頃かなと思う。
実際、ハイスペックPCは必要ないけど、どうせならオーバースペックくらいがテンションがあがる。

 


PM13:30
自販機で缶コーヒーを買う。なぜなら、サンドイッチといっしょに飲んでしまったから。

 


PM14:00
帰宅すると、郵便受けにさっきの大型電機店からのDMが、中には「お誕生日が近いのでご来店いただくだけで300ポイント進呈!」の文字・・・・・・。
遅いよ!もしかしたら昨日から郵便受けに入っていたのかも。

 


PM15:00
缶コーヒーの空き缶に囲まれた、キーボードでこの記事を書いてます。
予想通りですが、今日はただ単に街を散策してきただけです。
新しい趣味はいずこに?

罫線の有無で範囲選択を行う

Excelで、「Shift」+「Ctrl」を押しながら矢印キーを押せば、データの存在する最終行まで一気に選択することができます。が、下のようなデータの入っていない罫線のみの表で同じことをすると、

f:id:kouten0430:20180317134649j:plain

 

こんな感じで、Excelの最終行(1048576行など)まで突き抜けて選択されちゃいます。

f:id:kouten0430:20180317134704j:plain


通常はデータの有無で下端や右端を判断しますが、今回は罫線の有無で表の下端や右端を判断して一気に範囲選択するマクロを作ってみます。

目次

 

 

羅線のある”空白セル”を下端まで選択する 

まず、下のように途中に邪魔者がいる直前のセルまで下方向に一気に選択するマクロです。(これは遊びです)

f:id:kouten0430:20180317134826j:plain

 

Sub 羅線のある空白セルを下端まで選択する()
    Dim x As Integer
    Dim xe As Integer
    Dim y As Long
    Dim ye As Long
    Dim EL As Integer
    Dim ER As Integer
    Dim EB As Integer
    
    x = Selection.Column   '選択中のセルの列番号を取得する
    y = Selection.Row  '選択中のセルの行番号を取得する
    
    xe = Selection.Columns(Selection.Columns.Count).Column
    ye = y

    EL = Cells(y, x).Borders(xlEdgeLeft).LineStyle  'セルの左端の罫線の種類を取得する
    ER = Cells(y, x).Borders(xlEdgeRight).LineStyle 'セルの右端の罫線の種類を取得する
    EB = Cells(y, x).Borders(xlEdgeBottom).LineStyle 'セルの下端の罫線の種類を取得する

    Do While ((Not EL = xlLineStyleNone Or Not ER = xlLineStyleNone Or Not EB = xlLineStyleNone) _
    And Cells(ye, x).Value = "") Or Rows(ye).Hidden = True 'セルの右か左か下に罫線があり、かつ空白の場合は処理を行う。または行が非表示の場合は処理を行う
    
        ye = ye + 1 '1行下に進む
    
        EL = Cells(ye, x).Borders(xlEdgeLeft).LineStyle
        ER = Cells(ye, x).Borders(xlEdgeRight).LineStyle
        EB = Cells(ye, x).Borders(xlEdgeBottom).LineStyle

    Loop

    If Not y = ye Then  'ループに一度も入らなかった場合、処理を行わない
        Range(Cells(y, x), Cells(ye - 1, xe)).Select '選択中のセルから下方向に、罫線があり、かつ空白のセルをすべて選択する
    End If

End Sub

 

 

羅線のあるセルを下端まで選択する

次に、邪魔者を無視して、表の下端まで一気に選択するマクロです。

f:id:kouten0430:20180317135018j:plain

 

Sub 羅線のあるセルを下端まで選択する()
    Dim x As Integer
    Dim xe As Integer
    Dim y As Long
    Dim ye As Long
    Dim EL As Integer
    Dim ER As Integer
    Dim EB As Integer
    
    x = ActiveCell.Column   '選択中のセルの列番号を取得する
    y = ActiveCell.Row  '選択中のセルの行番号を取得する
    
    xe = Selection.Columns(Selection.Columns.Count).Column
    ye = y

    EL = Cells(y, x).Borders(xlEdgeLeft).LineStyle  'セルの左端の罫線の種類を取得する
    ER = Cells(y, x).Borders(xlEdgeRight).LineStyle 'セルの右端の罫線の種類を取得する
    EB = Cells(y, x).Borders(xlEdgeBottom).LineStyle 'セルの下端の罫線の種類を取得する

    Do While (Not EL = xlLineStyleNone Or Not ER = xlLineStyleNone Or Not EB = xlLineStyleNone) 'セルの右か左か下に罫線がある場合は処理を行う
    
        ye = ye + 1 '1行下に進む
    
        EL = Cells(ye, x).Borders(xlEdgeLeft).LineStyle
        ER = Cells(ye, x).Borders(xlEdgeRight).LineStyle
        EB = Cells(ye, x).Borders(xlEdgeBottom).LineStyle

    Loop

    If Not y = ye Then  'ループに一度も入らなかった場合、処理を行わない
        Range(Cells(y, x), Cells(ye - 1, xe)).Select '選択中のセルから下方向に、罫線があるセルをすべて選択する
    End If

End Sub

 

 

羅線のあるセルを右下まで選択する

最後に、表の右下まで一気に選択するマクロです。

f:id:kouten0430:20180317135145j:plain

 

Sub 羅線のあるセルを右下まで選択する()
    Dim X As Integer
    Dim Y As Long
    Dim XE As Integer
    Dim YE As Long
    Dim EL As Integer
    Dim ER As Integer
    Dim EB As Integer
    
    X = ActiveCell.Column   '選択中のセルの列番号を取得する
    Y = ActiveCell.Row  '選択中のセルの行番号を取得する
    
    XE = X
    YE = Y

    EL = Cells(Y, X).Borders(xlEdgeLeft).LineStyle  'セルの左端の罫線の種類を取得する
    ER = Cells(Y, X).Borders(xlEdgeRight).LineStyle 'セルの右端の罫線の種類を取得する
    EB = Cells(Y, X).Borders(xlEdgeBottom).LineStyle 'セルの下端の罫線の種類を取得する

    Do While (Not EL = xlLineStyleNone Or Not ER = xlLineStyleNone Or Not EB = xlLineStyleNone) 'セルの右か左か下に罫線がある場合は処理を行う
    
        YE = YE + 1 '1行下に進む
    
        EL = Cells(YE, X).Borders(xlEdgeLeft).LineStyle
        ER = Cells(YE, X).Borders(xlEdgeRight).LineStyle
        EB = Cells(YE, X).Borders(xlEdgeBottom).LineStyle

    Loop
    
        If Not Y = YE Then  '下方向のループに一度でも入った場合は処理を行う
            ER = Cells(YE - 1, X).Borders(xlEdgeRight).LineStyle
            EB = Cells(YE - 1, X).Borders(xlEdgeBottom).LineStyle
        End If
    
    Do While (Not ER = xlLineStyleNone Or Not EB = xlLineStyleNone) 'セルの右か下に罫線がある場合は処理を行う
    
        XE = XE + 1 '1列右に進む
    
        ER = Cells(YE - 1, XE).Borders(xlEdgeRight).LineStyle
        EB = Cells(YE - 1, XE).Borders(xlEdgeBottom).LineStyle

    Loop

    If Not Y = YE And Not X = XE Then 'ループに一度も入らなかった場合、処理を行わない
        Range(Cells(Y, X), Cells(YE - 1, XE - 1)).Select '選択中のセルから右下方向に、罫線があるセルをすべて選択する
    End If

End Sub

 

※SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら。 

 

(2018.8.5 使い勝手向上のためにコードをほんの少し修正)

データを指定文字で区切ってクリップボードへ転送する

複数選択したセルのデータを指定文字列で区切って連結し、クリップボードへ転送するマクロを作ってみました。
Wordやメール、メモ帳など他のアプリケーションにコピペする際に便利です。

文章の中で、データとデータを区切るために使うのは(コロン)(読点)(カンマ)(ピリオド)(中点)(スラッシュ)(ハイフン) (スペース)あたりでしょうか。

 

ためしに、下のデータを中点で区切ってクリップボードに転送してみました。

f:id:kouten0430:20180309144810j:plain

 

f:id:kouten0430:20180309160849j:plain

 

公的にやる機会は思いつきませんが、顔文字で区切ってみました。

f:id:kouten0430:20180309154302j:plain

 

今回はこれだけです。

 

Sub 指定文字で区切りクリップボードへ転送する()
    'クリップボードへ転送したいセルを選択(複数可)した状態で実行して下さい
    'セルを選択した順にデータを右方向へ連結していきます
    'InputBoxがブランクなら、区切り文字なしで連結していきます
    Dim myRange As Range
    Dim V As String
    Dim dc As String
    Dim myLib As Object
    Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  '参照設定なしでDataObjectのインスタンスを生成する
    
    dc = Application.InputBox(Prompt:="区切り文字を指定して下さい。" & vbCrLf & "(改行にする場合はキャンセルして下さい)", Type:=2)
    
        If dc = "False" Then
            dc = vbCrLf   'キャンセルの場合は区切りを改行にする
        End If

    For Each myRange In Selection.SpecialCells(xlCellTypeVisible)   '可視セルのみに処理を行う
        If myRange.Address = myRange.MergeArea(1).Address Then   '結合セルの場合は左上の値のみ取り出す
            V = V & myRange.Value & dc
        End If
    Next myRange
    
    V = Left(V, Len(V) - Len(dc)) '最後の区切り文字を取り除く

    myLib.SetText V  '変数の値をDataObjectに格納する
    myLib.PutInClipboard 'DataObjectのデータをクリップボードに格納する

End Sub

※SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら