Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Home Premium : 指定なし)
inputoxに入力文字をデータ検索して結果を明記したい。
投稿日時: 20/07/19 14:05:56
投稿者: miyuukate

二つのinputboxに入力した文字の両方に該当するものが<データ>にあるかを検索して、その結果をmsgbox
で表すマクロを作りたいのですがうまくいきません。
 
<データ>
 
 

  B(文書名)	   C(店名)
 2	・報告書	令和2年度エス店
 3	・報告書	令和2年度ケイ店
 4	・分担	    令和2年度エス店
 5	・連絡	    令和2年度統合
 6	・分担	    令和2年度エス店

  
  
Sub 文書()
    Dim mycell As Variant
    Dim mycell2 As Variant
            
    Dim keyword As String
    Dim keyword2 As String
    
        keyword = InputBox("文書名を入力")
        keyword2 = InputBox("店名を入力")
    If keyword = "" Then
        MsgBox "キャンセルしました。", vbExclamation
        End
    End If
  [color=orange] Set mycell = Workbooks("質問用").Sheets("テスト").Columns("B") _
    .Find(what:=keyword, lookat:=xlPart)[/color]
    
    If mycell Is Nothing Then
       MsgBox "作成"
         
    End If
    Set mycell2 = Workbooks("質問用").Sheets("テスト").Columns("C") _
    .Find(what:=keyword2, lookat:=xlPart)
    If mycell2 Is Nothing Then
       MsgBox "作成済み"
    End If
             
End Sub

 実行するとオレンジの部分に実行時エラー9 インデックスが有効範囲にありません。とでます。
 たぶん他のとこにも間違いがあるかと思います。
解る方いましたら、どうぞ教えてください。よろしくお願いします。
 
[/b]

回答
投稿日時: 20/07/19 14:22:12
投稿者: WinArrow
投稿者のウェブサイトに移動

>Workbooks("質問用").
ブック名は、拡張子まで指定しましょう。

Workbooks("質問用.xlsx").

回答
投稿日時: 20/07/19 17:05:43
投稿者: WinArrow
投稿者のウェブサイトに移動

エラーの原因は、前レスの通り・・・です。
  
余計な心配かもしれませんが、
 掲示のコードには、ヒットした結果の使い方が書かれていないので、
 詳細はわかりませんが、
 文書名と店名が、一致したら
 という条件にはならないと思います。
  
文書名:「分担」で、店名:「令和2年度エス店」
を指定したとき、
 文書名では、4行目
 店名では、2行目
がヒットします。
この仕様でよいのか?
勿論、6行目には、ヒットすることはないです。
 
再検討したほうがよいと思います。

投稿日時: 20/07/19 22:34:11
投稿者: miyuukate

 迅速なアドバイスありがとうございます。
 拡張子の入力でエラーは対処できました!ありがとうございます。
 そしてご指摘の通り、エラーが無くなりメッセージも出ますが…
 二つの条件とも該当するものを見つけ出す検索は働いていなく試行錯誤しています。
 二つの条件を満たすものが一つでもあれば”作成済み”、二つの条件を満たすものが一つも
 なければ”作成”と出るような仕様にしたいと考えています。
 再度作り直してみます!

回答
投稿日時: 20/07/19 23:32:27
投稿者: WinArrow
投稿者のウェブサイトに移動

 
再度作り直してみます!
  
有無判定だけでしたら(件数は関係なし・・ヒットした行のデータも参照しない)
という事でしたら、
COUNTIFS関数が使えるでしょう。
  
参考例
    Set wsht = Workbooks("質問用.xlsx").Sheets("テスト")
     If WorksheetFunction.CountIfs(wsht.Range("B:B"), "*" & keyword, wsht.Range("C:C"), keyword2) Then
         MsgBox "ヒットしたよ"
     Else
         MsgBox "ヒットしなかったよ"
     End If
 
 

投稿日時: 20/07/20 21:22:41
投稿者: miyuukate

WinArrow さんの引用:

再度作り直してみます!
  
有無判定だけでしたら(件数は関係なし・・ヒットした行のデータも参照しない)
という事でしたら、
COUNTIFS関数が使えるでしょう。
  
参考例
    Set wsht = Workbooks("質問用.xlsx").Sheets("テスト")
     If WorksheetFunction.CountIfs(wsht.Range("B:B"), "*" & keyword, wsht.Range("C:C"), keyword2) Then
         MsgBox "ヒットしたよ"
     Else
         MsgBox "ヒットしなかったよ"
     End If
 
 

 
アドバイスありがとうございます。
Countifs関数を使って二つのキーワードに該当するものの有無を判定することが無事できました!
FIND関数にとらわれてどんどん収集つかなくなりそうだったところ…大変助かりました。
基本部分ができたのでさらに使い勝手がよくなるように工夫していきたいと思います。

トピックに返信