過去ログ

                                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
 ───────────────────────────────────────  ■題名 : 結果は得られるようになりましたが・・・  ■名前 : 平  ■日付 : 03/2/10(月) 17:35  -------------------------------------------------------------------------
   いろいろと自分なりに試してみた結果、「元」シートを
選択(アクティブ状態)している時に実行させると
思う通りに作動し、「抽出」シート選択している時に
実行させると不都合が生じているようでしたので
変数宣言の後に

Worksheets("元").Select

を追加したら、うまく実行できました。
しかしなぜ選択しているシートによって実行内容が
おかしくなるのかがわかりません。
どなたかご指導お願い致します。
 ───────────────────────────────────────  ■題名 : Re:一致するデータ行を抽出したいのですが  ■名前 : ichinose  ■日付 : 03/2/10(月) 23:36  -------------------------------------------------------------------------
   ▼平 さん:
こんばんは。
>またまたお世話になります。
>
>ヘルプなどを見て抽出マクロを組んでみたのですが
>うまく動かないようなので、どの辺りがおかしいのか
>ご教授願います。
>
>やっている事は「元」シートにデータがあり、それの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
 ───────────────────────────────────────  ■題名 : Re:一致するデータ行を抽出したいのですが  ■名前 : Jaka  ■日付 : 03/2/13(木) 10:27  -------------------------------------------------------------------------
   こんにちは。
今ごろ出てきても見ないと思いますが...。

>「抽出」シート選択している時に実行させると不都合が生じている。
原因、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
 ───────────────────────────────────────  ■題名 : コピペ失敗  ■名前 : Jaka  ■日付 : 03/2/13(木) 10:29  -------------------------------------------------------------------------
   最後に
End Sub いれてね。
 ───────────────────────────────────────  ■題名 : ありがとうございました  ■名前 : 平  ■日付 : 03/2/14(金) 13:30  -------------------------------------------------------------------------
   ichinoseさん、Jakaさん、ありがとうございました。

>原因、Withの使い方が中途半端。
実際そのとおりかと思います、私もまだまだ勉強不足なものですから
他のプログラムでうまく動いたのをそのまま持ってきて使っていたり
するので、実際にどういう動きをさせる命令か覚えていない事が
多いものですから。

For Each WS In Worksheets
With Worksheets(WS.Name).Cells(I, 1)・・・

実際は上記のような感じで複数のシートにこの命令を使いたかったのですが
最初にこれで動かなかったので、個別のシートを選択したもので
質問させて頂いてました。
とはいえ、これでも正しい使い方かどうかわからないのですが・・・
 ───────────────────────────────────────  ■題名 : Re:ありがとうございました  ■名前 : Jaka  ■日付 : 03/2/14(金) 14:41  -------------------------------------------------------------------------
   こんにちは。

>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)・・・
 ───────────────────────────────────────  ■題名 : Re:ありがとうございました  ■名前 : 平  ■日付 : 03/2/14(金) 18:17  -------------------------------------------------------------------------
   ▼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」に
データがあり、インプットボックスで入力したコードと同じものがあれば
今選んでいるシートにデータを書き写す、って事をやってます。
(上記に載せてない部分を消した時に必要な部分まで消してるかも・・・)
 ───────────────────────────────────────  ■題名 : 他のファイルから抽出するには?  ■名前 : 平  ■日付 : 03/2/14(金) 18:46  -------------------------------------------------------------------------
   >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」にある、という場合です)
 ───────────────────────────────────────  ■題名 : 解決できそうですが・・・  ■名前 : 平  ■日付 : 03/2/17(月) 10:18  -------------------------------------------------------------------------
   休みの間にいろいろ考えて下記のような方法を思いつきました。
こういう感じで抽出する以外の方法はあるのでしょうか?


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
 ───────────────────────────────────────  ■題名 : 一部訂正  ■名前 : 平  ■日付 : 03/2/17(月) 10:21  -------------------------------------------------------------------------
   >' データファイルを閉じる
>Worksheets("DATA").Select
     ↓
Windows("NT1.XLS").Activate

でした。
 ───────────────────────────────────────  ■題名 : Re:一部訂正  ■名前 : Jaka  ■日付 : 03/2/17(月) 12:57  -------------------------------------------------------------------------
   >こういう感じで抽出する以外の方法はあるのでしょうか?

手法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
 ───────────────────────────────────────  ■題名 : Re:一部訂正  ■名前 : 平  ■日付 : 03/2/17(月) 17:56  -------------------------------------------------------------------------
   ▼Jaka さん:
>(関数を残したまま保存すると次回開いた時にリンクうんぬんのダイアログが出てしまいます。)

今の所、そういった類のダイアログは出てないのですが、たまたま
運(?)が良いだけなんでしょうか。

ちなみに”関数を残したまま保存”というのは、関数の中に値を
代入した形で保存、という意味なのでしょうか?もしそうなら
最後に関数の値を""とかにすれば大丈夫なのかなぁ、と
素人としては思ってしまうのですが・・・。
 ───────────────────────────────────────  ■題名 : Re:一部訂正  ■名前 : Jaka  ■日付 : 03/2/18(火) 10:17  -------------------------------------------------------------------------
   >ちなみに”関数を残したまま保存”というのは、関数の中に値を
>代入した形で保存、という意味なのでしょうか?もしそうなら
>最後に関数の値を""とかにすれば大丈夫なのかなぁ、と
>素人としては思ってしまうのですが・・・。

え〜と、他のブックを参照している関数を残したままと言う事です。
こんな感じの関数。
='C:\WINDOWS\デスクトップ\[NT1.xls]TIM'!$C$2

最後に関数の値を""とかにしても、他ブックを参照して結果を出しているって事は、結局は参照(リンク)してると言う事です。

まとめると、
"=1+1" の文字をセルに入れると、エクセルは文字としてではなく関数として扱います。
この関数として扱われた文字が他のブックを参照している関数だった場合、次回開いた時に「参照先のブックとリンクしてデータを新しい物にしますか?」等のアラートが出てしまうと言う事です。
全然まとまっていませんが、こう言う事です。

理解不能なら..。
ブックを2つ作って、1つのブックに片方のセルを参照する関数を書き込んで終了保存後、関数を書き込んだブックを開いて見て下さい。
 ───────────────────────────────────────  ■題名 : Re:他のファイルから抽出するには?  ■名前 : Jaka  ■日付 : 03/2/17(月) 10:30  -------------------------------------------------------------------------
   おはようございます。

取りあえずこっちの方だけ。

[#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
 ───────────────────────────────────────  ■題名 : Re:他のファイルから抽出するには?  ■名前 : 平  ■日付 : 03/2/17(月) 17:50  -------------------------------------------------------------------------
   Jaka さん、ありがとうございます。

ええっと・・・つまりwithを使ってるにも関わらず
余計な宣言をしすぎだ、って事ですよね。
実は先程ヘルプを見るまでwithの意味を知りませんでした(汗)。
随分、無駄な書き方をしてたという事ですね。

精進せねば、と思う今日この頃です。
今後もまた何かあった時には宜しくお願い致します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 759