プロが教えるわが家の防犯対策術!

A1とA2を結合させた状態で、vbaで列番号を取得する方法はありますか?

この状態で
Sub Sample()
Dim 列 As Long
列 = Rows(1).Find(What:="検索文字", LookAt:=xlWhole).Column
End Sub

をすると、エラーになります。

結合を解除すれば、1が返ります。
結合させた状態でなおかつ列番号を取得する方法をご教授下さい。

「結合させた状態で、vbaで列番号を取得す」の質問画像

A 回答 (2件)

次のようにすればよいでしょう。



Sub Sample()
Dim 列 As Long
列 = WorksheetFunction.Match("検索文字", Range("1:1"), 0)
End Sub
    • good
    • 1
この回答へのお礼

回答ありがとうございました。

お礼日時:2013/09/09 20:26

No.1 さんのように、MATCH 関数のほうが手っ取り早いと思います。

ですが、あえて Find メソッドについて回答してみます。


A1:A2 が結合されている状態で、手動で検索(Ctrl+F)してみれば分かりますが、ヒットしません。結合の位置が B1:B2 であれば、アクティブセルの位置が適切なら結合セル中の文字列でもヒットしますけど。というわけで、これは Excel の仕様ということで、何ともならないと思います。

下のコードでは、A1 セルとその他の範囲というふうに分けて、それぞれを調べています。

また、Find メソッドのほうは「Rows("1:2")」あるいは「Range ("1:2")」というふうに結合セルの全体を含む範囲にしないと、やはりヒットしません。手動でも同じです。

なお Range.Find.Column というふうに、いきなりプロパティを求めようとしてしまうと、Find メソッドが Nothing を返したとき(文字列が見付からなかったとき)に、エラーになってしまいます。したがって面倒でも、検索結果を Set するなどして、必ず Nothing か否かを確認してから列を求めるのがいいでしょう。

あと、何だか前述の説明と矛盾しているような話ですが、Cells.Find であれば、A1:A2 が結合されていてもヒットします。シート上の適当な位置にカーソルをドラッグせずに置いて手動で検索しても、同様です。


Sub Sample()

  Const s As String = "検索文字"
  Dim r As Range
  Dim 列 As Long

  If Range("a1").Value = s Then
    Debug.Print 1
    Exit Sub
  End If

  Set r = Rows("1:2").Find(What:=s, LookAt:=xlWhole)
  If Not r Is Nothing Then 列 = r.Column
  Debug.Print 列

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2013/09/09 20:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています