[[20230129155814]] 『VBA FIND使い方』(たえ) ページの最後に飛ぶ

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

 

『VBA FIND使い方』(たえ)

お世話になります
VBAで引っかかってます
教えてください
シート名 統計のA4値のシート名に
シート名 統計のG4の値が 1 2 3いずれかだった場合
A4値のシート名の中からシート名 統計 E4の値をA列から検索して
隣に1 2 3各々値を入力したいです

下記のように組むと

   If Sheets(Worksheets("結果").Cells(r, 7).Value) = 1 Then
インデックスに有効範囲がありませんと出てしまいます
如何にすればいいのでしょうか
お手数おかけしますが
よろしくお願いいたします

Sub セル値から()

  Dim r As Long
  r = 4
 With Sheets(Worksheets("統計").Cells(r, 1).Value)
   If Sheets(Worksheets("統計").Cells(r, 7).Value) = 1 Then
      Range("A:A").Find(what:=Worksheets("統計").Cells(r, 5).Value).Offset(1).Value = 1
   Else
   End If
   If Sheets(Worksheets("統計").Cells(r, 7).Value) = 2 Then
      Range("A:A").Find(what:=Worksheets("統計").Cells(r, 5).Value).Offset(1).Value = 2

   Else
   End If
   If Sheets(Worksheets("統計").Cells(r, 7).Value) = 3 Then
      Range("A:A").Find(what:=Worksheets("統計").Cells(r, 5).Value).Offset(1).Value = 3

   Else
   End If
   End With
End Sub

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


質問とは関係ない部分もあるかもしれませんが何点か確認

■1
↓の部分はどういう狙いなのですか?

   If Sheets(Worksheets("統計").Cells(4, 7).Value) = 1 Then

統計シートのG7セルに何が入っているのかわかりませんが↓のようになっています。

 IF Sheets(シートの名前orシートのインデックス番号) = 1 

シートの名前でチェックしたいのか、Index番号でチェックしたいのかはわかりませんが、いずれも↑の書き方では変です。

■2
↓はどういう狙いなのでしょうか?

 Range("A:A").Find(what:=Worksheets("統計").Cells(4, 5).Value).Offset(1).Value = 3

コードだけ見ると、(アクティブシートの)A列から、統計シートのE5セルの値を探し、見つかったセルの1行下に「3」を書き込みなさいという命令になっていますが、それであってますか?

また、あっているとして、見つからない可能性は考えなくてよいのですか?

(もこな2) 2023/01/29(日) 16:34:51


 >If Sheets(Worksheets("結果").Cells(r, 7).Value) = 1

 これは何をしたいのでしょうか?
 何をしたいのか伝えないで「エラーになります」では、
 たんに自己主張が強いだけに見えます。

 FINDの使い方は、マクロ記録やネットでたくさん説明があると思いますよ。
(自分中心) 2023/01/29(日) 17:31:35

もこな2様
ご対応有難う御座います
offsetは間違えです
Offset(0,1)
列の間違えでした
ご指摘ありがとうございます

見つからない場合はそのまま放置で構いません
ご教示頂けたら幸いです

自分中心様
解れば質問しません
自己中心が強くて申し訳ございません
ただ
この様な掲示板は
引っかかって 困ったときに
利用するものじゃないのですか?
出来れば 何も聞かないと思います?
そのようなら
この様な掲示板の意味がないような気がします
(たえ) 2023/01/29(日) 19:29:09


>列の間違えでした
特にそこを指摘したつもりはありませんが、まぁ確かに違うのでしょうね。

>>見つからない場合はそのまま放置で構いません
今のままだとエラーになっちゃいますよ。

全体の流れが今一つわかりませんが、質問文から推測して

 もしも、統計シートのA4セルに書いてあるシート名のシートがなかったら
    処理を中止する
 もしもの話はおしまい

 統計シートのG4セルの値で条件分岐
  条件が1,2,3のいずれかだったら
    上記シートのA列の中から、統計シートのE4セルと一致するセルを探す
 条件分岐はおしまい

 もしも、上記でセルが見つかっていたら
  そのセルの隣(右?)に統計シートのG4セルと同じ値を書き込む
 もしものはなしはおしまい

ということじゃないですかね。

(もこな2) 2023/01/29(日) 19:51:43


Find使ってないですが。
もこな2さんのコメントにあるように、シートがなかったり、E4が空白やE4の値が見つからなかったときの処理はしていないので注意してください。

 統計シート

    |[A]   |[B]|[C]|[D]|[E]|[F]|[G]|[H]
 [1]|      |   |   |   |   |   |   |   
 [2]|      |   |   |   |   |   |   |   
 [3]|      |   |   |   |   |   |   |   
 [4]|テスト|   |   |   |月 |   |  1|   
 [5]|      |   |   |   |   |   |   |   
 [6]|      |   |   |   |   |   |   |   

 テストシート(A4の名前のシート)の結果図

     |[A] |[B]     
 [1] |曜日|数字入力
 [2] |月  |       1
 [3] |火  |        
 [4] |水  |        
 [5] |木  |        
 [6] |金  |        
 [7] |土  |        
 [8] |日  |        
 [9] |月  |       1
 [10]|火  |        
 [11]|水  |        
 [12]|木  |        
 [13]|金  |        
 [14]|土  |        
 [15]|日  |        
 [16]|月  |       1
 [17]|火  |        
 [18]|水  |        
 [19]|木  |        
 [20]|金  |        
 [21]|土  |        
 [22]|日  |        

 単純なループでやる方法

 Sub test1()
     Dim ws1 As Worksheet, ws2 As Worksheet, i As Long
     Set ws1 = Worksheets("統計")
     Set ws2 = Worksheets(ws1.Range("A4").Value)
     Select Case ws1.Range("G4")
         Case 1, 2, 3
             For i = 2 To ws2.Cells(Rows.Count, "A").End(xlUp).Row
                 If ws2.Cells(i, "A") = ws1.Range("E4") Then ws2.Cells(i, "B") = ws1.Range("G4")
             Next
     End Select
 End Sub

 フィルタで絞り込んで、可視行に入力

 Sub test2()
     Dim ws1 As Worksheet, ws2 As Worksheet
     Dim LastR As Long, i As Long
     Set ws1 = Worksheets("統計")
     Set ws2 = Worksheets(ws1.Range("A4").Value)
     LastR = ws2.Cells(Rows.Count, "A").End(xlUp).Row
     Select Case ws1.Range("G4")
         Case 1, 2, 3
             ws2.Range("A1").AutoFilter 1, ws1.Range("E4")
             With ws2.Range("A1").CurrentRegion.Offset(1, 1)
                 .Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible) = ws1.Range("G4")
                 ws2.Range("A1").AutoFilter
             End With
     End Select
 End Sub
(フォーキー) 2023/01/29(日) 20:24:32

>If Sheets(Worksheets("結果").Cells(r, 7).Value) = 1
これに答えないでいきなり
「ただ・・・・」とは如何なもんかなと思いますね。
(q5) 2023/01/29(日) 20:54:42

■3
トピ主からのレスがないですが、
 If Sheets(Worksheets("統計").Cells(4, 7).Value) = 1 Then

>シート名 統計のG4の値が 1 2 3いずれかだった場合
と仰っているので上記は↓の間違いじゃないですかね。

 If Worksheets("統計").Cells(4, 7).Value = 1 Then

■4
すでに(フォーキー)さんから提示がありますが、「値が 1 2 3いずれかだった場合」のような条件分岐は、Select Caseを使うと便利です。
そういったことを踏まえて「2023/01/29(日) 19:51:43」に提示した内容をコード化するとこんな感じです。

    Sub 研究用()
        Stop '以下ステップ実行のこと

        Dim シート名 As String
        Dim 対象シート As Worksheet
        Dim 発見セル As Range

        シート名 = Worksheets("統計").Range("A4").Value
        On Error Resume Next
        Set 対象シート = Worksheets(シート名)
        On Error GoTo 0
        If 対象シート Is Nothing Then
            MsgBox シート名 & " というシートはありません"
            Exit Sub
        End If

        Select Case Worksheets("統計").Range("G4").Value
            Case 1, 2, 3
                '↓LookIn、LookAtも指定することを推奨
                Set 発見セル = 対象シート.Range("A:A").Find(what:=Worksheets("統計").Range("E4").Value)
        End Select

        If Not 発見セル Is Nothing Then
            発見セル.Offset(, 1).Value = Worksheets("統計").Range("G4").Value
        End If
    End Sub

興味があれば【ステップ実行】して研究のうえ必要な部分だけご自身のコードに組み込んでください。
(理解していただきたいので丸パクリはNGとします。)

(もこな2) 2023/01/30(月) 07:47:42


 >インデックスに有効範囲がありませんと出てしまいます

このエラーは存在しないシート名やブック名を指定したときに、よく出ます。

 >Sheets(Worksheets("結果").Cells(r, 7).Value)

Sheets(???)の括弧内は、シート名かシートの番号(インデックス)を
入れてシートを指定する文法になりますので、

 >Worksheets("結果").Cells(r, 7).Value

これの値が存在しないシート名だと(1とか2とか3が入っている?)、
「インデックスに有効範囲がありません」とでます。
上手く行かなくて混乱してそのように書かれたと思いますが、
回答側もエクセル君と同じでその行を読まされるとエラーを起こします。
つまり建設的な回答アドバイスがなかなかできなくなります。
そこのところはご理解いただきたいと思います。

こういうことかなぁ。。。というサンプル
Sub test()

    Dim sName As String     '検索するシート名
    Dim sKey As String      '検索する文字列
    Dim n As Long           '指定の番号
    Dim rngFind As Range    '検索するセル範囲
    Dim rngHit As Range     '見つかったセル

    sName = Worksheets("統計").Range("A4").Value
    sKey = Worksheets("統計").Range("E4").Value
    n = Worksheets("統計").Range("G4").Value
  Set rngFind = Worksheet(sName).Range("A:A")

'シート名 統計のG4の値が

    Select Case n
        '1 2 3いずれかだった場合
        Case 1, 2, 3
            'A4値のシート名の中からシート名 統計 E4の値をA列から検索して
            Set rngHit = rngFind.Find(sKey)
    End Select

    'もし見つかれば、隣に1 2 3各々値を入力したいです
    If Not rngHit Is Nothing Then
        rngHit.Offset(, 1).Value = n
    End If
End Sub

セル範囲に対するFindメソッド(=エクセルの検索機能)は、
引数(括弧の中の指定する項目)を省略できるのですが、
省略すると意図しない挙動をすることがあるので、
期待した結果が出ない恐れがあります。
ヒットする値が、ひとつなら、Match関数
複数あるなら、オートフィルターを使うことをお勧めします。
(まっつわん) 2023/01/30(月) 11:27:20


コメント返信:

[ 一覧(最新更新順) ]


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