dポイントプレゼントキャンペーン実施中!

Excelでセルに任意の文字列をペーストします。そのセルは別のブックにリンクしているのでペーストする度にリンク先のセルでは文字列が更新されます。リンク先のブックにはワークシートが10あっていづれかのシートのA列にその文字列がある事になっています。更新された文字列を検索する作業を繰り返すのでマクロで組み込もうと思ったのですがFIND関数にしても、VBでCell.Find(What:=....と書くにも参照する文字列を直接指定してやらないと動きません。参照する文字列が相対的に変化するので「特定のセルの中に入力された文字列」を参照してブック内を検索したいということなのですが、実現するにはどうしたらようでしょうか?と質問して
moji = "B1"
Set c = Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then c.Select
というコードをしめしていただきました。このままだと検索対象がRangeオブジェクトになっているのでActivesheet上でしか検索がかからないのでCellsにすればブック内のすべてのシートに検索がかけられるかな?と思っていたのですがエラーがでます。ブック内を検索範囲に入れるためにはどうしたらよいでしょうか?

A 回答 (2件)

全てのワークシートを検索するのなら、



Sub test()
Dim ws As Worksheet
Dim moji As String
Dim c As Range

moji = "B1"
For Each ws In Worksheets
With ws

Set c = .Range("A:A").Find(What:=moji, After:=.Range("A" & Rows.Count), _
LookIn:=xlValues, LookAt:=xlWhole)

If Not c Is Nothing Then
.Activate
c.Select
Exit Sub
End If

End With
Next

MsgBox "なかったよ"
End Sub
順番に見ていくしかないのでは。

この回答への補足

ありがとうございます。順番に見ていくしかないという一言が一番利きました(笑い)。午後の間、格闘してみましたが
Sub test()
moji = Sheet1("B1")
Set c = Sheet1.Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole)
Set b = Sheet2.Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole)
Set d = Sheet3.Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then c.Select
ElseIf Not b Is Nothing Then b.Select
ElseIf Not d Is Nothing Then d.Select
End If
End Sub
というようにSheet1のB1を検索文字欄に固定して検索項目を分け、それぞれを条件つきで表示してはどうかと思いました。が、Elseに対応する
Ifがないとエラーが出ます。なぜなんでしょうか?

補足日時:2008/08/30 16:17
    • good
    • 0

moji = Sheet1("B1")


ここも変なのですが。

If Not c Is Nothing Then c.Select
ElseIf Not b Is Nothing Then b.Select
ElseIf Not d Is Nothing Then d.Select
End If

1行目の
If Not c Is Nothing Then c.Select
でIF文は終了しています。なので以降のELSEIFに対してのIFが見つからないのです。
(1行で終わるのであれば書き方は問題ないですが、以降にELSEがあるので問題になります。)

If Not c Is Nothing Then
c.Select
ElseIf Not b Is Nothing Then
b.Select
ElseIf Not d Is Nothing Then
d.Select
End If
と言うように改行すれば解決かと。
    • good
    • 0
この回答へのお礼

たびたびありがとうございます。
>moji = Sheet1("B1")
ここも変なのですが。
確かにトンちきなことを書いてますね。

この時間までいろいろ試してエラー400と戦いながら(笑)
Sub test()
'
'test macro
'
Dim moji As String
Dim c As Range
Dim b As Range
Dim d As Range

moji = Sheet1.Range("B1")
Set c = Sheet1.Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole)
Set b = Sheet2.Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole)
Set d = Sheet3.Range("A:A").Find(What:=moji, LookIn:=xlValues, LookAt:=xlWhole)
If Not c Is Nothing Then
Sheet1.Select
c.Select
ElseIf Not b Is Nothing Then
Sheet2.Select
b.Select
ElseIf Not d Is Nothing Then
Sheet3.Select
d.Select

End If

End Sub
となりました。これだと指定したシート範囲内にsheet1のB1に入力した文字列を検索できます。朝から四苦八苦していましたが今日中に目処が立ったのもご指導のおかげです。今後は改行の効果についても頭に入れて勉強します。ありがとうございました!

お礼日時:2008/08/30 21:36

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