質問: vba データ(特定値)のある最終行を取得したい 特定列に着目し、何らかのデータのある最終行を取得する場合は cells(rows.count, "a").end(xlup).row ですが、「特定の」文字列あるいは数値のあるセル、複数ある場合は最後の行を知りたいのです。 詳細 あ え う え ←ここの行番号が知りたい #n/a 上記のようにa列に文字列あるいは数値が並んでます。その中にエラー記号である#n/a、#div/0!、、#value!が混在します。これらエラー表示を除いた最終行、上例では「え」のある行を取得したいのです。ちなみに#n/a等はコピペ処理により文字列?になっている事もあります。
回答: #2です。お礼欄拝見しました。 > コピペで文字列になるというのは、例えば数式で=1/0などと書けば #div/0!と表示されるので、これをコピーし他セルで値のみペーストを選んで表示されるものです。あるいはvlookupで該当が無い場合の#n/aのコピペとか。 > 無理な場合は、数式側で=if(iserror(vlookup), vlookup(), "")等で対処するしかありませんが、他人も使うファイルなので出来れば手を加えたくありません。 多少、誤解があるように思えるので補足しますが、、、。 セルの値を分類する場合には、 [数式の戻り値]なのか[定数値]なのか、という分け方があります。 もう一つがデータ型での分類ですが、代表的なものに、 [数値]※1[文字列値][論理値][エラー値]があります。 誤解されているように思われるのは、 値貼付けを含むコピペでは [数式の戻り値]か[定数値]どうかに関わらず、 データ型が変わるようなことは基本的にありません。※2 =1/0という数式が置かれたセルの戻り値は、エラー値の#div/0!ですが、 これをコピーして値貼付けをしたとしても、それは、 [エラー値]であり[定数値]です。 #n/aでも同様です。 見た目で[文字列値]のように感じてしまったとしても、 実際の値は[エラー値]です。 #value! #ref! #div/0! #n/a のようなエラー値を示す文字列を、 セルに貼り付けたり、文字としてタイピングして入力したりしても、 そのセルの値は[エラー値]であり[定数値]です。 表計算アプリであるexcelにとっては、[エラー値]という特別な値を 扱い易くする為に(一種のショートカットとして) #n/aのような文字入力を可能にしている、という風に考えてください。 逆に、文字列値としての"#n/a"がセルに設定したりすると、 非常に特殊で、扱い難いファイル、として敬遠されるものだと思います。 もう一点、 ご提示の数式'=if(iserror(vlookup), vlookup(), "")'についてですが、 エラーだった場合の[数式の戻り値]は[文字列値]です。 この値をコピーして値貼付けをしたとしても、それは、 [文字列値]としての"長さ0の文字列"であり[定数値]です。 見た目が空白に見えても、実際には[文字列値]ですので、 例えば、range.specialcellsメソッド等でも、[文字列値]としてヒットすることになります。 似たような例で、 日付シリアル値としての 2015/2/6 と 文字列値としての "2015/2/6" と 見た目は同じように見えても実は別の値である場合等もあります。 このように、 見た目の[表示文字列]から想像する値と実際の[値]とが違う場合は多々ありますし、 vbaでもexcel数式でも、それらの違いをよく理解した上で扱う必要があります。 ※1 : この場合の[数値]というのは、普通の[数値]の他に、 [通貨][日付][時刻]等のように内部的に数値であるデータ型を含んでいます。 ※2 : 基本的ではない特殊な例として、文字列値としての"#n/a"をセルに確定するには、 事前にセルの[表示形式]を[文字列]に設定しておいて、 セルを直接[入力モード]にして(数式バーなどに)#n/aを入力することで 可能ではあります。が、普通はこんなことしない方がいいです。 補足としては以上になりますが、 エラー値だけを振るい落とす、という要求であったなら、 range.specialcellsメソッドを用いた#2の方法で十分だと考えています。 以下、蛇足ですが、 #3様の、 > sepecialcells というのは、独特の使い方があるので、実験的には可能でも、実務的にはややこしくなるはずです。 どのような状況のことを仰るのか、私には理解(想定)できていません。 具体的に書いて貰えれば、こちらも勉強になるのになぁ、 という思いで話に触れました。他意はまったくありません。