アプリ版:「スタンプのみでお礼する」機能のリリースについて

マクロで、質問です。
Find関数を使う時。。

Set FoundCell = Range(”A:A”).Find(Cells(j.code).Row

if FoundCell Is Nothing Then
処理
Else
処理

の場合、(格納が合っているかは分かりませんが…)
見つからなかった場合の処理はせずスルーして
次にまだまだあるコードにうつるには処理のところはなんと記述すれば良いのですか?

A 回答 (4件)

nk.knさんが書いたIf文は次のような意味ですよね。



If FoundCell Is Nothing Then
  見つからなかった場合の処理
Else
  見つかった場合の処理
End If

見つからなかった場合、その処理をスルーするのであれば、その処理を書かなければ良いだけです。こんな感じです。

If FoundCell Is Nothing Then
Else
  見つかった場合の処理
End If

でも、普通は次のように書きますね。

If Not FoundCell Is Nothing Then
  見つかった場合の処理
End If
    • good
    • 1

他の方で解決策や解答を見出したならよいかと思いますが、


このようなコードが実際には出会わないですし、

>Set FoundCell = Range(”A:A”).Find(Cells(j.code).Row
ありえないですね。

j.codeという何か、j はオブジェクトで、Code がプロパティでしょうけれども、それほどにVBA(マクロではなくなります)組めるなら、また、別格だと思います。

>Find関数を使う時。。
FIND(検索文字列,対象,開始位置)

Find関数は、WorksheetFunction.Find(strText, Range("A1"))
ということになります。

では、Find メソッドならどうでしょうか。

二つ考えてみました。
1列に一つ見つければよいなら、TestFind1 でも良いと思います。
もし、複数列をさがすもくできなら、

Sub TestFind1()
Dim r As Range
Dim FoundCell As Range
Dim jCode As Variant
Dim i As Long
Dim flg As Boolean
i = 1
jCode = "H"
For Each r In Range("A1:H1")
 Set FoundCell = r.EntireColumn.Find(jCode)
 If Not FoundCell Is Nothing Then
   Cells(i, 10).Value = FoundCell.Address(0, 0)
   i = i + 1
  End If
Next r
End Sub
'//

Sub TestFind2()
Dim FoundCell As Range
Dim jCode As Variant
Dim i As Long
Dim firstAdr As String
i = 1
jCode = "H"
 Set FoundCell = Columns("A:H").Find(jCode, _
  SearchOrder:=xlByColumns, _
  LookAt:=xlWhole)
  
 If Not FoundCell Is Nothing Then
  firstAdr = FoundCell.Address(0, 0)
  Do
   Cells(i, 11).Value = FoundCell.Address(0, 0)
   i = i + 1
  Set FoundCell = Columns("A:H").FindNext(FoundCell)
   If FoundCell.Address(0, 0) = firstAdr Then Exit Sub
   Loop Until FoundCell Is Nothing
  End If
End Sub
    • good
    • 0

こんばんは!



横からお邪魔します。
No.1さんがおっしゃっているように
FindNextメソッドを利用するのが良いのでは?

↓のような感じになると思います。

Dim FoundCell As Range, FirstCell As Range
Set FoundCell = Range("A:A").Find(what:="検索データ", LookIn:=xlValues, lookat:=xlWhole)
If Not FoundCell Is Nothing Then
Set FirstCell = FoundCell
'処理
Do
Set FoundCell = Range("A:A").FindNext(after:=FoundCell)
If FoundCell.Address = FirstCell.Address Then Exit Do
'処理
Loop
End If

※ No.1さんも書かれているように
>Set FoundCell = Range(”A:A”).Find(Cells(j.code).Row
がイマイチ判らないので、とりあえず「検索データ」は完全一致としています。m(_ _)m
    • good
    • 0

こんにちは



>Set FoundCell = Range(”A:A”).Find(Cells(j.code).Row
書式があってないのか、行が途中で切れてしまっているのか・・・・?
このままでは、括弧のが閉じていないし、返されるのはRow(=数値)のつもりなのでしょうか?


仮にFoundCellにRangeが返されているものとして、戻り値は最初に該当するセルになります。(該当セル全体ではない)
それなので、該当するセル全部に対して処理を行いたいのであれば
 If ~ Then ~ Else ~
ではなく、次の該当セルを得るのに、.FindNext()メソッドを利用して処理を繰り返すことになります。
また、FoundCell Is Nothing というのは該当するセルがまったく存在しない場合を意味していています。

上記の.FindNext()を繰り返していくと、循環してやがて最初ののセルを参照するようになりますので、最初に処理したものを記憶しておいて、同じセルになったらループを抜けるという記述方法をとることになります。

詳細な説明は、エクセルのヘルプをご参照ください。
サンプルコードをご覧になるのが、わかりやすいと思います。
https://msdn.microsoft.com/ja-jp/library/office/ …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!