[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロで検索する方法』(相模原MK)
やった内容をマクロ記録とってみたかな? 以下のようなコードが生成されているはず。
Sub Macro1()
Range("B2:B6").Select Selection.Find(What:="検索したい氏名", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False).Activate End Sub
この What:="検索したい氏名" ここを定数ではなく変数で与えることが可能。 たとえば What:=Range("A1").Value としてやると、A1に入っている値で検索するということになる。
ちょっと気をつけなきゃいけないのは、検索指定で、オプションを指定せずに通常時実行すると LookAt:=xlPart と、「部分一致」になるということ。ここを完全一致にしたければ( 操作時、オプションで指定すれば自動的にそうなるけど)LookAt:=xlWhole にする。
それと、エクセル操作でやると、検索する文字列がなかった場合に、「ないよ」というメッセージがでるけど マクロで実行すると実行時エラーで倒れてしまう。
マクロ記録特有のSelect/Selection を整理し、省略しても、実行には影響しないパラメータをカットすると 以下のようなコードかな。
Sub Sample() Dim c As Range
Set c = Range("B2:B6").Find(What:=Range("A1").Value, LookIn:=xlFormulas, LookAt:=xlWhole) If c Is Nothing Then MsgBox "見つかりません" Else c.Select End If
End Sub
(ぶらっと)
このシートのこのセルという書き方は Sheets("シート名").Range(セルを表す表現) なので Sheets("Sheet2").Range("A1") というように。 ただし、シートが複数あるということだから、B2:B6が存在しているシートも、どのシートかを明示したほうがいい。 かりに、それをSheet1だとすると Set c = Sheets("Sheet").Range("B2:B6").Find(What:=Sheets("Sheet2").Range("A1").Value, LookIn:=xlFormulas, LookAt:=xlWhole) ながくなるので、どちらかを With でくくって、たとえば With Sheets("Sheet1") Set c = .Range("B2:B6").Find(What:=Sheets("Sheet2").Range("A1").Value, LookIn:=xlFormulas, LookAt:=xlWhole) End With (Withでくくったシートのセル領域は、頭に .(ピリオド)をつける。) これでもいい。
追記)コードでは、見つかったセルを選択している。(c.Select) 万が一、この時、このセルがあるシートがアクティブでなければエラーになるので c.Parent.Activate '(cの親、つまり、そのシートをアクティブ) c.Select
こうしておいて。
(ぶらっと)
(ぶらっとさん) おはようございます 教わりました内容で進みましたが、「.Range」でコンパイルエラーが表示されて中止します。意味が分からないのでお手数を掛けますがご指導をよろしくお願いいたします また最初に教わりました「MsgBox "見つかりません"」を何処に入れればよいのかも教えてください
教わりましたソフトを入れて動かしましたが違っている所があると思いますのでお願いいたします
With Sheets("Sheet1")
Set c = .Range("B2:B6").Find(What:=Sheets("Sheet2").Range("A1").Value, LookIn:=xlFormulas, LookAt:=xlWhole) End With c.Parent.Activate c.Select
End Sub
>「.Range」でコンパイルエラーが表示されて中止します。
「.Range の行」でコンパイルエラー(変数が定義されていません)が表示されて中止します。
かな? モジュールの先頭で Option Explicit を定義して、変数宣言を必須にしているんだろうね。 (これは、とてもいいことです)
Dim c As Range と宣言しましたか?
一応、以下にコードを。
Sub Sample() Dim c As Range
With Sheets("Sheet1") Set c = .Range("B2:B6").Find(What:=Sheets("Sheet2").Range("A1").Value, LookIn:=xlFormulas, LookAt:=xlWhole) End With
If c Is Nothing Then MsgBox "見つかりません" Else c.Parent.Activate c.Select End If
End Sub
(ぶらっと @ 還暦をとうの昔にすぎてしまった老人)
レスの前に。 このページの(相模原MK)さんのレス、自分では、適宜改行をいれながら入力しているのに ブラウザーで表示すると、改行無く、文字サイズも少し大きめ。 (ページの上のほうの「差分」をおすと、元々入力したイメージで表示されるけど) ページの右上の「はじめての方へ」をクリックして、Wikiに書き込む場合の整形ルール に 書き込みの要領が書いてあるんだけど、ちょっとわかりづらいかも。 みやほりんさんが立ち上げてくださった以下のトピのほうが、わかりやすいと思うので 目をとおしておかれたらよろしいかと。 [[20120225181028]] 『[談]wikiの行頭半角スペース』(みやほりん)
また、レスには、必ずHNを。でないと、誰が発言しているのかがわからなくなるので。 あと、ページの更新前に、その左のプレビューをクリックすると、記入したレスが 実際にブラウザーで、どのように表示されるかが確認できる。
で、本題。Sheet3への転記だけど、「縦に」とあるので A1,A2,A3 に転記している。 これが、「横にA1,B1,C1」 であれば コードの中の A2 -> B1 、A3 -> C1 に直して。
Sub Sample() Dim c As Range
With Sheets("Sheet1") Set c = .Range("B2:B6").Find(What:=Sheets("Sheet2").Range("A1").Value, LookIn:=xlFormulas, LookAt:=xlWhole) End With
If c Is Nothing Then MsgBox "見つかりません" Else With Sheets("Sheet3") .Range("A1").Value = c.Value '頭のピリオドはWithでくくったシートの という意味。 'また c は 見つかった Sheet2 のセル。その値を転記 .Range("A2").Value = c.Offset(, 1).Value 'c の1つ右の列の値を転記 .Range("A3").Value = c.Offset(, 2).Value 'c の2つ右の列の値を転記 .Activate '転記後のSheet3を表示 End With End If
End Sub (ぶらっと)
ぶらっとさん ようやくマクロが少しわかるようになりました。 適切のアドバイスを戴き感謝申し上げます。ありがとうございました。 今後はレス等に気を付けて対応したいと思います いろいろありがとうございました (相模原MK) ぶらっとさん こんばんは今回は「見つかりません」というコメントが出てきましたら 次のSheet4で新規の入力画面を作りたいのですが、どこに「Sheets("Sheet4").Select」これを入れるとよいと思いましたがうまく入りませんでしたので よろしくお願い申し上げます (相模原MK)
新規の入力画面を作りたいというのが、いまいち、わからないんだけど、単純に、見つからなかったとき Sheet4 を表示させたいということならMsgBoxの次にSheets("Sheet4").Select を。
あぁ、それと、新しい書き込みも、編集で表示させて、既存のレスのところに追記してるでしょ。 そうじゃなく、画面下のコメント欄にかいたほうがわかりやすいよ。
(ぶらっと)
「MsgBoxの後に」というのは、すっごく正確に言うと
MsgBox "見つかりません" の次の行に Sheets("Sheet4").Select といれるという意味。
念のため以下のように。
MsgBox "見つかりません" Sheets("Sheet4").Select
(ぶらっと)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.