[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『違う列が抽出される』(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 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
(yuki) 2015/07/01(水) 17:02
↑でもコメントしましたが 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
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
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.