[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
見つからない場合はそのまま放置で構いません
ご教示頂けたら幸いです
自分中心様
解れば質問しません
自己中心が強くて申し訳ございません
ただ
この様な掲示板は
引っかかって 困ったときに
利用するものじゃないのですか?
出来れば 何も聞かないと思います?
そのようなら
この様な掲示板の意味がないような気がします
(たえ) 2023/01/29(日) 19:29:09
>>見つからない場合はそのまま放置で構いません
今のままだとエラーになっちゃいますよ。
全体の流れが今一つわかりませんが、質問文から推測して
もしも、統計シートのA4セルに書いてあるシート名のシートがなかったら 処理を中止する もしもの話はおしまい
統計シートのG4セルの値で条件分岐 条件が1,2,3のいずれかだったら 上記シートのA列の中から、統計シートのE4セルと一致するセルを探す 条件分岐はおしまい
もしも、上記でセルが見つかっていたら そのセルの隣(右?)に統計シートのG4セルと同じ値を書き込む もしものはなしはおしまい
ということじゃないですかね。
(もこな2) 2023/01/29(日) 19:51:43
統計シート
|[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(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.