文系男子でもVBAでカウンターが作れる!使わないかもしれないけど!
うちの職場では復旧したデータをUSBメモリに入れてお客さんに渡したりするんだけど、たまにUSBメモリの在庫が合わなくなることがあるんだよね。
毎回なんでなん?ってなるわけさ。
あとお客さんの数も数える必要があるんだけど、受注があれば伝票を作るけど
そうでないお客さんは伝票を作らないのであとで思い出しながら来店者数を数えるわけ。
特に正確な数字を出す必要はないって言われているけれど、
僕としてはちょっとモヤモヤするのでExcelでカウンターを作ることにしたのだ。
前の職場でほんの少しさわったことがあったので今回もググりながらやってみました。
どんなものを作ったのか!
お見せしましょう。
VBAとマクロの関係
マクロって聞いたことあります?
Excelで行った操作を記録してくれる機能なんですけど、これって便利ですよね。
僕が最初に学んだのはマクロでした。
マクロの記録ボタンを押して、B1の文字を赤くし、マクロを停止する。
アクションボタンでもオートシェイプでもいいのでボタンを作りそのボタンにマクロを登録する。
そうすると次回はボタン一つで文字を赤く変更することができます。
上記の説明だとゴミみてぇなことやってんなって思うでしょうけど、もっと複雑な操作を記録することもできちゃいます。
例えば関数を使った作業もマクロで記録できます。
ただそれらを繰り返し行うためにはVBAを使う必要があるんです。
VBAというのはプログラミング言語です。
つまりVBAというプログラミング言語を使いマクロを作るってことになります。
って、書いてて思ったんですけどそんなこと知ってますよね。
実際につくったもの
こんな感じです。
まず定義として、使った在庫の数を数えられること
そしていつ使ったのかログを残すこと。
これだけは最低限必要かなと思い作りました。
作り方
最初にカウントする方法です。
Sub count () Range("B10").Value = Range("B10").Value + 1 End Sub
マクロの名前をcountにしました。
内容としてはB10の値はB10に+1したものを表示させるって意味です。
今回は適当にフォームボタンを作りマクロを登録しました。
ボタンの上で右クリックしてマクロの登録でOKです。
失敗例
次がてこずった部分なんですけど、ボタンを押した時刻を表示させたいというところです。
時刻を表示させたいだけなら
sub test() range(f10").value = now end sub
のようにNOWを使えばいいんですけど、ボタンを押すごとに1列下に移動して時刻を表示させたいんです。
最初に考えたのは、F10にnowで時刻を表示させてそのあとにoffsetで一つ下に移動する方法です。
Sub count () Range("B10").Value = Range("B10").Value + 1 range("f10).value=now activecell.offset(1,0).select End Sub
2行目はF10に現在の時刻を表示という内容です。
3行目のactivecellは現在選択中のセルのこと、offset(1,0).selectは1行下に移動するって内容です。
ただこれだとB10に1が表示されF10に時刻が表示されますけど、2回ボタンを押すと
セルがB11に移動するだけで思ってたのとは違う結果に。
B10に数を表示させる→F10に時刻を表示させる
って順なのでActiveCellはF10になるんだと思ったんですけどどうやらB10がActiveCellになるようです。
成功例
じゃどうしたのかというとF10をB10の値だけ下に下げればいいんだと思いつきました。
Sub count() Range("b10").Value = Range("b10").Value + 1 Range("f9").Offset(Range("B10"), 0) = Now End Sub
なんで2行目がF10じゃなくてF9なのかというと、
マクロを実行した時点でB10に1が入力さるのでそうするとF10のひとつ下のF11に時刻が表示されてしまうからです。
なので最初から一つ上のF9にしました。
これでカウントした時間をログとして残せます。
ClearContensでリセットする
カウントした後はリセットする必要もあるのでリセットボタンもつくりました。
Sub clear() Range("b10:d17").ClearContents Range("f:f").ClearContents End Sub
Clearにするとセルの結合やらフォントサイズなど書式もリセットされてしまいます。
書式はそのままで値だけ消したい場合はClearContentsを使います。
一つ前に戻るボタンをつくる
カウントボタンを押してもたまに処理速度が遅くて反応されないことがあります。
あれ押せてなかったかなと思って2回くらい押すとタタタンッ!って連続でカウントされてしまうので
そんなときようにReturnボタンも作りました。
ボタン作らず入力し直すんでもいいんですけどね。
Sub 戻る() Range("b10").Value = Range("b10").Value - 1 Range("f9").Offset(Range("b10") + 1, 0).ClearContents End Sub
カウントボタンの反対をするだけなので簡単ですね。
1行目はB10の値からから-1しますって内容です。
2行目はログの訂正なんですが、F9からB10の値+1のセルを削除って意味です。
そうすると最初の画像のような感じになります。
あとはボタンの色を変えたり、フォント変えたりタイトルつけたりして飾れば完成です!
まとめ
考えてるときって楽しいですよね。
どうやればこうできるんだろうって考えるときと、実際成功したときは楽しいです。
僕は何に対しても特別詳しいわけではないので本当に基本的なことしかできてないんですけど、
もっと詳しくなったらなにができるんですかね。
ただ多少できるようになると飽きちゃうのが僕の欠点です。
何事も広く浅く、そうなってしまったんですよ。
まあとりあえず今後ももしかすると仕事で使うかもしれないので
なにか楽しいことがあれば書きたいと思います。
じゃあな!
あれ今まで締めにじゃあななんて言ってたっけか