[[20150701151711]] 『違う列が抽出される』(yuki) ページの最後に飛ぶ

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

 

『違う列が抽出される』(yuki)

また質問させていただきます。宜しくお願い致します。

下記のコードを記述しているんですが、最後の s1.Range("B" & Maxrow).Value = c.Range("B" & i).Value この部分で、shのB列を拾いたいのにL列が出てきてしまいます。何故こうなってしまうんでしょうか。

s・・・data1.xlsx(データのあるブック)
s1・・・data2.xlsx(抽出先のブック)
R1・・・検索値
K2・・・検索値のある列

        For Each c In s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp))
            Set c = s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp)).Find(What:=s1.Range("R1").Value, LookAt:=xlWhole)
            If Not c Is Nothing Then

                With c.EntireRow
                i = 1
                i = i + 1  

                s1.Range("B" & Maxrow).Value = c.Range("B" & i).Value

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 sがWorksheetで有れば「s.Range("B" & i).Value」はB列を示すがsがセル範囲であればs内の一番左上のセルをA1セルとみなして
 セルを参照する。

 sにはどうやってオブジェクトのセットを行っているのだろうか?
 (「Set s = …」部分がどうなっているか)
(ねむねむ) 2015/07/01(水) 15:40

>ねむねむさん、回答いただきありがとうございます。
set・・・の部分はこうなっています。

Set s = Workbooks("data1.xlsx").Sheets(1)
(yuki) 2015/07/01(水) 15:44


 部分的なコードではなく、このプロシジャ全体のコードを、そのままコピペでアップしたほうが
 早く解決すると思いますよ。

(β) 2015/07/01(水) 15:51


 質問のテーマとは(少なくともアップされたコード上では)異なりますが

 For Each c In s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp))

 これで、K列からセルを c に取り出しながら、そのあとすぐに

 Set c = s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp)).Find

 で、検索結果のセルを c にいれているのも、ずいぶん奇妙なコードですね。。(だめということではありませんが)

 そもそも、質問の s1.Range("B" & Maxrow).Value = s.Range("B" & i).Value と
 ともに掲載されたそのほかのコードって、まったく関連がないですよね
 やはり、すべてアップしましょうよ。

(β) 2015/07/01(水) 16:18


βさん、回答ありがとうございます。
下記のコードでほぼすべてです。変数より下のものです。

    With Workbooks("data2").Sheets(1)
        Maxrow = 6
        i = 1
    End With
    Set s1 = Workbooks("data2").Sheets(1)

    Set s = Workbooks("data1.xlsx").Sheets(1)

    With Workbooks("data1.xlsx").Sheets(1)
       For Each c In s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp))

                Set c = s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp)).Find(What:=s1.Range("R1").Value, LookAt:=xlWhole)
                If Not c Is Nothing Then

                    With c.EntireRow
                    i = i + 1

                    s1.Range("B" & Maxrow).Value = c.Range("B" & i).Value

             ・・・

                End With
            End If
        Maxrow = Maxrow + 1
        Next
    End With
End Sub
(yuki) 2015/07/01(水) 16:29

 最初の書き込み
 >s1.Range("B" & Maxrow).Value = s.Range("B" & i).Value

 今回の書き込み
 >s1.Range("B" & Maxrow).Value = c.Range("B" & i).Value

 全く違っているが?
 最初の書き込み時のように

 >s1.Range("B" & Maxrow).Value = s.Range("B" & i).Value
 とした場合、何か問題があるのか?
(ねむねむ) 2015/07/01(水) 16:37

ねむねむさんへ

申し訳ありません、質問を書きながら少し弄っていたので、他にも違いがあるかもしれません。質問としてはcのほうが正しいです。(cだとL列が出てきてしまう、ということです。)
s → c は、一番はじめはsにしていたのですが、sだと検索値とは関係なくdata1.xlsxのB2〜が抽出されてしまうので、cに書き換えればうまくいくのでは・・・と思い書き換えてみました。ですが、上記のとおりで全くわからず困っていたのでここに質問させていただきました。質問編集します。
(yuki) 2015/07/01(水) 16:43


c は、K列の範囲内なので、そこで B列を見に行くと、Aから見たB、つまり1列後を示すので、K列の次のL列を見に行きますね。
c なのか s なのか、よく考えて使いましょう。
(???) 2015/07/01(水) 16:55

この書き方だとwith使用していませんが、何に使おうとしていましたか?
(デイト) 2015/07/01(水) 16:57

K列に名称が入っていて、検索値と同じ名称を抽出したいと思っています。しかし、これでできるか?という曖昧なものをつなぎ合せていた為、結果このような状態になってしまいました……。

(yuki) 2015/07/01(水) 17:02


s1.Range("B" & Maxrow).Value = c.Range("B" & i).Value
これを
s1.Range("B" & Maxrow).Value = .Range("B" & i).Value
に変えたら指定の列から抽出してくれるようになりました!ですが、検索値とは違うデータまでとってきてしまいます。
(yuki) 2015/07/01(水) 17:34

 ↑でもコメントしましたが c は K列の値ですね。で、c. ですからK列から見たB列(1つ右の列)なので L列が参照されているわけです。
 見つかった c の行の B列なら With c.EntireRow があるわけですから

 s1.Range("B" & Maxrow).Value = .Range("B1").Value なのでは?

 左辺が Maxrow でいいのかどうかは要件がわからないのでコメントできませんが。

(β) 2015/07/01(水) 18:02


こんにちは。
ちょっと実験してみませんか。

1)新規ブックで、適当なセル(J3としましょうか)を選択
2)マクロの記録開始
3)K5:L5セルを選択
4)マクロの記録終了
5)どんなコードが記録されたか想像してみる
実際に記録コードを見てみると、たぶん、あっと驚く
ようなコードができていると思います。

マクロの記録が間違っているわけではありません。
エクセル君はいつもこういう感覚でセルを選択したりしているのです。
それで、yukiさんのコードが図らずも おなじ形になっているので、
エクセル君はいつもしているとおり、L列だ、と思ってしまっているのです。

おなじ形になっていることがお分かりになるでしょうか。

( 佳 ) 2015/07/01(水) 18:37


βさん
>> s1.Range("B" & Maxrow).Value = .Range("B1").Value なのでは?
こちらですと検索値の名称で絞り込みされず、B1にある関係のない名称のセルの中身が転記されてしまいます……。
(yuki) 2015/07/02(木) 13:27

      For Each c In s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp))
            If c.Value = s1.Range("R1").Value Then
                With c.EntireRow
                    s1.Range("B" & Maxrow).Value = s.Range("B" & c.Row).Value

                    ………

                End With
                Maxrow = Maxrow + 1
            End If

    Next

 あてずっぽうで、s1.R1のセルの値に該当するs.B列の値ひっぱってきてみましたが…

(もあ) 2015/07/02(木) 14:36


 >>こちらですと検索値の名称で絞り込みされず、B1にある関係のない名称のセルの中身が転記されてしまいます……。

 いやぁ、それはないでしょう。コードでは B1 と指定していますが、これは いわゆるB1 ではなく

 With C.EntireRow を受けての .Range("B1") です。(ピリオド付)
 ですから、K列でヒットしたセル(つまり c) の行の B列の値になります。
 ちゃんと . (ピリオド)は付けてもらってますか?

(β) 2015/07/02(木) 14:50


こんにちは。

大事なところを書き漏らしていました。
★の部分を追加してください。

1)新規ブックで、適当なセル(J3としましょうか)を選択
2)マクロの記録開始
★)相対参照で記録するボタンをクリック
3)K5:L5セルを選択
4)マクロの記録終了
5)どんなコードが記録されたか想像してみる

( 佳 ) 2015/07/02(木) 19:09


皆さんありがとうございます。
もあさんのやり方でうまくいきました。

もう一つ質問させていただきたいのですが、条件を追加するにはどのように書き換えれば良いでしょうか?

Set r = sh.Range("I2", sh.Range("I" & sh.Rows.Count).End(xlUp)).Find(What:="有効", LookAt:=xlWhole)

K列が検索値"R1"と一致していて、なおかつI列が"有効"の行を抽出したいのですが……

(yuki) 2015/07/03(金) 11:32


 コードをきちんとすべてアップいただければ、す〜っと進むと思うんですがねぇ・・・

 sh. ですか? いままで、sh という名前のシート変数、でてきましたっけ?

 FindとFindNextを組み合わせたループになると思いますが、どこのデータで何を検索して、その結果の何をどこに転記したいのかが
 想像はできますけど、想像しなきゃいけないんでしょうか?

 これぐらいはきちんと(面倒がらずに)説明するか、最低でも、ちゃんと(sh が記述された)現在のコードを
 アップしましょうよ。

(β) 2015/07/03(金) 12:44


 そもそもが

        For Each c In s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp))
            Set c = s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp)).Find(What:=s1.Range("R1").Value, LookAt:=xlWhole)

 ここに強い疑問を感じています。

 K2以降のK列のセルを1つずつ取り出している意味が(コード全貌がみえないので)全く理解できません。
 実際のFindはs1.Range("R1").Valueで、sシートのK列を検索し、見つかったら何かをするんですよね。
 それを(同じことを)、何回も繰り返す、その意味が全くわかりませんね。
(β) 2015/07/03(金) 13:03

>K列が検索値"R1"と一致していて、なおかつI列が"有効"

 For Each c In s.Range("K2", s.Range("K" & s.Rows.Count).End(xlUp))
        If c.Value = s1.Range("R1").Value Then
            With c.EntireRow
                if .range("I1").value="有効"
                    s1.Range("B" & Maxrow).Value = .Range("B1").Value
                    ………
                Maxrow = Maxrow + 1
                End If
            End With
        End If
 Next

(マナ) 2015/07/03(金) 19:19


コメント返信:

[ 一覧(最新更新順) ]


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