なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

管理職になる前に管理を考えてみる

f:id:nazuna_0124:20170406201732p:plain

技術は手段なのでそこまで興味がないというのが

本音です。


お金貰えればなんでもいいです



おつかれさまです。なずなです。



やっぱり給与をあげるなら

管理職になるほうが早いそうな。


(極端に残業が長い人は多分のぞく)



下から見ると上の人は何もしていないように見えるのが

常です。というわけで、改めて管理を考えてみましょう。



最初に辞書的な意味から。


よい状態であるように気を配り、必要な手段を使って

とりさばくこと。



と、あります。


状態に対するアクションなわけです。



ちょっとした曲者は良い状態のところで

今で問題ないなら何もしなくていいということですね。



なんだー なにもしなくていいのか←



世の中の大抵の人が管理が苦手なのは、

この自分の管理対象の状態を把握が、まず苦手。

工数をかけられない、のが大きいと思います。



そして他から悪い状態だと指摘が入ったときに

必要なアクションが取れないことですね。



なぜ、取れないのかは少し深堀りが必要なので

そのうち考えてみることにしましょう。



というわけで、どーせ私が任されるチームは

ほっといても問題ないところなので、

管理職なりたいなーっと。

スクレイピングまでがんばるVBA講座~4.プログラム基礎(ループ)

f:id:nazuna_0124:20170510210426p:plain

ぼえ~~~ 秋風が爽やかで気持ちいいですね~~

定時帰りおいしいです。



おつかれさまです。なずなです。


講座の4回目。プログラム基礎ってやつですね。



ここを飛ばすとまずい箇所です。


先々でわからなくなったら、ここに戻りましょう



プログラム基礎(ループ)

ここからはプログラムの基礎知識です。
基礎とはいえ、実は大半これでなんとかなります!

人はなぜプログラムを使うのか。1つの回答は繰り返しを行うのに
ほとんどコストがかからないからaです。

純粋に覚えて慣れるための部分です。
つまんないですけど、がんばりましょー。ほかで慣れてる人は
書き方だけ覚えて飛ばしてオッケーです。



VBAではインクリメントがありません。
i = i + 1 表記です。 (ほかはi++とかける)

ループの表記方法は以下

for i = 0 to 10

    debug.print i
next i

do while cells(1,1).value <> ""

    debug.print cells(i,1)
    i = i + 1
loop


for each s in Worksheets

    debug.print s.name
next


ここでぴんとこないかたは適当にぐぐったページで調べてみてください。


[補足]
ループを強制するにはCtrl + Breakキーです。
特にDo loopでカウントを忘れて無限ループしてしまうことがよくあります。

キーボードの位置や状況によっては止まらなかったりします。
そういうときは強制終了するしかありません。

データは戻ってしまうのでループ実行前には保存する癖をつけたほうが無難です。

九九を作成する。

いろいろ方法が出てきます。 目的としているのは2重ループをすんなにかけるかどうかです。

ここはこぴっちゃだめです。最初は写経でもいいので、 手なりでかけるようにタイピング練習しましょう!

Sub QuQu()
    Dim y, k As Long

    For y = 1 To 9
        For k = 1 To 9
            Cells(y, k).Value = y * k
        Next k
    Next y

End Sub


・15の段まで表示するように変更してみてください。
・サンプルはA1から開始されています。C6からの表になるように変更してください。


[補足]
ついでに変数宣言の書き方の一例です。
こういうループのための変数をカウンタ変数なんて言ったりします。

この変数に大仰な名前をつけるかは諸説わかれるところですが、
For分は i,k,y,x などわかりやすいもので問題ないです。

表を読み取る

データを扱う上で表は基本中の基本になります。
むしろ、どうやって「表に変えるか」を考えるくらいです。

というわけで、続いて読み取りです。
今回作った表をdebug.print します。


Sub ReadQuQu()
    Dim y, k As Long

    For y = 1 To 9
        For k = 1 To 9
            Cells(y, k).Value = y * k
        Next k
    Next y
End Sub


これで読み取りは可能です。


### もし何行目まで記載があるか不明な場合

方法は2つあります。○○の間繰り返すDo while

 Sub ReadQuQu2()
    Dim y, k As Long

    y = 1
    k = 1

    Do While Cells(y, 1) <> ""
        Do While Cells(y, k) <> ""
            Debug.Print Cells(y, k).Value

            k = k + 1
        Loop

        y = y + 1
    Loop
End Sub 



変数に初期値が必要です。
カウンタ変数を足していく処理も必要です。


この方法では1列目に空白行があればそこでループが終わることに注意してください。
実際に使うときには必ず入力される列を対象にします。


Until(○○まで繰り返す)という書き方もあります。
暇な人は書き換えに挑戦してみてください。



もう1つは最初に何行目まであるかを取得する方法です。


 Sub QuQu3()
    Dim y, k As Long
    Dim LastRow, LastClm As Long

    LastRow = Cells(10000, 1).End(xlUp).Row
    LastClm = Cells(1, 250).End(xlToLeft).Column

    For y = 1 To LastRow
        For x = 1 To LastClm
            Debug.Print Cells(y, x)
        Next x
    Next y


End Sub


Excelでの最終行、最終列の取得方法はぐぐってオッケーです。
表の形式によって微妙に違うので使い分けましょう。

ここでは事前に行数を数えてループの繰り返し回数に設定するという
基本方法として覚えてください。

オブジェクトのループ

For Each ループの説明回です。
最初はちょっととっつきにくいですね。

イメージでいえば子供に皿を洗ってもらう場合。
先に皿が何枚あるか数えて、「○○枚あらって」などと指定せずに
流し台にある皿を全部洗ってと伝えます。

おおよそ。こういうイメージです。複数固まったオブジェクトから
1つ1つ取り出して処理することができます。

ここでついでに覚えておきましょう。Rangeオブジェクトは複数範囲を
指定することができます。

```VB
Sub QuQu4()

Dim rng As Range
Dim r As Range

Set rng = Range("A1:I9")

For Each r In rng
    Debug.Print r.Value
Next

```
こういう書き方になります。
結構すっきりしててよいです。

1つ注意点としてはこのループでは読み出す順番が保証されていない
ことです。
順番が必要な場合はほかのループ方法を使いましょう。


End Sub


このループを使ってオブジェクトをまず変数に取得。
その中から特定の名前や条件に一致するオブジェクトを選ぶことをよくやります。

例としては、同じブック内のシート名をすべて表示します。

```VB
    Sub ReadSheetNam()
    Dim s As Worksheet


    For Each s In ThisWorkbook.Worksheets
        Debug.Print s.Name

    Next

    End Sub
```

変数に格納しない事例もしめしつつこんな感じに。


・Excel内のすべてのブック名を表示するプロシージャを作成してください。
(ぐぐってオッケーです)



ここのループ、次の条件分岐を覚えるあたりから

ぐぐってなんとかする癖付けをしておきましょう。



ただし、それは独学時のみです。


15分悩んで答えが出なかったら、

さっさと私に質問してみよ~。

VBAで扱う文字の集まりの種類~VBA講座の合間話題~

f:id:nazuna_0124:20170406201732p:plain

なんとなく眠れなかったので、予約投稿でぽち。

更新見てる奇特な方はお昼にでも読んでみてください。



おつかれさまです。なずなです。



講座の合間の話題です。


どっかに挟む予定の話題でもあるので

仮まとめともいいます。



VBAの仕事のかなりの部分が実は

文字列を規定フォーマットに変換して出力だったりします。


規定フォーマットに変えるところを

アルゴリズムなんて言い方する場合もありますね。


元の文字列が何かによってコツが違うので

そのカテゴリわけです。



たといえば、新入社員の情報をWebシステムに

登録する作業なんかを想定。



1. 文章

おつかれさまです。なずなです。

4月1日から入社しました。スキルにVBALinuxがあります。 仙台に住んでいます。

お手数ですが、登録をお願いします。


いきなりですが、これは扱いません


ここから情報引っ張るのがプログラムでは無理だとは言いませんが、

現実的ではないです。



2. 独自表記(OK)

社員名:なずな

住所:仙台

スキル:VBA/Linux


それぞれの情報が項目名、コロン、情報と並んでいて、

1行に1つの情報と明確です。


これは簡単です。こういうのをちゃちゃっと処理できるようにするのが

直近の目標になります。



3. 独自表記 (NG)

社員名:なずな

住所:仙台

スキル:VBA/Linux ※Linuxはあまり自信ありません


OKと見せかけて余分な情報をつけてしまったパターンです。

この段階で例外処理が必要になります。


ある程度までは吸収すべきですが、

キリがないので入力制限で対処したほうがいいという参考例です。



4. 規定フォーマット

CSVXMLJSON


これはそのまんま、データの形式が決まっていて

それが保証されてると期待できるものです。


元が実質テキストファイルの関係上、

チェックするプログラムはあったほうがいいです。



5. ini、Config 形式

社員情報:

    氏名 = なずな

    住所 = 仙台

    スキル = VBA Linux


3番目とちょっと似てますが、

Linuxのconfやiniでよく見る形式というやつです。


イメージとしては独自ではありますが、

プログラマ側がこうすると決めて作ったものです。


3番目は普通の人が見やすいように作ったらそうなった

というものになります。


これを改行くぎりで動的に処理する問題が

Paizaでは多めな印象。


ちゃきちゃき書けると仕事は楽になります。



いじょーです!

スクレイピングまでがんばるVBA講座~3.プログラムの基礎機能②

f:id:nazuna_0124:20170510210426p:plain

パソコン作業のだいたいのもんはVBAでなんとかなる(断言


よくわからないけど急に強気になってみたり。

すっかり秋風で気持ちいいいですね。



おつかれさまです。なずなです。



講座3回目っと。ざっくり書いてべた張りなので、

正直あんまり見返してません←


何かあったらツイッターで!



3.プログラムの基礎機能②

前回のクリップボードへコピーはよく使います。
これだけでもちょっとした改善が可能なくらいです。

ここから別のブックのセルをコピーするには?なんて試してみるといいです。

今回ももうちょっと基礎機能です。

・自作関数
・デバッグ


この2つになります。

自作関数

あらかじめ用意された関数があるなら自分で作ることもできるということ。

Sub myFuncTest()

    Debug.Print TimeDisp()

End Sub


Function TimeDisp()
    Dim str

    str = "今のは時間は" & Format(Now(), "hh:mm:ss") & "です。"


    TimeDisp = str


End Function


書き方の説明だけなので使いどころがまだまだ地味ですが仕方ないです。

SubではなくFunctionに変わっています。
そして最後に TimeDisp = str と自分の関数名に変数を代入してます。

これが返り値になります。

もちろん自作関数に引数を渡します。

ほかの言語ではReturnでいけるのですが、VBAはちょっと面倒ですね。

デバッグ

デバッグ機能の使い方です。
行数が長くなると、1行ずつゆっくり実行して
変数の中身を確認したくなります。

まず下記をコピペ。ついでに計算のための記号を覚えてください。

Sub calcSample()
    Dim re

    re = re + 1

    re = re * 2

    re = re / 2

    re = re Mod 2

    Debug.Print re

End Sub

まず3行目の re = re * 1 ウィンドウ左側の枠のあたりをクリックします。
○が行全体が茶色に変わります。

ここでF5を押します。

一気に○の行までは実行されてとまります。
とはF8キーを押すたびに1行ずつ進みます。
(最初から1行ずつ実行したいならすぐにF8でオッケー)

そして、途中の間に画面の右下ローカルウィンドウを見ます。
ここに変数と中身が表示されます。

マウスカーソルを対象変数に合わせても同様です。


長いプログラムをかくと意図しない出力結果になることがよくあります。

この方法でどこでどう変わったかを確認します。



次にオブジェクトを格納した場合を見ます。

デバッグ(オブジェクト)

Sub debugObject()
    Dim rng As Range


    Set rng = Worksheets(1).Range("A1")

    rng = Worksheets(1).Range("A1").Value

    rng.Interior.Color = vbBlue



End Sub

同じようにF8キーで進めてください。
オブジェクトを変数に入れるときは Set が必要です。
(必要ない言語が多い)

ローカルウィンドウを見ると、rngのところが+になっています。
クリックすると展開されて中身が見られます。

ほかにも方法がありますが、ここでどんなプロパティを持つのか
調べることができます。

進めるとvalueの値が変わっていることなんかを確認してください。

デバッグは少なくとも存在は覚えておいてください。


少し複雑なプログラムになってくると、

エラーは出ないけど期待する結果にならない

ことがよくあります。


そういう調査に使うものです。


ではでは次回へと続く!

順番待ちにイライラしない

f:id:nazuna_0124:20180609224553p:plain

列に並んででも人気店に食べにいくほうですか?

わたしは気が向いたときに、すぐ食べられるほうが嬉しいので

チェーン店が大好きです。



おつかれさまです。なずなです。



さて、すっかり腑抜けになってる今日この頃ですが、

割と放置目の新入社員を横目で眺めつつ

今後の展開などを検討中。



遠目で見てびっくりすくらいの放置ぷりですが、

彼らもそのうち仕事が割り振られていくでしょう。


放置期間に特にスキルアップしたわけでもないのに。



停滞とか時間がもったいないと思うとイライラしちゃいます。

順番待ちならしょうがない

今はそういう時期というやつですね。



んで、わたしもSlerとしては一次受けとか比較的

上の階層の仕事を受ける会社に入った以上、

管理職の順番待ちで良い気がしてます。


スキルなんて勝手に伸びますし。



もう1つはプロジェクトマネージャー系ですが、

こっちはうかつにスキルを上げると

炎上案件の火消しを任せるので、

出来ないことにするほうが人生楽だと思われます。



あとはIT会社のマネジメントなんてなにもやってないのが

デフォルトなので、事前勉強もとくに必要なしっと。



しばらく、のんびりした日々が続きそうです。


引き続き時間ありますので、

職業訓練VBAの相談したい人は

お気軽にDMください!

自動食洗機は買ってはいけない

f:id:nazuna_0124:20170406201732p:plain

人によります!(結論)

本日は土曜日なので講座をお休みしてみます。



おつかれさまです。なずなです。



さてさて、自動で食器洗ってくれる機械は買わないほうがいい

というお話。



理由は2つ。


1つは誰でも、自分がよほど疲れてても可能で

成果が目に見える非常に小さなタスクだということです。


自律神経整えるのにいいって本にも書いてました。



落ち着いてゆっくりお皿をゴシゴシする。


水でさーーーーっっと流す。


ゆっくり丁寧にやります。

不思議と落ち着くんですよ。



2つ目は食器を洗うのがイヤだと感じている

状況そのものを何とかしたほうがいいからです。


皿洗うのもいやって大抵、やらされてる気がしている

何もできないくらい疲れてるかのどっちかです。



15分もかからない皿洗いが仮に機械で

0になったところでほとんど解決しません


しかも0になるわけではない



というわけで買わないほうがいいよ!


あ、でも誰でも自分のこと助けてくれないから

せめて自分は自分を助けようってことで

自分に買ってあげるなら、いいとおもいます!

スクレイピングまでがんばるVBA講座~その2. プログラムの基礎機能①

f:id:nazuna_0124:20180609224553p:plain

新入社員放置は転職防止のための戦略なのかもしれない


たまにそんな気がしてます。


なにもしなければよいので、

案外悪くないのかもしれません。



おつかれさまです。なずなです。


講座の続き。

最初のところを細かくやってくれるところは

いっぱいあるので、このへんはざっくりと。



プログラムの基本的な考え方はコンピューターに対する命令書です。
命令書をかくにあたって、プログラムを書く人が楽になるように
仕組みや機能があります。

この機能や仕組みは言語によって違います。

ここでは3つの説明です。
    ・オブジェクト
    ・標準関数
    ・サブプロシージャ
        (プロシージャへの引数わたし)

オブジェクトとオブジェクトの指定

知ってる人はしってるのでさらっと。



Range("A1")の部分がオブジェクトです。

まず実はここで行っているのは文字列の代入ですので
Range("A1").Value が省略されてたりします。

最初は面倒で省略したくなりますが、書いておいたほうが無難。

次にシートの省略です。

Worksheets("Sheet1").Range("A1").Value 

こうなります。こう書き換えてもオッケーです。

Worksheets(1).Range("A1").Value 

一つ目は名前で指定。2つ目はインデックス番号で指定です。
どちらも使います。

また、英語でなんとなくわかりますが単語にSの複数形がついて
("")で指定するという形式になります。


### プロパティ

属性って言い方をします。
オブジェクトにはそれぞれ属性がついていて、セルA1に入力されている文字列って
意味合いになってます。

わかりやすいのが背景色で

Worksheets(1).Range("A1").Interior.Color = RGB(255, 0, 0)   

これで真っ赤になります。


### メソッド
そのオブジェクトに備わった処理を実行させるもの。
どっちも「.」ドットなので区別は付きにくいです。

エアコンでもテレビでもリモコンには「電源ON」て書いてあるかと思います。
でもテレビのリモコンでエアコンが付いたりはしない。そういうかんじ。


Range("A1").Clear

をやってみましょう。

標準関数

関数って表現が最初は嫌いでした!
何かが返ってくると思っておきましょう。
組み込み関数なんていわれ方もするかも。

各言語によって名前や返り方が違います。


debug.print Now() 

とりあえずはこれです。

ついでに文字列の連結を覚えておくことに。

debug.print "hello" & " " & Now()

F5キー押すたびに秒まで変わってるのがわかります。
ついでに覚える日付表示。

YYYY年MM月DD日で表示したい!

    Debug.Print Format(Now, "YYYY年MM月DD日")

この手のは丸暗記しかありません。

サブプロシージャ

ついでにさらっと簡単な変数もやっちゃいます。
下記をコピペで使ってください。


Sub CopyClip()
    Dim str

    str = "Test" & " " & Now()

    Dim db As New DataObject

    db.SetText str
    db.PutInClipboard

End Sub


ここでエラー出た人!
下記の手順を行ってください。

    挿入 > 標準フォーム

    画面の左上に1個増えましたが気にしなくてオッケー。


実行できた人はどこかでCtrl + V (要するに貼り付け)


クリップボードにstrの中身がコピペされています。

これがコピペをわけもわからず使うということです!
最初は「こういうもんだ」と割り切って使いましょう。

把握するべきは、strの中身がクリップボードに格納されるということです。

これをもうちょっと使いやすくする方法が以下。


Sub CopySample()
    Dim str

    str = "いまなんじ? "

    Call CopyClip(str)

    'こっちでもオッケー
    'CopyClip str

End Sub


Sub CopyClip(str)
    str = str & " " & Now()

    Dim db As New DataObject

    db.SetText str
    db.PutInClipboard

End Sub


こうやって変数をわたして処理を切り分けることができます。


[補足]
    ・VBAは省略するとデフォルトで参照渡しです。値渡しのときは Byval をつけます。
    ・省略をしてもよい引き数は Optional をつけます。記載移行のすべての引数がそうなるので注意。


これらを利用して
    Range("A1")をコピーするボタンAと
    Range("B2")をコピーするボタンBを作ってみてください!



プロシージャへのジャンプ機能があります。
プロシージャ内のプロシージャ名(ここではCall CopiClip(str)) にカーソル合わせて
shift + 2 です。