[[20200612103511]] 『Match関数でforループをまわす際のエラー』(vba初心者です) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Match関数でforループをまわす際のエラー』(vba初心者です)

Sub Macro()

Dim i As Long
Dim K As Long

    For i = 14 To 80

        K = WorksheetFunction.Match(Range("A1"), Columns(i), 0)

        If K <> 0 Then

        	Columns(i).Hidden = True

        End If

    Next

End Sub

大変お世話にあっております。
A1に記述されている文字列が各列において一つもない場合はその列を非表示にする、それを14〜80列で行う、という挙動にしたいのですが
K = WorksheetFunction.Match(Range("A1"), Columns(i), 0)
の箇所で止まってしまいます。

修正方法についてご教授いただけますと幸いです。
よろしくお願いいたします。

< 使用 Excel:Office365、使用 OS:Windows10 >


 やり方は2つあります。

 WorksheetFunction.Match は検索値がみつからないと実行時エラーになります。
 On Error Resume Next を使って、実行時エラーを無視する方法があります。
 ただし、エラーが発生しても K の値は更新されないので、都度 K の値を初期化してください。

 別の方法として、 Application.Matchを使う方法があります。
 実行時エラーは起きませんが、エラー値が返ってきます。
 なので、K は Variant 型である必要があります。
 エラー値かどうかの判定は、IsError関数を使います。
(´・ω・`) 2020/06/12(金) 11:12

関数のときもそうですが、Matchで該当するものがないとエラーになります。
VBAの場合、こういうケースではFindメソッドを使うことが多いので紹介します。
 Dim K As Range                        '変数Kをオブジェクト変数で宣言(Rangeオブジェクト)

 Set K = Columns(i).Find(What:=Range("A1"), Lookat:=xlWhole) 'Columns(i)の中からA1セル(の値)を探してセルのRangeオブジェクトをKに入れる(無ければKは空っぽ(Nothing))
 If Not K Is Nothing Then Columns(i).Hidden = True      'Kが空っぽでない(Kに値がある)ならcolumns(i)を隠す

たとえばこんな感じです。
xlWholeは全部一致、ここをxlPartに変えると部分一致になります。

参考までに。
(虎ノ門ヒルズ) 2020/06/12(金) 11:17


 私なら、SUMIFを使うけどなぁ。 エラーの心配がないので。

(半平太) 2020/06/12(金) 11:35


 > 私なら、SUMIFを使うけどなぁ。
       ↓
       COUNTIFの間違い m(__)m

(半平太) 2020/06/12(金) 11:46


私なら、
数を数えるなら、半平太さん同様、CONTIF関数で、
位置を知りたいなら、セル入力時の数式で、

 With WorksheetFunction
     k = .IfError(.Match(Range("A1"), Columns(i), 0), 0)
 End With

にしますね。
(tkit) 2020/06/12(金) 12:54


´・ω・`さん、虎ノ門ヒルズさん、半平太さん、tkitさん
それぞれ大変参考になりました。
狙い通りの挙動で動かせるようになりました。
ありがとうございました。
(vba初心者です) 2020/06/12(金) 13:09

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.