派遣事務員の迷走

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

派遣事務 特殊スキルは評価されにくい

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

特殊スキル

先日、会社でお客様から生のマンゴーを頂いた。

大きなアップルマンゴー17個
コロ子の部署:30数人

上司から、「コロ子、お昼休みにみんなに切ってくれる?」

ええーっ!どうやって!?

普通マンゴーって縦に3っつに切って、両側の2つに切り込みを入れてスプーンですくって食べると思うけど、スプーンないよ?
皮むくの?ムリムリムリ!!!
そんな事したらぐちゃぐちゃの大惨事が目に見えてる。
そんな大変な事絶対無理。それに面倒くさ過ぎる。

「ちょ、ちょっと難しいので、くじ引きをやって当たった人がもらって、家で食べてもらうのはどうですか?」

ということで、あみだくじを作ってみんなでマンゴー争奪戦を行った。

ところが、アレルギーがある、とか、一人暮らしだから家で食べるの面倒くさい、とか辞退する人が出て結局3個余った。

残り3個どうしよう。敗者復活戦?と思ったところ
超お料理上手のおばさんが、
「残りの3個切ってあげるから、当たらなかった人に食べてもらいましょう。」
と言ってマンゴーを切ってくれた。

早い、きれい、均等!

コロ子出る幕なし!

これってすごいスキル。
世間のみんな(特に男性)、おばさんだから当たり前とか思わないで!
これは特殊スキルなんだから!
(コロ子もおばさんだけど、できないからね)

コロ子:「面倒なのにすみません、大変じゃなかったですか?」

おばさん:「ぜーんぜん、こんなの面倒でもなんでもないわよ。」

さすが~!!

おばさんからしたらこんなの朝飯前なのね。
そっかぁ、得意なことは面倒とか大変とか感じないんだ。

くじで当たった人はマンゴー貰えたし、当たらなかった人はその場で食べれて、なんかみんなハッピーだった。
敗者復活戦をやったら、当たらなかった人は2回がっかりしなくちゃいけないところだったから、おばさんの提案、素晴らしい。
みんなをハッピーにできる力と、包丁スキル、これって凄いことなのに、本人も周りも当たり前と思って、特殊スキルとみなしていないんだろうな。

名前のない特殊スキルって、分かりにくいせいか評価されにくい。

みんなもっと敬いなさい!

ところで、コロ子の得意な事ってなんだろう。

仕事で荷物運ぶの好き。(同僚はすごく面倒に感じているらしい)
でも、やっぱりVBAが得意」と言いたい。
さっきは紙に書いて作った「あみだくじ」をエクセルVBAで作成してみよう。
(面倒でも大変でもないはず!)

つづく。

【次の記事】
VBAで「あみだくじ」を作ろう。 - 派遣事務員の迷走

サーバー名が変更になっていた 解決法(FileSystemObject + VBProjectプロパティ)

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

前回、サーバーの名前が変わって困った!の記事を書いたら、たくさんの方からいろいろな素晴らしいらしいアイディアを頂きました。どうもありがとうございます。
どれも自力で絶対たどり着けないものばかり。
みんな天才過ぎ!!!

目次

FileSystemObjectオブジェクトで現在のサーバー名(ドライブ名)を取得する

まずは、yuricks7さんより頂いたアイディアでFSO(FileSystemObjectオブジェクト)を使って現在のサーバー名(ドライブ名)を取得する。
ドライブ名が取得できるGetDriveNameメソッドを発見!

新しいモジュールを作成する

新しいジュールを追加し、名前を「サーバーの名前」にする。

f:id:SNegishi:20190705063356p:plain

Function関数を作成する

「サーバーの名前」モジュールにサーバーの名前を返すFunction関数を作成する。
コードはこんな感じ。

Function ServerName()

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

Dim buf As String
buf = FSO.GetDriveName(ThisWorkbook.Path)

Set FSO = Nothing

ServerName = buf

End Function

FileSystemオブジェクト.GetDriveName(パス名)
ドライブ名が取得できる。

あとは古いサーバー名をベタ打ちしているところをServerNameに置換する。

"古いサーバー名\●●●\●●●●\●●●"

    ↓

ServerName & "\●●●\●●●●\●●●"

f:id:SNegishi:20190705220938j:plain

モジュールごとに置換すれば漏れなく変更できる。
これなら今後サーバー名が変更になってもそのまま使える。
Great!!


VBProjectプロパティでマクロでマクロを操作できる。(VBAでVBEを操作する)


では、この「サーバーの名前」モジュールをどうやって既存のファイルに入れてい行くかが問題。
・マクロ入りファイルを開く。
・モジュールを追加する。
・モジュールごとにパスのサーバー名を置換する。

という作業を手で行うとなると結構大変。既存のファイル全部で何個あるのー!?


そこで、@すでぃさんより外部モジュールを教えて頂いたのでこれを使用して上記の工程をVBAでやってみよう!

外部モジュールを作成する。

まずは、開発タブのセキュリティより「VBAのプロジェクトオブジェクトモデルへのアクセスを信頼する」にチェックを入れる。
f:id:SNegishi:20190705223732p:plain
f:id:SNegishi:20190705223634p:plain


別途、VBE操作用のマクロ入りファイルを用意する。
そこに先ほどの「サーバーの名前」モジュールを作成する。
「サーバーの名前」モジュールを右クリックし、ファイルのエクスポートを選択するとサーバーの名前.basが作成される。(.basは標準モジュールの拡張子)


f:id:SNegishi:20190705224220p:plain


この作業をマクロを使ってやってみる。

モジュールを操作するには
Workbook.VBProject.VBComponent オブジェクト
を使用する。

モジュールをエクスポートする

VBComponent オブジェクト. Export ファイル名.bas(パス含む)
ファイル名.basファイルが作成される。

同様にインポートもできる

モジュールをインポートする

VBComponent オブジェクト. Import ファイル名.bas(パス含む)


モジュール内のコードを変更する

モジュールに対する操作は、行を追加したり、削除したり、行ごとになるらしい。
モジュールの中身を直接置換する事はできないみたいなので、モジュールの中身を取り出して置換する。

①モジュール内の行数を調べる

VBComponent オブジェクト. CodeModule.CountOfLines
行数が戻る(数値型)

②モジュール内のコードを取得(開始行から指定行数分)

VBComponent オブジェクト .CodeModule.Lines(開始行, 指定行数)
文字列が戻る

③モジュールの指定行を削除する(開始行から指定行数分)

VBComponent オブジェクト .CodeModule.DeleteLines 開始行, 指定行数

④モジュール内にコードを追加する

VBComponent オブジェクト .CodeModule.AddFromString 文字列


コードを書いてみる

では、上記のことを踏まえてコードを書いてみる。

f:id:SNegishi:20190706135349p:plain

Sub MacroChangeProcess()

Dim WorkbookName As String

Application.ScreenUpdating = False

'サーバーの名前.basを作成する
ThisWorkbook.VBProject.VBComponents("サーバーの名前").Export _
ThisWorkbook.Path & "\サーバーの名前.bas"

'同じフォルダ内の全ての.xlsmファイルが対象
WorkbookName = Dir(ThisWorkbook.Path & "\*.xlsm")

Do Until WorkbookName = ""
    
    If WorkbookName <> ThisWorkbook.Name Then
    
        Workbooks.Open ThisWorkbook.Path & "\" & WorkbookName
        
        'サーバー名を置換し、「サーバーの名前」モジュールを追加する
        Call Replace_and_Add(WorkbookName)
        
        Workbooks(WorkbookName).Close SaveChanges:=True
        
    End If
    
    WorkbookName = Dir()

Loop

'サーバーの名前.basを削除する
Kill ThisWorkbook.Path & "\サーバーの名前.bas"

Application.ScreenUpdating = True

End Sub
Sub Replace_and_Add(WorkbookName As String)

Dim Mdl As Variant

 '全てのモジュールに対して処理を行う 
    For Each Mdl In Workbooks(WorkbookName).VBProject.VBComponents
    
      If Mdl.Name = "サーバーの名前" Then 'すでにあったら削除する
    
        Workbooks(WorkbookName).VBProject.VBComponents.Remove Mdl
         
      Else 'サーバー名を置換する
      
      With Workbooks(WorkbookName).VBProject.VBComponents(Mdl.Name)
      
        'モジュール内の行数を取得
        Dim cnt As Long
        cnt = .CodeModule.CountOfLines
    
        'モジュールの1行目からcnt行までの内容を取得
        Dim Contents As String
        Contents = .CodeModule.Lines(1, cnt)
    
        'サーバー名を置換する
        Contents = Replace(Contents, """古いサーバー名", "ServerName & """)

        'モジュールの1行目からcnt行までを削除
        .CodeModule.DeleteLines 1, cnt
    
        'モジュールに置換した内容を入れる
        .CodeModule.AddFromString Contents
        
        End With
    
      End If
    
    Next Mdl
    
    'サーバーの名前モジュールをインポートする
    Workbooks(WorkbookName).VBProject.VBComponents.Import _
    ThisWorkbook.Path & "\サーバーの名前.bas"

End Sub

できた!

同一フォルダ内の全ての.xlsmファイルに対して処理を行う。
手で一つづつポチポチ作業するより格段に速い。というか爆速。
難点は対象のフォルダにいちいちこのマクロ入りファイルをコピーして実行しなくてはいけない。
理想は作業フォルダの一番上の階層にこのファイルを置いて、配下のフォルダ全部に対して処理を行うようにしたいけど難しそう。再帰処理みないのを使うのかな?


【お詫び】
このようなコードを作成しましたが、外部モジュールについて知らなかったため調べるのに時間がかかり、急ぎのため手で変更しました。
変更処理が終わって落ち着いてから作成しました。
作成するのにかなり時間がかかりました。サクサク作れるようになりたいです。

ありがとうございます!

いろいろな方から貴重なアドバイスを頂いたので、無くなってしまわないように記しておきます。

yuricks7さんより
f:id:SNegishi:20190704225445p:plain
素晴らしい!!


IPアドレスで指定できるんだ!知らなかった。
ファイル選択ダイアログならサーバーどころかフォルダ構造が変更になってもOK!


外部モジュール、初めて知りました。これ凄いです!!
読み込む外部モジュールのパスどうやって変更するかに悩んだので、今回はモジュールを操作する処理にしました。


こういうの大切!


あるあるですね・・・
同様のトラブルがよくあるので、私はシート上にパス設定テーブルを置いています。
www.excel-chunchun.com

相対パス絶対パス変換も。
www.excel-chunchun.com

やっぱりこういうの大切!

設定シート派多数。
やっぱり大切と実感。

やっぱり!サーバー名は変更しちゃダメなんだ!
サーバー関係は詳しくないけど、今度知った顔して言ってみよう。

そもそもの問題はサーバーの名前が変更になった事だ!

大正解!!思わず笑った。

本当にありがとうございました。

悲報 サーバー名が変更になっていた。

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

サーバー名変更

今日会社に行ったらサーバーが変更になっていた。
今までのサーバーの容量がいっぱいになったから土日でサーバーの入れ替えをしたらしい。そして、サーバーの変更に伴い、サーバの名前も変更になっていた。

コロ子の会社では、データーの個人持ちは禁止されているので、全てのデーターはサーバー上に保存されている。なのでみんなデスクトップ上に貼ってあるショートカットなどの参照先を変更しなくてはいけないことに、面倒くさいとか文句ブーブー。

でも、そんなの大して面倒でも何でもなくて、本当に面倒なのはマクロ。

全てのファイルがサーバー上にあるから、マクロ上でファイル開いたり、どこかに保存したり、パスを指定する時は先頭にサーバー名が入っている。

ひえ~!!

あっちのExcel開いて、こっちに保存して、ExcelからAccessAccessからWord、あっちこっちでパス名ベタ打ち。どーしよー。
そして、そのマクロの入ったファイルをコピーして使ったりしてるから日々増殖してる。

とりあえず重要度の高いもの(主に自分が使うもの)から一つづつ手直し。

今後また変わるかも知れなから(今までもサーバー変更した事あったけど、名前は変わらなかった気がする)標準モジュールの一つに(一番上に位置しているものにしてみた)定数として記載してみた。

Public Const SERVER_NAME As String = "サーバー名"

後はベタ打ち個所をSERVER_NAMEに置換する。そうすれば今後変更になった時は”サーバー名”のところ1か所だけ変更すれば済む。

たった1行追加して置換するだけの作業だけど、ファイルごとにするのはけっこう大変。変なマクロ量産したツケは痛い。

本当はどうするのが正解?

今後の対策をしてみたつもりだけど、これじゃ結局パスが書かれたマクロの入ったファイルをまた全て開いて”サーバー名”を変更しなくちゃいけない。しかも定数がどのモジュールに書かれたか分からなくなって探す羽目になりそう。(並び順が一番上にしてみたけど、忘れそう)
いったい、こういう場合はどうすればいいのだろう?

ノンプロ研 定例会に参加してきました!

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

ノンプロ研定例会

先日、ノンプロ研の定例会に参加してきました。
今回のテーマは「ノンプログラマーのためのAPIとその活用」。
今回はゲストに会計ソフトのFreeeとチャットソフトのChatworkの方が来て説明をしてくださいました。
ノンプロ研のゲストはいつも本当に豪華。

APIとは

最近よく聞くAPI。いったい何の事なのか。
Application Programming Interface 】の事で、どうやらソフトウエアやアプリケーションをプログラムで繋げて、そのソフトやアプリの情報をプログラム上で使えるようになる機能、らしい。

FreeeとChatworkではユーザーにとって価値のあるサービスを提供するために、APIに力を入れている、ということでした。

凄い!そんな事ができるなんて全然知らなかった。
世の中コロ子が思っている以上に進んでいる。

コロ子LTをした

実は今回、この2人の素晴らしいプレゼンテーションの後にLTをしました。
LTとは:ライトニングトークス(Lightning Talks)の略で短いプレゼンテーションのこと

めちゃくちゃ緊張した。
ゲストも来てて「よりによって何でこんな日にー!」って猛烈に後悔したわよ!
かなり痛い、ドン引き必須の内容にもかかわらず、みんな上手にツッコミを入れてくれて、痛いところを笑いに変えてもらえて、本当にみんなに助けられた。
派犬で働いていると、なかなか人前で発表したり、自分の意見を言う場所がないので、こういう場所は本当に勉強になる。
何を発表したかというと、ブログを始めた事により発信の恐怖心が薄れた事と、読んでくださっている方への感謝の気持ちと、後は痛い内容なのでここではちょっと・・・。

懇親会にて

定例会後の懇親会でゲストの方が、学生時代からクラウドしか使ってなくて、パソコンのフォルダに保存とかしたことない、的な事を言っていた。

コロ子の会社ではExcel, WordなどのMicrosoft Officeクラウド版でないもの)しか使えない。メールももちろんOutlookのみ。クラウドはもちろん、会社のパソコンに許可なく何かをダウンロードする事も禁止されている。
よって与えられた環境以外は使った事がない。

するとゲストの方が、「うちではクラウドが使えないと仕事にならないから、アルバイトの人も派遣の人もみんな使えます。使えない人は雇ってません」と。

なんと!!!

コロ子の勤めているような古い会社の中にいると気が付かなかったけど、世の中はもうそうなっていたのね!
今の会社辞めたら次はもう雇ってくれるところ無いかも知れない。
実は今期、強気に無期雇用契約しなかったけど一歩間違ったら大変な事になった可能性あるじゃない。危なかったー。この話聞けて良かったー。

会社では無理だけど、個人的にクラウド使っていくことにしよう。
ノンプロ研に入るまではGoogle Appsの存在すら知らなかった。
Google AppsにはGoogleスプレットシート(Excelのようなもの)、Googleドキュメント(Wordのようなもの)、Googleスライド(パワーポイントのようなもの)、などなど無料で使えるものが揃っている。
自分のパソコンにはMicrosoft Officeのパッケージ版を購入して入れいたけど(Accessが入っているバージョンは高い!)、Google Apps無料だから、こっちを積極的に使って行こう。
これを機にGAS始めます!(GAS:VBAGoogle Apps版)

今回のテーマのAPIも使えるようになりたい!
副業とかで稼ぐことができたらFreee使う機会あるのかな。

コードの上手さ VS 仕様 (有給を取ろう)

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

年5日の年次有給休暇

今年4月から年5日は有給を取らなくちゃいけないんだってね。

使用者は、労働者ごとに、年次有給休暇を付与した日(基準日)から1年以内
に5日について、取得時季を指定して年次有給休暇を取得させなければなりま
せん。(厚生労働省ホームページより。)

しかし「取得時季を指定して年次有給休暇を取得」のところが意味不明。
今から1年分の有給をいつ取るか決めるの?

こんなことわざわざ義務化されなくてもコロ子は派犬の特犬を生かして、余裕で取ってるのに。

とにかく、今月中に今年の有給取得日を決めて提出しなくちゃいけないんだって!

お友達のネギ子と旅行に行く約束をしてるけど、彼女も派遣事務員でビンボー暇なし、優柔不断で安値にこだわるから今から決められない。

後から変更も可能らしいから、まぁいいや。適当に書いておこう。
さらに5日よりも多く申請しちゃえ。

会社から配布されたエクセルシート

会社から有給取得日を入力するエクセルシートが配布された。

こんな感じの。
f:id:SNegishi:20190613214229p:plain

めっちゃ使いにくい!

何が使いにくかというと

①土日祝日を除く処理が入っていない。
開始日と終了日を入力するので連休で取る時は便利、と思いつつ土日祝日も有給にカウントされてしまう。
土日祝日を含む場合は分けて入力しなくてはいけない。

②一日だけの場合の場合は開始日と終了日に同じ日にちを入力する。

③半休の場合は半休の列に1を入力する。
0.5と入力してる人多数。

④全休の場合は半休の列に0を入力する。
半休の列に0を入力すると全休の列に1が
半休の列に1を入力すると全休の列に0が
入る関数が全休の列に入っている。
関数無視して全休の列に1を入力してる人多数。

⑤入力の仕方の説明書が付いていて読まないと入力できない。

さらに
全休、合計のセルにめっちゃ複雑な関数が入っている。

たった5日、最大でも40日の有給申請ならこんな感じで良くない?

f:id:SNegishi:20190613215320p:plain


【入力例】
f:id:SNegishi:20190613220455p:plain



会社配布のシートに「読み込みボタン」が付いていてエクセルで作ったカレンダーに反映できる。

しかし、予定を変更・追加して再度読み込みすると前のデータが残ったまま追加される。カレンダーぐちゃぐちゃ。

いったいどんな仕様なの!!!!

コードを見てみる

いったいどうなってるの?と思いコードを見てみると、
すごく技ありのコードが書かれている。
1行に開始日と終了日を入力するようになっているから
データを日付分ループしながら配列に入れるという複雑な処理を行っている。
誰が作ったんだろう?情シスの人かな。
さすがプロ!と感心するくらい上手いコードで可読性が高い。

きっとプロだからこれくらいちゃちゃっと簡単に書けるんだろうけど、1つのセルに1つの日付しか入っていなかったら配列いらなくない?
最初のエクセルシートが悪いせいでコードが複雑になっている。
それに、変更・追加の処理が入っていない。

どうやら有給取得日を申請して上司が承認したらそれで確定ということで
後からの変更・追加はできない仕様になっているらしい。

それって使えなくない?

上司に言って、変更・追加ができるように手直しをした。
コロ子の下手くそなコードを追加して、でたらめ感満載のひどいコードになったけど使い勝手は良くなった。

コードの上手さ VS 仕様

いつも思うけど、業務で使うマクロは、その業務を熟知している人が作ればコードがでたらめでも「超使える」ものになる。すなわちコード下手でも仕様が良い。
コードがいくら上手くても仕様が悪いと、「なんか使えない」ものになる。
「すごい!でも使いにくい」と「ダサい!でも使いやすい」はたまに遭遇する。
上手くなりすぎると、自慢の技に走り過ぎちゃうのかな。

コードの上手さも大切だけど、重要なのは仕様だと思う。

コードの書き方はネットや本などで勉強できるけど、仕様の部分はどうやって勉強したらいいのだろう。
業務愛と熟知度なのかな・・・。

そんなことより有給!どこいこうかな。

派遣事務 メール転送してください。

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

f:id:SNegishi:20190523222352j:plain

メールをプリントした紙を渡される

仕事を頼まれるときに、メールをプリントした紙を渡されることがよくある。
「この内容で○○書類を作ってください」と。
メールを転送してくれれば、そのメールの内容でコピペできるところがいっぱいあるのに。プリントした紙を見ながらタイプして、間違っていないかダブルチェックするという無駄をわりとフツーにやっている。

コピーできるところが社名や担当者名だけだとしても、手でタイプしたら間違える可能性があるあるし、間違えるとかなりマズいところだし。

コピーできるところが多いときはメールを転送してくれるようにお願いするけど、
毎回言わないと転送してくれないので、コピーできるところが少ないときは仕方なくタイプする。

先日、かなりボリュームのある内容だったので、メール転送のお願いをしたら、
「メール転送しました。それと別件なんだけど、これについて調べてくれますか?」
といいながらプリントした紙を持ってきた。

なんと、英文メールをプリントした紙!

メールに添付されていたPDFの書類とかではなくメール本文をプリントした紙!
ついでに転送してくれればいいのにー!
もしかしてGoogle翻訳の存在を知らないとか!?

たいていの日本人(犬)は英語苦手だと思うんだけど!(コロ子だけ?)
外資系とか、社内公用語が英語とか、英語大好きな人は別として。

「このメールも転送してもらえますか?」と言いかけて
「もしかしたら、ここで英語が苦手だと思われるのは派犬として良くないのか?
たまにその人に代わって英文メールの代筆をしているから(もちろんGoogle翻訳頼り)コロ子は英語ができると思われているのか?もしそうなら、わざわざ英語ができないと思われる事をする必要があるのか?」
という思いがよぎって言い留まった。

Google翻訳なら瞬殺なのに!と腹立だしく思いながら、分からない単語をいちいち調べて、意味の分からないところは想像力でカバーして、なんとか本題の仕事までたどり着いた。そこからは通常通り。

ぶっちゃけ、かかった時間の半分は英文の読解。

メール転送しない方も気が利かないし、転送してと言えないコロ子も見栄っ張りだし、どっちもどっちだけど、本当に無駄。

なんでメール転送してくれないんだろう?

メール返信のお仕事

宛先やCCにたくさんの人が入っていて、全員に返信するメールをコロ子に頼みたいけど、コロ子はCCに入っていない場合。
そのままコロ子にメールを転送すると、メールを転送してくれた人のアドレスにしか返信できないから、そのメールをコロ子宛てのメールに添付して送ってね。
Outlookの場合)

f:id:SNegishi:20190523220714p:plain

返信したいメールをコロ子宛てのメールに添付する。
ドラッグ&ドロップできる。

f:id:SNegishi:20190523220900p:plain

メールが添付される。

コロ子はその添付メールを開いて全員に返信すれば、コロ子から関係者みんなに返信できる。

Excel 謎現象 別のファイルが一緒に開く(XLSTARTでない)

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

謎現象

職場の人のパソコンでExcelの新規ファイルや、既存のファイルを開くと別のファイル(毎回同じ)が一緒に開くという謎現象が起こった。
一緒に開くファイルを閉じればいいだけで害はないけど謎すぎる。


ネットで調べると
C:¥Users¥ユーザー名¥AppData¥Roaming¥Microsoft¥Excel¥XLSTART

のXLSTARTフォルダー内にファイルがあるとExcel起動時に開くので、そのファイルを削除すればOK、という内容の記事が多くあったので確認してみた。
でもXLSTARTフォルダー内にファイルは、ない・・・。

(XLSTARTフォルダー内にPERSONAL.XLSBがある場合は、PERSONAL.XLSBを開いて、表示タブの「表示しない」を選択すればOK。PERSONAL.XLSBは個人用マクロブックなので削除するとPERSONAL.XLSBに登録してるマクロが使えなくなってしまいます。)

アドインが怪しい

XLSTARTフォルダー内にそれらしいファイルがない場合は次の方法を試してみよう。

ファイルタブ

オプション

f:id:SNegishi:20190521212341p:plain

この辺に該当のファイルがいないか確認してみよう。
ここにあったら、何とかして該当ファイルを削除すればOK!

この現象の再現方法が分からないので詳しいやり方、詳細は不明。