そろそろ中堅エンジニアのIT雑記

プログラミングを仕事にして若干、まだまだ新米エンジニアの雑記です。

【VBA】セルの検索方法

ちょっとエンジニアらしいことを書いてみる。

 

VBAではExcelシート上の文字列を探すことがよくある。たとえば下のシートで、“Name”が“John”セルオブジェクトを取りたいとしよう。

f:id:DAIMOX:20150915213908j:plain

方法はいろいろあると思うが、僕がVBAでよく使う方法は2種類。

1.Findメソッドを使用する。

2.WorksheetFunctionのMatch関数を使用する。

 

1はVBAに標準搭載されているFindメソッドを使用して、直接、対象のセルオブジェクトを取ってくる方法である。

2はExcelのセル関数を使用し、対象のセルが何番目にあるかを取得する方法だ。

 

僕は次のように書く。

f:id:DAIMOX:20150915220648j:plain

細かいことはいろいろあるが、パッと見てわかることはFindを使う方が簡潔に書ける。それはFindメソッドが対象セルオブジェクトを直接取ってこれるからだ。一方Match関数はRangeオブジェクトの何番目に該当セルがあるかというインデックスを取得する。したがって、後からセルの移動を行う必要がある。

 

一見すると、Findを使用した方が良い気がするが、もちろん欠点もある。今回のシートでは“Emi”を探す時だ。Findメソッドはwhatの引数に渡した文字列を検索するが、環境によっては“Emiri”を取ってきてしまう場合がある。これは省略した引数のLookAtがxlPartになっているときだ。LookAtはFindメソッドのxlPart(部分一致)、xlWhole(完全一致)を指定することができるが、省略してもよい。しかし省略したとき、使われる引数は前回使用した引数になる(らしい)。これはかなり重要である。これを避けるためには毎回、引数を指定しないといけないが、正直めんどくさい。この部分だけは部分一致で、こちらの部分は完全一致にしようとすると、別の部分で使っていた引数を指定しなかった部分がどちらの検索をするか不明になる。怖い怖い…。

 

Match関数は3つ目の引数を0にすると完全一致になる。これは絶対に使わなければいけない引数である(ちなみに0以外は1:検査値以下の最大値、-1:検査値以上の最小値)。したがってこちらの方が安心して使うことができる。しかし、上記のとおりこちらは、渡す引数が面倒であり、直接セルオブジェクトを参照できない。

やはりどちらの方法も一長一短である。

 

僕は検索範囲が狭い時や検査値が明らかに1つしか指さないときにFindメソッドを使用して、同じ系列が並んでいる場合(今回のName列)はMatch関数を使用している。

この問題はVBAを使い始めた当初、悩まされた問題だ。これからVBAを使い始める人もきっと同じ問題を抱えると思うので、参考にしてもらえたら幸いである。

 

 

 

後記

新しい関数やメソッドを使用するとき、このようなブログや解説サイトを参考にさせてもらっているが、思っていたよりすごいと感じた。今回取り上げたFindとMatchはVBAを使っている人ならだれでも知っているような簡単なことだが、いざ文章で説明しようと思うと難しい。僕は学生時代の経験から教えることは得意だと思っていたが、改めてその難しさを感じた。読みやすい文章、わかりやすい文章はきっと役に立つので、書くことにも重きをおきたいと思う。

 

 

経験したプログラミング言語

 僕が経験したプログラミング言語を紹介する。以下、経験順

 

Fortran:科学技術計算に向いた手続き型プログラム言語。

 僕が初めて触れたプログラミング言語。大学生のとき、授業で習った。僕は物理系の学科だったので研究で数値計算を必要としたが、理論計算が嫌になり、頭より手を動かす実験系研究室に進む。授業でしか使わなかった。台形計算やモンテカルロ法を用いた積分計算を勉強した記憶があるが、使う機会は未だない…。

LabVIEW:National Instrumentsによって提供されるグラフィカルプログラム言語。主に計測用に用いられる言語。

 実験系の研究室に配属され、先生に覚えてと言われて使い出した。計測機器を動かすプログラムはLabVIEWで制御していた。Fortranでプログラミングが苦手になっていた僕にとってはリハビリになった言語である。レゴブロックのように関数を配置し、線をつないで変数を渡す。しかし複雑な制御を増やせば増やすほど絵が大きくなり、可読性が非常に悪い。特に人の作ったソフトは全然読めなかった(モジュール分割を積極的にやればよかったのだろうけど、みんな専門ではないので動けばよしという考えであった)。

Perl:実用性と多様性を重視しており、C言語sedawkシェルスクリプトなど他のプログラミング言語の優れた機能を取り入れている。ウェブ・アプリケーション、システム管理、テキスト処理などのプログラムを書くのに広く用いられている。

 僕が初めて自主的に使い始めた言語。研究が本格化してきて手作業の解析が辛くなりプログラミングに手を出す。大量のデータを捌くために配列、繰り返し処理、文字列操作などの基本を学んだ。

C:プログラム作成の自由度が高く、拡張が可能であるため、汎用性が高い。パソコンソフトからゲームの作成、機械制御やシステム管理など、あらゆる分野に適用している。

 今の会社の研修で勉強した。初めてちゃんと本で学習した言語である。データの型、ポインタ、ビット処理など基本を多く学んだ。可読性を意識し始めたのもこの言語から。現在は使用しておらず、忘れ気味…。

VBAMicrosoft Officeシリーズに搭載されているプログラミング言語

 なぜ気づかなかったのだろう。学生時代、こんな近くに開発環境があったなんて。Alt+F11押すだけなのに(VBE:Visual Basic Editorが立ち上がります)。業務で使い始めた言語。クラスやらプロシージャやらオブジェクトやらわけがわからなかったが、慣れてくるとExcelシートを自由自在に扱えて使いやすい。オブジェクト指向(特にカプセル化)がわかってきた要因の一つ。今も使うのはもっぱらVBAで、使用歴が一番長い。

 

挙げてみると、いろいろやっているように見えるが、実際に”使える”レベルになっている言語はVBAくらい。JAVAC++RubyPythonなどいろいろ使えるようになって、優秀なエンジニアになりたい。

ブログ始めました

SNSは時代とともにいろいろ触ってきたけど(mixiに始まり、twitterFacebook、etc...)、ブログは初めて書く。

 

きっかけはプログラミングの勉強を自主的に始めたこと。

ソフトウェアエンジニアになってから数年、日々業務に揉まれ、余裕をもって仕事に取り組めるようになった近ごろ、自身の成長が停滞している気がしてきた。

まだまだ下の中程度のエンジニアである僕は、何かしなくちゃいけないと思い、新しい言語を学ぼうと考えた。ただただ勉強してもモチベーションが上がらず、非効率に感じた。

本を読んだり、ネットを巡回してみると、プログラミングのことをアウトプットしている人が多いことを知る。学生時代は学友や先生に助言をもらいモチベーションを保ってきたが、なかなか外に出る機会の少ない社会人生活では人に見てもらうことも難しい。そこで、僕もネットの力を借りようと思った次第である。

 

このブログを書く目的は3つ。

1つはモチベーションの維持。

2つ目は文章スキルを上げること。(僕は文章を書くことが苦手で、よく上司に赤を付けられる)

3つ目は、新米の自分がいろいろやったことを掲載し、同じような境遇の人にアウトプットすること。

 

中身のある記事を書いていきたいと思う。