[[20120302172328]] 『マクロで検索する方法』(相模原MK) ページの最後に飛ぶ

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

 

『マクロで検索する方法』(相模原MK)
Excel2010でXPを使用してマクロの初心者です 質問は氏名をExcelデータ表「B2からB6」まで作成して A1の空欄に名前を入れて検索したいのですが?
やった内容と質問
@検索と選択から検索をクイック
A検索する文字列(N)に「名前」を入れると検索ができましたが?
質問は名前の入れる場所を先ほどの空欄「A1」の文字を自動で読み込んでAの項目に入れることができませんか 宜しく指導をお願いいたします

 やった内容をマクロ記録とってみたかな?
以下のようなコードが生成されているはず。

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

 (ぶらっと)


(ぶらっとさん)
わかりやすい説明をありがとございました。お蔭様で助かりました
あつかましく次の質問もよろしいでしょうか
@今回「A1」で入力した氏名をシート2の「A1」に変更をするのはどのようにするのでしょうか
お手数を掛けますがよろしくお願いいたします


 このシートのこのセルという書き方は
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

   こうしておいて。

 (ぶらっと)

(ぶらっとさん) おはようございます
早々にアドバイスをいただきまして感謝申し上げます。60歳の手習いでマクロに挑戦?して楽しんでいますがこのような本がなかったので困っていましたよ。また不明な所がありましたら質問をさせていただきますのでよろしくご指導をお願いいたします ありがとうございました

 (ぶらっとさん) おはようございます
教わりました内容で進みましたが、「.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

 (ぶらっと @ 還暦をとうの昔にすぎてしまった老人)


ぶらっとさん ありがとうございました ここまでは無事完成しました 感謝申し上げます
あつかましく次の質問もよろしくお願いいたします
「A1:氏名」を検索した結果、Sheet1の表にB2の氏名で見つかりましたのでその行(B2)をコピーして
(コピー内容→B2:氏名 C2:郵便番号 D2:住所)それをSheet3の表に縦列→A1:氏名 B1:郵便番号
C1:住所を張り付けたいのです。お手数を掛けますがよろしくお願いいたします


 レスの前に。
 このページの(相模原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 を。

 あぁ、それと、新しい書き込みも、編集で表示させて、既存のレスのところに追記してるでしょ。
そうじゃなく、画面下のコメント欄にかいたほうがわかりやすいよ。

 (ぶらっと)

ぶらっとさん コメントをありがとうございました
土日曜日が忙しかったので返信が遅れてすいませんでした わかりにくい文章ですいませんでした。質問は名前を検索して、氏名がない場合に新規住所録を作成するためSheet4入力画面を作るたかったのです。従来は名前「A氏」を入力して見つからないので、新規登録をSheet4で入力画面を作成しました。指示通りMsgBoxの次にSheets("Sheet4").Select を入れてみましたが動きませんでしたのでアドバイスをよろしくお願いいたします
MsgBox Sheets("Sheet4").Select
(相模原MK)


 「MsgBoxの後に」というのは、すっごく正確に言うと

 MsgBox "見つかりません" の次の行に Sheets("Sheet4").Select といれるという意味。

 念のため以下のように。

 MsgBox "見つかりません" 
 Sheets("Sheet4").Select 

 (ぶらっと)


ぶらっとさん 早速の返信をありがとうございました 
おかげ様でうまく動くようになりました。感謝致します

コメント返信:

[ 一覧(最新更新順) ]


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