パソコンじいちゃん

最近は個人的な日記になっています。
初心に帰り、パソコン操作の役に立つ内容になるよう頑張ります。

ひさしぶり Excel VBA

2015年11月21日 | Excel



Excelのデーターベースで、フィルター機能によりデーターの抽出が簡単に出来ます。
複数項目の条件を検索することで、絞り込んだデーターも抽出できます。


パソコンのボランティア仲間から次のような質問がきました。
項目で絞り込んで抽出するのではなく、2項目の内のどちらかの条件を満足していれば抽出したい。
そんなときはどうするのか?

2項目の内のどちらかがOKなデーターを抽出するフィルター設定はどうする?どこにある?
エクセルには無いと思う。(Accessならできるのかどうか、私はAccessを知らない)
マクロでは条件による分岐処理が出来ない。
Excel VBA ならば、できるはず。(VBAを少し扱えるので挑戦してみよう)

VBA作成から3~4か月遠ざかっているので、かなり手間取ってしまった。

やっとできたのが次のVBAです。私にできるのはこれくらいでした。

フィールド名(列見出し)を次のようにしました。
B3セルは「番号」 C3セルは「患者名」 E3セルは「病名」 F3セルは「担当者名」


H2セルには 指定条件の「病名」を入力しておきます。
I2セルには 指定条件の「担当者名」を入力しておきます。

ボタンを作成して、「病名担当者フィルター」と「全体表示する」を実行してみました。
希望通りの抽出ができました。 
表全体の再表示もOKです。

普通の人ならば数分で出来るVBAを、いろいろ調べながら何時間もかけて作りました。
時々は作成しておかないと、簡単なことでも忘れてしまいます。
良い勉強をさせてもらいました。

以下は私の作ったVBAです。 
 ( Else: Exit Sub が必要かどうか分からなかったが、問題なかったのでそのままにしました)


Sub 病名担当者フィルター()
Range("C4").Select
Do While ActiveCell.Value <> "" 'C列のセルが空白になるまで繰り返す
If ActiveCell.Value = "" Then Exit Sub 'セルが空白になったら処理を終了する
If ActiveCell.Value <> "" Then 'セルが空白でないときは、次の通り処理を行う
If ActiveCell.Offset(0, 2).Value = Range("H2").Value Or _
ActiveCell.Offset(0, 3).Value = Range("I2").Value Then
' 2列右のセルがH2セルと同じかあるいは(Or)
' 3列右のセルがI2セルと同じ場合は
ActiveCell.Offset(1, 0).Select
ElseIf ActiveCell.Offset(0, 2).Value <> Range("H2").Value And _
ActiveCell.Offset(0, 3).Value <> Range("I2").Value Then
' 2列右のセルがH2セルと異なり かつ(And)
' 3列右のセルがI2セルと異なる場合は
ActiveCell.EntireRow.Hidden = True '行非表示
ActiveCell.Offset(1, 0).Activate 'セルを1行下に移動
Else: Exit Sub
End If
End If
Loop '繰り返す
End Sub




Sub 全体表示する()
'表全体を再表示する
Cells.Select
Selection.EntireRow.Hidden = False
Selection.EntireColumn.Hidden = False
Cells(4, 3).Select 'range("C4").select と同じ
End Sub



最新の画像もっと見る

コメントを投稿