Page 759 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼一致するデータ行を抽出したいのですが 平 03/2/10(月) 16:00 ┣結果は得られるようになりましたが・・・ 平 03/2/10(月) 17:35 ┗Re:一致するデータ行を抽出したいのですが ichinose 03/2/10(月) 23:36 ┗Re:一致するデータ行を抽出したいのですが Jaka 03/2/13(木) 10:27 ┣コピペ失敗 Jaka 03/2/13(木) 10:29 ┗ありがとうございました 平 03/2/14(金) 13:30 ┗Re:ありがとうございました Jaka 03/2/14(金) 14:41 ┗Re:ありがとうございました 平 03/2/14(金) 18:17 ┗他のファイルから抽出するには? 平 03/2/14(金) 18:46 ┣解決できそうですが・・・ 平 03/2/17(月) 10:18 ┃ ┗一部訂正 平 03/2/17(月) 10:21 ┃ ┗Re:一部訂正 Jaka 03/2/17(月) 12:57 ┃ ┗Re:一部訂正 平 03/2/17(月) 17:56 ┃ ┗Re:一部訂正 Jaka 03/2/18(火) 10:17 ┗Re:他のファイルから抽出するには? Jaka 03/2/17(月) 10:30 ┗Re:他のファイルから抽出するには? 平 03/2/17(月) 17:50 ─────────────────────────────────────── ■題名 : 一致するデータ行を抽出したいのですが ■名前 : 平 ■日付 : 03/2/10(月) 16:00 -------------------------------------------------------------------------
またまたお世話になります。 ヘルプなどを見て抽出マクロを組んでみたのですが うまく動かないようなので、どの辺りがおかしいのか ご教授願います。 やっている事は「元」シートにデータがあり、それのA列のセルに 入ってる文字列と「抽出」シートのA1セルにある文字列が同じ場合に 「元」シートから「抽出」シートにその行を抜き出して表示する と言った具合です。 下記のを実行させた場合「元」シートのA列に 111 222 222 222 333 444 444 444 444 444 とあり、「抽出」シートのA1セルに444を指定して実行すると 444を4つしか転写しません(本来は5つ転写するはずなのですが)。 どうやら対象の文字列が見つかっても、一つ目は転写せず 二つ目以降が転写の対象となっているようです。 どこに不備があるのでしょうか? Sub 抽出します() Dim I As Integer, J As Integer J = 2 '「抽出」シートの2行目以降に転写する為 For I = 1 To 10 With Worksheets("元").Cells(I, 1) If .Value = Worksheets("抽出").Cells(1, 1) Then Rows(I & ":" & I).Select Selection.Cut Sheets("抽出").Select Rows(J & ":" & J).Select ActiveSheet.Paste Sheets("元").Select J = J + 1 End If End With Next End Sub |
いろいろと自分なりに試してみた結果、「元」シートを 選択(アクティブ状態)している時に実行させると 思う通りに作動し、「抽出」シート選択している時に 実行させると不都合が生じているようでしたので 変数宣言の後に Worksheets("元").Select を追加したら、うまく実行できました。 しかしなぜ選択しているシートによって実行内容が おかしくなるのかがわかりません。 どなたかご指導お願い致します。 |
▼平 さん: こんばんは。 >またまたお世話になります。 > >ヘルプなどを見て抽出マクロを組んでみたのですが >うまく動かないようなので、どの辺りがおかしいのか >ご教授願います。 > >やっている事は「元」シートにデータがあり、それのA列のセルに >入ってる文字列と「抽出」シートのA1セルにある文字列が同じ場合に >「元」シートから「抽出」シートにその行を抜き出して表示する >と言った具合です。 >下記のを実行させた場合「元」シートのA列に >111 >222 >222 >222 >333 >444 ↑この「444」を正しく抽出していないということでしょう >444 >444 >444 >444 >とあり、「抽出」シートのA1セルに444を指定して実行すると >444を4つしか転写しません(本来は5つ転写するはずなのですが)。 >どうやら対象の文字列が見つかっても、一つ目は転写せず >二つ目以降が転写の対象となっているようです。 >どこに不備があるのでしょうか? > > >Sub 抽出します() > >Dim I As Integer, J As Integer >J = 2 '「抽出」シートの2行目以降に転写する為 > >For I = 1 To 10 > With Worksheets("元").Cells(I, 1) > If .Value = Worksheets("抽出").Cells(1, 1) Then > Rows(I & ":" & I).Select ' ↑抽出シートをアクティブにして実行すれば抽出シートの行を選択します > Selection.Cut > Sheets("抽出").Select > Rows(J & ":" & J).Select > ActiveSheet.Paste > Sheets("元").Select '次の検索からは↑が効いているので抽出されているのでしょうね > J = J + 1 > End If > End With >Next > >End Sub |
こんにちは。 今ごろ出てきても見ないと思いますが...。 >「抽出」シート選択している時に実行させると不都合が生じている。 原因、Withの使い方が中途半端。 With Worksheets("元").Cells(I, 1) としている割に影響があるのは、 If .Value = Worksheets("抽出").Cells(1, 1) Then の.Value だけ。 ですから Rows(I & ":" & I).Select となどと書いても対象は、全てアクティブシートだけ。 その辺りをわかってWith〜End Withを使わないと今回みたいな事になってしまいます。 最初は、With〜End Withを使わずに面倒ですが、すべてのセル参照を Worksheets("○○").Cells(1, 1).Value として記述した方が良いかもしれません。 間違いを正すと、こんな感じ...。 (Selectしない書き方の方がすっきりすると思いますが) Sub 抽出します() Dim I As Integer, J As Integer J = 2 '「抽出」シートの2行目以降に転写する為 For I = 1 To 10 With Worksheets("元") If .Cells(I, 1).Value = Worksheets("抽出").Cells(1, 1) Then .Rows(I & ":" & I).Cut Sheets("抽出").Select Rows(J & ":" & J).Select ActiveSheet.Paste .Select J = J + 1 End If End With Next |
最後に End Sub いれてね。 |
ichinoseさん、Jakaさん、ありがとうございました。 >原因、Withの使い方が中途半端。 実際そのとおりかと思います、私もまだまだ勉強不足なものですから 他のプログラムでうまく動いたのをそのまま持ってきて使っていたり するので、実際にどういう動きをさせる命令か覚えていない事が 多いものですから。 For Each WS In Worksheets With Worksheets(WS.Name).Cells(I, 1)・・・ 実際は上記のような感じで複数のシートにこの命令を使いたかったのですが 最初にこれで動かなかったので、個別のシートを選択したもので 質問させて頂いてました。 とはいえ、これでも正しい使い方かどうかわからないのですが・・・ |
こんにちは。 >For Each WS In Worksheets >With Worksheets(WS.Name).Cells(I, 1)・・・ ↓ こんな感じで....かな? Dim WS as WorkSheet For Each WS In Worksheets With WS I = 1 .Cells(I, 1)・・・ |
▼Jaka さん: >こんにちは。 > >>For Each WS In Worksheets >>With Worksheets(WS.Name).Cells(I, 1)・・・ > > ↓ こんな感じで....かな? > >Dim WS as WorkSheet >For Each WS In Worksheets > With WS > I = 1 > .Cells(I, 1)・・・ ↓ こんな感じです CD = InputBox("コードを入力して下さい") J = 1 For Each WS In Worksheets For I = 1 To 10 Worksheets("TIM").Select With Worksheets("TIM").Cells(I, 7) If .Value = CD Then Worksheets(WS.Name).Cells(J, 1) = Worksheets("TIM").Cells(I, 3) Worksheets(WS.Name).Cells(J, 2) = Worksheets("TIM").Cells(I, 7) Worksheets(WS.Name).Cells(J, 4) = Worksheets("TIM").Cells(I, 6) Worksheets(WS.Name).Cells(J, 8) = Worksheets("TIM").Cells(I, 8) Worksheets(WS.Name).Cells(J, 10) = Worksheets("TIM").Cells(I, 13) Worksheets(WS.Name).Cells(J, 11) = Worksheets("TIM").Cells(I, 15) J = J + 1 End If End With Next I Next WS 本当はもっとありますが、こんな感じで作ってます。シート「TIM」に データがあり、インプットボックスで入力したコードと同じものがあれば 今選んでいるシートにデータを書き写す、って事をやってます。 (上記に載せてない部分を消した時に必要な部分まで消してるかも・・・) |
>CD = InputBox("コードを入力して下さい") >J = 1 >For Each WS In Worksheets > For I = 1 To 10 > Worksheets("TIM").Select > With Worksheets("TIM").Cells(I, 7) > If .Value = CD Then > Worksheets(WS.Name).Cells(J, 1) = Worksheets("TIM").Cells(I, 3) > Worksheets(WS.Name).Cells(J, 2) = Worksheets("TIM").Cells(I, 7) > Worksheets(WS.Name).Cells(J, 4) = Worksheets("TIM").Cells(I, 6) > Worksheets(WS.Name).Cells(J, 8) = Worksheets("TIM").Cells(I, 8) > Worksheets(WS.Name).Cells(J, 10) = Worksheets("TIM").Cells(I, 13) > Worksheets(WS.Name).Cells(J, 11) = Worksheets("TIM").Cells(I, 15) > J = J + 1 > End If > End With > Next I >Next WS 追加で質問になるのですが、上記のコードは同じファイル内の異なるシートから データを抽出していますが、これを他のファイルにあるシートから抽出するように するにはどうすればよいのでしょうか? (シート「TIM」が別のファイル「DATA」にある、という場合です) |
休みの間にいろいろ考えて下記のような方法を思いつきました。 こういう感じで抽出する以外の方法はあるのでしょうか? Sub TEST() ' NT2.xlsにこのマクロはあります Dim I As Integer, J As Integer Dim RA(10) As Variant, RB(10) As Integer ' データの入っているファイルを開いて値を変数に入れる Workbooks.Open Filename:=ThisWorkbook.Path & "\NT1.xls" For I = 1 To 10 RA(I) = Worksheets("DATA").Cells(I, 1) RB(I) = Worksheets("DATA").Cells(I, 2) Next ' 転写先のファイルに抽出して書き込む Windows("NT2.XLS").Activate For I = 1 To 10 For J = 1 To 5 If Worksheets("TEST").Cells(I, 1).Value = RA(J) Then Cells(I, 2) = RB(J) End If Next J Next I ' データファイルを閉じる Worksheets("DATA").Select ActiveWindow.Close End Sub |
>' データファイルを閉じる >Worksheets("DATA").Select ↓ Windows("NT1.XLS").Activate でした。 |
>こういう感じで抽出する以外の方法はあるのでしょうか? 手法1として書いてありますので、抽出元抽出先に関してはでたらめです。 こうすると、抽出元のブックを開かないで済みます。 (関数を残したまま保存すると次回開いた時にリンクうんぬんのダイアログが出てしまいます。) Dim WS As Worksheet Dim Hword As String '↓判定用のWordを全く使わないようなセルに関数を入れて返り値を取得後関数を消す。 Range("IV1").Value = "='" & ThisWorkbook.Path & "\[NT1.xls]TIM'!$C$2" Hword = ange("IV1").Value Range("IV1").ClearContents For i = 1 To 10 If Worksheets("TEST").Cells(i, 1).Value = Hword Then '書き込みたいセルに関数を入れ、その返り値を自分に入れる。 Cells(i, 2).Formula = "='" & ThisWorkbook.Path & "\[NT1.xls]TIM'!$C$" & i Cells(i, 2).Value = Cells(i, 2).Value End If Next |
▼Jaka さん: >(関数を残したまま保存すると次回開いた時にリンクうんぬんのダイアログが出てしまいます。) 今の所、そういった類のダイアログは出てないのですが、たまたま 運(?)が良いだけなんでしょうか。 ちなみに”関数を残したまま保存”というのは、関数の中に値を 代入した形で保存、という意味なのでしょうか?もしそうなら 最後に関数の値を""とかにすれば大丈夫なのかなぁ、と 素人としては思ってしまうのですが・・・。 |
>ちなみに”関数を残したまま保存”というのは、関数の中に値を >代入した形で保存、という意味なのでしょうか?もしそうなら >最後に関数の値を""とかにすれば大丈夫なのかなぁ、と >素人としては思ってしまうのですが・・・。 え〜と、他のブックを参照している関数を残したままと言う事です。 こんな感じの関数。 ='C:\WINDOWS\デスクトップ\[NT1.xls]TIM'!$C$2 最後に関数の値を""とかにしても、他ブックを参照して結果を出しているって事は、結局は参照(リンク)してると言う事です。 まとめると、 "=1+1" の文字をセルに入れると、エクセルは文字としてではなく関数として扱います。 この関数として扱われた文字が他のブックを参照している関数だった場合、次回開いた時に「参照先のブックとリンクしてデータを新しい物にしますか?」等のアラートが出てしまうと言う事です。 全然まとまっていませんが、こう言う事です。 理解不能なら..。 ブックを2つ作って、1つのブックに片方のセルを参照する関数を書き込んで終了保存後、関数を書き込んだブックを開いて見て下さい。 |
おはようございます。 取りあえずこっちの方だけ。 [#3731] Dim WS As Worksheet CD = InputBox("コードを入力して下さい") J = 1 For Each WS In Worksheets If WS.Name <> "TIM" Then For I = 1 To 10 With Worksheets("TIM") If .Cells(I, 7).Value = CD Then WS.Cells(J, 1) = .Cells(I, 3) WS.Cells(J, 2) = .Cells(I, 7) WS.Cells(J, 4) = .Cells(I, 6) WS.Cells(J, 8) = .Cells(I, 8) WS.Cells(J, 10) = .Cells(I, 13) WS.Cells(J, 11) = .Cells(I, 15) J = J + 1 End If End With Next I End If Next WS [#3733] 注)DATAブックが開いてないとエラーになります。。 Dim WS As Worksheet CD = InputBox("コードを入力して下さい") J = 1 For Each WS In Worksheets For I = 1 To 10 With Workbooks("DATA.xls").Worksheets("TIM") If .Cells(I, 7).Value = CD Then WS.Cells(J, 1) = .Cells(I, 3) WS.Cells(J, 2) = .Cells(I, 7) WS.Cells(J, 4) = .Cells(I, 6) WS.Cells(J, 8) = .Cells(I, 8) WS.Cells(J, 10) = .Cells(I, 13) WS.Cells(J, 11) = .Cells(I, 15) J = J + 1 End If End With Next I Next WS |
Jaka さん、ありがとうございます。 ええっと・・・つまりwithを使ってるにも関わらず 余計な宣言をしすぎだ、って事ですよね。 実は先程ヘルプを見るまでwithの意味を知りませんでした(汗)。 随分、無駄な書き方をしてたという事ですね。 精進せねば、と思う今日この頃です。 今後もまた何かあった時には宜しくお願い致します。 |