派遣事務員の迷走

派遣事務員コロ子。会社の犬。顔出しNG。常に迷走している。

働き方改革 定時で帰って負のスパイラル

こんにちは。
派犬事務員のコロ子です。


f:id:SNegishi:20191106214428p:plain
もう1つ食べちゃおう

働き方改革なのか、最近は担当する仕事が減って定時に帰っている。

以前は毎日夜遅くまで残業していて、残業代込みのお給料を見込んでの生活だった。
定時で帰ると、ただでさえ少ないお給料が更に少なくなった。
残業代を期待するのは良くないと分かってはいるけど、正直言って残業よりビンボーの方がツライ。

負のスパイラル

さらに生活も負のスパイラルにどっぷりつかってる。

定時に帰る(お腹空いた&眠い)
 ↓
駅前のスーパーに吸い込まれるように入り、お菓子を買う
 ↓
犬小屋に着く
 ↓
おやつを食べる
 ↓
眠くなって寝る
 ↓
目が覚めてからごはんの支度&ごはん&お風呂
 ↓
遅い時間から勉強(パソコンで遊ぶ)
 ↓
朝(寝不足で眠い)
 ↓
仕事(寝不足で眠い)
 ↓
繰り返す


ここでポイントなのは、全く自分の意志とは関係なく
「スーパーに吸い込まれるように入る」というところ。
ドッグフードは週末にまとめ買いなので、スーパーに行く理由はない。
なのにいつもスーパーの前の看板には
「アイス3割引き」とか
「〇〇チョコレート98円」とか
「ポイント5倍」などの
魔の文言が書いてある。
そして、スーパーの前を通らずに犬小屋に帰る道はない。

こんな感じで
・常に眠い
・お菓子買って無駄遣い
・お菓子食べて太った
・勉強はちっともはかどらない

せっかく定時に帰っているのに台無し。

ちなみに休みの日は

昼頃起きる
 ↓
日中はいろいろ
 ↓
夜遅くまで起きている
(昼頃まで寝てるから夜なかなか眠くならない)

これまた負のスパイラルにどっぷり浸かっている。

はぁ~。ダメ犬。

なんとかしなくては。

列番号をEnumにするときのモヤモヤ

こんにちは。
派犬事務員のコロ子です。


旅ブログを始めて、「二頭追うものは一頭も得ず」状態になっている・・・。
koroko-resort.hatenablog.com

列番号をEnumにするときのモヤモヤ

例えばこんな表のとき
f:id:SNegishi:20191022120326p:plain

列番号を列挙型変数のEnumにする

Enum Col
    品名 = 1
    縦cm
    横cm
    高さcm
    縦in
    横in
    高さin
End Enum

要素名は表の項目名と同じにすれば選ぶ時に迷わない。
なんとなくカッコイイから要素名も英字にしたいけど、選ぶ時にどれだっけ?ってなっちゃうからなるべく表と同じ表記にする。(今回は単位を後ろに付けたけど。)
でも、Enum変数名は英字にした方が、キーボードの入力を和文に切り替えなくていいからラク

Enum変数を使うとインテリセンスが使えるから楽々コーディングできる。
でも、
f:id:SNegishi:20191022122159p:plain

順番違くない?
宣言した順番でインテリセンス表示してくれればいいのに!

仕方ないので、並び順を考慮して要素名の先頭にアルファベットをAから順に入れてみた。本当は数字にしたいけど、先頭文字に数字は使えないし、列番号と先頭文字が合っているから分かりやすくていいよね。

Enum Col
    A品名 = 1
    B縦cm
    C横cm
    D高さcm
    E縦in
    F横in
    G高さin
End Enum


f:id:SNegishi:20191022123207p:plain
よし!
希望の順番に表示された。


でも、途中で表が変更されることってよくあるよね。
体積の列が途中と最後に追加された場合。
f:id:SNegishi:20191022165755p:plain

ショックだわ~。
せっかく列番号と要素名の先頭文字が同じだったのに。
ここで要素名の先頭文字を振り直したら、コード中の記載も変更しなくちゃいけないから、それは避けたい。

列番号と要素名の先頭文字は無関係、ってことにしてE縦inの前にくるように「体積cm3」をE1体積cm3にして追加。
「体積in3」は最終列だから、I体積in3として列番号と先頭文字が同じになるように何気なく修正。

'列番号と先頭文字は無関係です。
Enum Col
    A品名 = 1
    B縦cm
    C横cm
    D高さcm
    E1体積cm3
    E縦in
    F横in
    G高さin
    I体積in3
End Enum

コロ子一人だから、自分ルール勝手につけてるけど、普通はどうするものなのかな?
最近は可読性を気にしているんだけど、こういうのは大丈夫?
「列番号と先頭文字は無関係です。」ってコメント入れればいい?

パソコンを持って出かけてみた。

こんにちは。
派犬事務員のコロ子です。

ちょっと遅めの夏休みを取って旅行に行ってきた。
いつも旅行のテーマは非日常。パソコンどころか、スマホもカメラ機能以外は使ったことなかった。ITオンチだったから、海外でWifiとかできないし、必要とも思わなかった。
でも今回は脱ITオンチを目指し、ITは日常とか非日常とかではなく、ライフワークにすべく旅行にパソコンを持っ行くことに。
かっこいい事言ってみたけど、実はノンプロ研のVBA講座のTA(ティーチングアシスタント)をやらせてもらう事になったので、事前課題など、どんな内容か見ておかないと不安で不安で仕方ないので、パソコンを持って行くことにした。

*注意
コロ子がアシスタントなんてノンプロ研の講座、大丈夫?なんて心配無用。
講師は高橋さん(@ntakahashi0505)、もう一人のTAはセラエノ(@celaeno4)さん。めっちゃ価値あり充実の講座。
コロ子はキャラ採用。

パソコンを持って飛行機に乗るには?

飛行機ってけっこう揺れる時あるよね。
大丈夫かな、心配だな、振動で壊れたりしないかな。

コロ子のパソコンは15.6インチのノートパソコン。
持ち運ぶにはちょっと大きくて重い。

スーツケースに入れたいところだけど、スーツケースってよく投げられたり、滑り台みたいな所を滑ったりしてる。ただでさえ心配なのにそれはちょっと無理なので手荷物にして機内持ち込みにすることに。
*ノートパソコンにはリチウム電池が使われているので預け荷物NGです。

いつもはリュックにそのまま入れて、絶対に背中から降ろさないけど、飛行機に乗るにはそうもいかない。
パソコンケースを買わなくちゃ。でもクッション性が高そうなケースだと、リュックに入らないからソフトな素材でパソコンにフィットするタイプを購入した。


フィット感はいいけど、入れにくい。
入り口がパソコンより小さくない?


ギューッと引っ張ってもなかなか広がらない。


なかなか入らない。
飛行機の振動より、入れる為にグルグル回したり、上にしたり下にしたり、この振動で壊れるんじゃないかと思うぐらい激しく振り回わし、なんとか入れる事に成功。

機内では最初は足元に置こうかと思っていたけど、踏みつけそうで危ないので、上の棚に入れてみた。他の人の荷物で固定して、大きな荷物がリュックの上に載せられないように見張っていい感じに固定できた。

電源コードはスーツケースに入れて大丈夫だった。

結論

全然問題なし!

で、旅先でしっかり勉強できたのかって?
バーでWifiが繋がるから毎日バーに行ったけど、お酒飲んじゃってヘロヘロ~。
でも海外のバーでパソコンなんて絵的にカッコイイからOK!

サブブログ始めました。

最近ブログの素晴らしさも分かってきたし、せっかく旅行に行ったので旅行記書いてみようかな、と思ったところ、はてなブログでサブブログが作れる事を発見!
サブブログ始めました。(なぜかこっちは顔出しOK)

koroko-resort.hatenablog.com

MROUND関数があった・・・。

こんにちは。
派犬事務員のコロ子です。

f:id:SNegishi:20190921223837p:plain

四捨五入以外で丸めたい

四捨五入でなく、0、5、10、15のように5単位で数字を丸めたいと思い、VBAで関数を作成した。5に限らず、好きな単位で丸めをできるように作成した。
そしたらMROUND関数ってのがあった。

ショック!!

そんな関数あったなんて知らなかったー!
みんな知ってた?
えっ!?常識?

せっかく作成したからコード書いておこう・・・。


【考え方】
①例えば、5つづに丸めたい場合
5の半分の2.5未満が切り捨て、2.5以上が繰り上げになる。
1→0
2.4→0
2.5→5
3→5
7.4→5
7.5→10
8→10
のようになる。

②丸めたい数字を5で割った余りが2.5未満なら、5で割った商に5を掛ける。
【21の場合】
21÷5=4 余り1
なので
4×5=20

③丸めたい数字を5で割った余りが2.5以上なら5で割った商に5を掛けて、5を足す。
【23の場合】
23÷5=4 余り3
なので
4×5+5=25

④コード

Function RoundOther(val As Currency, num As Currency) As Currency

If val - Int(val / num) * num < num / 2 Then

    RoundOther = Int(val / num) * num
 
Else

    RoundOther = Int(val / num) * num + num

End If

End Function


ちなみに、
余りを求める「Mod」関数は整数のみでしか使えないので、少数でも対応するために
val Mod num

val - Int(val / num) * num
とした。

また、商を求める演算子「¥」も整数のみなので
val ¥ num

Int(val / num)
とした。

丸められる数値がマイナスのときは?

MROUND関数は丸められる数値がマイナスの数値の場合は、丸める単位もマイナスにしないといけない。
数学的にはそれが正しいのだろうけど、素人の感覚的には記号を無視して絶対値で入力したい。
なので、コロ子の関数では丸められる数値がプラスでもマイナスでも、丸める単位を絶対値で入力してOK。
マイナス対応してないだけだけど、せっかく自作なんだから、自分の感覚で分かりやすい方がいいじゃん!!

上のセルの値だけをコピーするマクロ(フィルターしていてもOK)

こんにちは。
派犬事務員のコロ子です。

上のセルの値だけをコピーしたい

Excelで上の行をコピーするショートカットキーの「Ctrl + D」。
便利だけど、フィルターされていると、実際の一行上のセルがコピーされるし、
また書式もコピーされるから色とか字体とかもコピーされる。
上のセルの値だけコピーしたいときあるよね?


例えば、

f:id:SNegishi:20190908220720p:plain

このような表で種目AAAでフィルターする。

f:id:SNegishi:20190908220602p:plain

この状態で「Ctrl + D」を押す。

すると、見えている状態(可視セル)の「123-456-789」でなくて、実際の一つ上のセルの「333-1123-456」が入力される。
(いつもフィルターしている事を忘れて失敗する)

また、こんな場合

f:id:SNegishi:20190908231723p:plain

上の行に色が付いている。
この場合は色ごとコピーされる。値だけでいいのに・・・。

上の値だけをコピーするショートカットキーが欲しい。

ということで、自作してみた。

一行上の可視セルの値だけをコピーするマクロ

①個人用マクロブック「PERSONAL.XLSB」にマクロを作成する

「PERSONAL.XLSB」にマクロを作成すれば、そのパソコンならどのエクセルファイルでも使える。

個人用マクロブックを一度も使っていない場合は「PERSONAL.XLSB」はないので作成する。

【作成方法】

開発タブのマクロの記録をクリック。
f:id:SNegishi:20190908223125p:plain

割り当てたいショートカットキーを入力する。
(コロ子は「Ctrl+b」にした。)

マクロの保存先に「個人用マクロブック」を選択してOKボタンをクリック。
f:id:SNegishi:20190908223730p:plain

何か適当に操作して、マクロの記録を終了する。

VBEエディタを見ると「PERSONAL.XLSB」が作成されている。

f:id:SNegishi:20190908224130p:plain

ちなみに「PERSONAL.XLSB」はWindows10では
C:\Users\[user]\AppData\Roaming\Microsoft\Excel\XLSTARTに作成される。


②「PERSONAL.XLSB」の標準モジュールにコードを書く。

【考え方】
①カーソル位置より上の可視セルの範囲を取得する(複数列ある場合は先頭列のみ)
f:id:SNegishi:20190910195834p:plain

②取得した範囲の各々のセルの行番号を配列に格納する

③配列で2番目に大きい行番号が一行上の可視セル。
(一番大きい行番号はカーソル位置)

④一行上の行番号の範囲(カーソル位置と同じ大きさの範囲)をコピー

⑤カーソル位置に値のみを張り付ける

【コード】

Sub PasteValue()

Dim Myrange As Range
Dim MyRow As Long
Dim MyColumn As Long
Dim VisibleRange As Range

Set Myrange = Selection
MyRow = Myrange.Row
MyColumn = Myrange.Item(1).Column '選択範囲の先頭の列

'①MyColumn列の1行目からMyRow行目までの可視セルの範囲を取得
Set VisibleRange = _
Range(Cells(1, MyColumn), Cells(MyRow, MyColumn)).SpecialCells(xlCellTypeVisible)

Dim buf As Range
Dim RowArr() As Long
Dim i As Long

'②配列に行番号を格納する
i = 1
For Each buf In VisibleRange
    
    ReDim Preserve RowArr(i)
    
    RowArr(i) = buf.Row
    i = i + 1

Next buf

'③RowArr配列の2番目に大きい数字(一行上の行番号)を取得する
Dim OneUpRow As Long
OneUpRow = WorksheetFunction.Large(RowArr, 2)

'④一行上の行番号の範囲をコピー
Myrange.Offset(-(MyRow - OneUpRow), 0).Copy

'⑤値のみ貼り付け
Myrange.PasteSpecial Paste:=xlPasteValues

Application.CutCopyMode = False

End Sub


これで「Ctrl+b」で上の可視セルの値だけがコピーできる!

すごく便利だったから、職場で「このマクロいる?」ってみんなにメールしてみたけど、誰からも反応は無かった。
一般的な需要じゃないのか・・・。

ちなみに新しく「PERSONAL.XLSB」を作った場合は、エクセルを開くたびに、「PERSONAL.XLSB」も一緒に開くので表示タブの「表示しない」を選択し、非表示にしておけばOK。

コロ子、VBA For文を勘違いしていた(ループの途中で行が増えたら)

こんにちは。

派犬事務員のコロ子です。

VBA For文(またもやコロ子勘違いしていた)

VBAでFor文って基本中の基本。一番最初に覚えた構文。
そんなFor文でコロ子、最近までまたもや勘違いしていた。

For文のループ回数は途中で変更できない!?

先日、こんなコードを書いた

Dim i as Long

For i = 1 to Cells(Rows.Count, 1).End(xlUp).Row

	ループの途中で行を挿入

Next i

あれ?
途中で行を挿入したら、最終行までループしていない。
Cells(Rows.Count, 1).End(xlUp).Row
は最終行の行番号が取れるから、行が増えたら最終行の行番号も増えて、ループ回数も増えるよね??

おかしい、と思って調べてみた。
下記コードでループ回数Aを途中で5回から10回に増やしてみる。

Sub test1()

Dim A As Long
Dim i As Long

A = 5

For i = 1 To A
    
    If i = 3 The
        A = 10
    End If
    
    Debug.Print i

Next i

End Sub

【結果】イミディエイトウインドウ

 1 
 2 
 3 
 4 
 5 

5回しかループしてない。何で?
1行づつ実行してみたら原因が判明。

下記のような場合

①  For i = 1 To 3

②   Debug.Print i

③  Next i

プログラムが実行される順番は
①→②→③②→③②→③

えっ!!!
①は最初の1回しか通っていない。あとは②と③をループ回数繰り返す。

だから途中でループ回数の値を変更しても、ループ回数は変更しないのかー。
知らなかった。

【ちなみにDo~Loopの場合】

① Do While i < 3

②  Debug.Print i
   i = i + 1

③ Loop

プログラムが実行される順番
①→②→③①→②→③①→②→③→①

こちらは予想通り、最後に①で式がTrueになっているかを判定している。


でも、For文で絶対ループ回数を変更できない訳ではない。
カウンターの変数を変更したら、ループ回数は変更する。

Sub test()

Dim i As Long

For i = 1 To 5

   If i = 3 Then
        i = 10
   End If
   
   Debug.Print i

Next i

End Sub

【結果】イミディエイトウインドウ

 1 
 2 
 10 

これってNext iで何かを判定しているって事なの?この辺りが謎。

とことで、ループの途中で行が増えたらどうするの?

下からループすればOK。(行削除の場合と同じ)

Dim i as Long

For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1

	ループの途中で行を挿入

Next i

ノンプロ研定例会(ノンプログラマーの為の社内VBA&GAS活用法)に参加してきました。

こんにちは。
派犬事務員のコロ子です。

ノンプロ研定例会!

ノンプロ研定例会に参加してきました!
今回のテーマは「ノンプログラマーの為の社内VBA&GAS活用法」
これはすごい興味ある。みんなどんなどうやって業務にVBA(GAS)を活用しているのか興味津々。コロ子いつも一人でやっているから、どうも視点が狭くなりがち。他の人の「こんな事やっています!」が凄い刺激になる。

VBA活用法に登壇されたのが、セラエノ (id:celaeno42) さん。この方VBAニューラルネットワークとやらも作れちゃう超達人!業務にどんな風に活用しているかの知りたーい!

VBAは何でもできる

セラエノさんの会社、結構ルールがガチガチでコロ子の環境と良く似てる。
アプリのインストール不可などものともせず、VBAでいろいろ作りまくる。
VBAMicrosoft officeだけでしか使えない」なんて固定概念をぶっ壊して
くれたわよ!凄すぎて「そんな事できちゃっていいの?」って思わず笑っちゃう。

社外秘のファイルを閲覧のみで表示する、というのを作られていて、マウスを動かすと表示が消えて、もちろん画面のキャプチャも取れない仕組みになっている。
コロ子の会社でも、閲覧のみでプリント不可のファイルがあるんだけど、ちょっとした裏技でプリントできちゃう。(ちゃんとシュレッダーで破棄しています)コロ子の会社の情シスより1枚、2枚、いや100枚くらい上手。凄すぎ!

セラエノさん、ここまで来るのに「運が良かった」「勝手に信用される」などと言っていたけど、絶対にそんなはずはない。
「運」なんて良いときも、悪いときもみんなそれなりにあるし、「信用」なんて勝手にされるものでもない。

セラエノさんのプレゼンを聞いて思ったことは
与えられた仕事以上の仕事をこなし、みんなが便利になるための労力を惜しまず、そして人を立てる。

できる人だ。

自分はどうだろうか・・・?

報酬以上の仕事をしないと「成功できない」と何かで読んだことがある。
いつもお給料が低いことに文句を言っているけど、はたしてその給料以上の働きが出来ているのか・・・?
コロ子の部署ではVBAはコロ子一人しかできないから、大した技術もないのに、みんなより自分の方ができるとか勘違いして天狗になっているのではないか?

「うぇ~ん。違うよー。(涙)」
最初はみんなの役に立ちたくて、チームの為にできることをしようと思っていたのに。みんなにはみんなの仕事があって忙しいから、だから事務員のコロ子がみんなの代わりにVBAを覚えればいい、と思っていたのに。なのにいつの間にか、「認めて貰えない」「頑張ってもお給料が上がらない」とか、文句ばっかり。そんなんじゃ、誰からも信用されない。

コロ子の現実

ある事件をきっかけに、コロ子、会社での信用を無くしてしまった気がする。
そして、コロ子も会社を信用できなくなった。
「派犬だから」で済ませばそれはそれでいいのかも知れない。
でも、でも・・・。

今、上手くいっていない仕事を抱えている。
「これ以上できません」で諦める事もできるけど、会社からの信用どころか、自分で自分の信用をなくしてしまう。
なんとかしなければ。
月曜日会社に行ったら上司と今後の進め方について相談してみよう。

コロ子、夜中の東京で迷走

セラエノさんのプレゼンの後、@etau0422さんのGASの活用法、その後3名のLTがどれも最高に面白くて大満足の定例会だった。
その後懇親会で楽しくお酒を飲み、コロ子遠方の為、みんなより先に帰ることに。
「今どこにいるんだろ~」とまったく位置を把握していないまま、Googleマップを見ながら、適当に歩き出した。しばらくすると地下鉄の入り口らしきものが見えたので入ろうとしたら、思っていた駅の名前と違う。マップを見たら全然反対方向の駅だった。マップ見てたはずなのにおかしいなー。(この時点で縮尺がおかしい。目的の駅はもっと遠い)とまた反対方向に歩いて行った。マップ見てるはずなのに横断歩道を渡ったら方向が分からなくなり行ったり来たり。途中で思っていたより距離がある事に気づき、駅まで何分かかるんだろう、終電大丈夫かなぁ、タクシー乗っちゃおうかな、などとちょっと焦ってきた。
なんとかマップで目的の駅のところまで来たのに、地下鉄の入り口が見つからない。そのまままっすぐ歩くと、マップでは駅を通りすぎている。慌てて戻ると、また駅を通りすぎている。「電車の駅が見つからないよー」と半泣きしながら近くの人に聞いたら、そっちですよ、と今来た方向を教えられ戻る。また別の人に聞いたら、「何線?あーそれだったら、その看板の横に階段があるからそこから入れるよ」と教えてもらい、なんとか電車に乗る事ができた。
駅ってどこにも書いてなかったよ!?難易度高すぎ!!!

後で分かった事だけど、最初に見つけた駅から電車に乗って1駅でコロ子の探していた駅に着くことが判明!

夜中に無駄に迷走