Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2039 / 13645 ツリー ←次へ | 前へ→

【70341】複数のシートからデータを抽出するマクロ JIRORO 11/11/3(木) 11:19 質問[未読]
【70342】Re:複数のシートからデータを抽出するマクロ UO3 11/11/3(木) 12:00 発言[未読]
【70343】Re:複数のシートからデータを抽出するマクロ JIRORO 11/11/3(木) 12:42 回答[未読]
【70348】Re:複数のシートからデータを抽出するマクロ UO3 11/11/3(木) 19:22 回答[未読]
【70353】Re:複数のシートからデータを抽出するマクロ JIRORO 11/11/4(金) 20:30 お礼[未読]

【70341】複数のシートからデータを抽出するマクロ
質問  JIRORO  - 11/11/3(木) 11:19 -

引用なし
パスワード
   題名あるようなマクロを調べて作成したのですがうまく機能しません
f = c.Row
の場所がよくないのかいろいろ試してみたのですが、わかりません。
ご指導いただければありがたいです。

Sub selectfoundsheets()

Dim las As Long
Dim sh2 As Worksheet
Dim a As String

Set sh2 = Worksheets("test")

a = ActiveCell.Value
las = 1


For Each s In Worksheets

  vx = MsgBox(s.Name & "を検索しますか", vbYesNo)

  If vx = vbYes Then
    
    s.Select
      
    Set c = s.Range("B:B").Find(what:=a)
 
    If Not c Is Nothing Then

      f = c.Row
      
      Do
        ' f = c.Row

        s.Range(s.Cells(f, 1), s.Cells(f, 7)).Copy

        sh2.Cells(las, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
          :=False, Transpose:=False

        las = sh2.Cells(Rows.Count, 1).End(xlUp).Row + 1

         Set c = Cells.FindNext(c)
        
        'f = c.Row

      Loop While Not c Is Nothing And c.Row <> f
      
      'f = c.Row

    End If


  End If
  
Next s


End Sub

【70342】Re:複数のシートからデータを抽出するマ...
発言  UO3  - 11/11/3(木) 12:00 -

引用なし
パスワード
   ▼JIRORO さん:

こんにちは

f=c.Rowをコメントアウトしてあるとこるは、実行時にもコメントアウトされているということですね。
うまく機能しないというのが具体的にどんなことなのか、○○になってほしいのに、□□になってしまうということを
説明されてはいかがでしょう。

ついでにというか、やりたいことも具体的にかかれてはいかが?
コードを読んでくださいじゃなく、ブック内のtestシート「以外」のシートのB列に、「指定の値」があれば
その行のA列からF列までをtestシートに転記していくというものでしょうけど。

コードとしては、気になるところはちらほらあります。
上で、ことさら「」をつけたところ、よくコードを見てくださいね。
a = ActiveCell.Value
これは、どのシートの値なのかな?とか。
Findについてもヘルプをよく読んでみてください。
パラメータの省略の影響なんかが記載されています。
また、このコードではエラーにはなりませんが、ヘルプにも書かれている
Loop While Not c Is Nothing And c.Row <> f
これは、間違いコードです。(それをほったらかしにして記載しているMSにも困ったもんです)
値の転記はCopy/Pasteでもいいですけど、通常は 転記先領域.Value = 転記元領域.Value とかきます。

等々、あるんですけど、いずれにしても具体的に何がうまくいかないのかをおしえてください。

【70343】Re:複数のシートからデータを抽出するマ...
回答  JIRORO  - 11/11/3(木) 12:42 -

引用なし
パスワード
   ご返事ありがとうございます。
確かにかなり乱暴な質問でした。申し訳ありません。

もともとは一つのシートにあるデータの中から条件に合うものを抽出(フィルタオプション)して別シートに張り付ける、といったマクロを使用していたのですが元のデータの量が増え複数のシートになったので、それに見合ったマクロを作成しようと思っています。

もともとイメージとしては複数のシートのデータを変数を使ってまとめてその中で抽出して別シートに張り付ける、といったものなのですがだいぶ難しそうだったので、とりあえず能率は悪くても思っていることができるものを作ってみようと。

やろうと試みていることは確かに

ブック内のtestシート「以外」のシートのB列に、「指定の値」があれば
その行のA列からF列までをtestシートに転記していくというもの

です。

a = ActiveCell.Valueに関しては「とりあえず」作ってみたかったので非常に雑でしたが、後で直そうかと思っていました。

アドバイスを頂ければありがたいです。

追伸、誠に申し訳ないのですがこのあと仕事で出張のために戻ってこられるのが明日になります。よろしくお願いします。

【70348】Re:複数のシートからデータを抽出するマ...
回答  UO3  - 11/11/3(木) 19:22 -

引用なし
パスワード
   ▼JIRORO さん:

出張、おつかれさまでした。

コードで気になるところは多々あるのですが、直接の間違いポイントは
s.Range(s.Cells(f, 1), s.Cells(f, 7)).Copy
f は このシートで最初に見つかったセルの行番号ですから、常に、この行の内容がコピペされます。
かといって、毎回、この f を変更すると、ループでの最終制御ができなくなります。
s.Range(s.Cells(c.Row, 1), s.Cells(c.Row, 7)).Copy
こうすれば、とりあえずはOKになるはずです。

ところで、Set c = s.Range("B:B").Find(what:=a)
Findメソッドで検索開始セルを指定しない場合、その領域の最初が検索開始セルになります。
一見、よさそうに見えますが、実は、検索開始セルの「次から」検索しなさいという機能なので
これでは、B1の次からという意味になってしまい、B1が最後に検索されます。
ですから、仮に、B1に検索値と同じものが入っていても、それはtestシートの下の方にコピペされることになります。
対応策としては、その領域の最後のセルを開始セルにします。
実際には開始セルの次からの検索ですから、つまりB1からということになります。

そのほかの構成は、基本、アップされたコードのままで、ちょっとお化粧直しをしたものが以下です。
( f を行番号で使っておられますが、以下ではセルアドレス変数にしてあります)

Sub Sample()
  Dim s As Worksheet
  Dim sh2 As Worksheet
  Dim myR As Range
  Dim a As Variant
  Dim c As Range
  Dim f As Range
  Dim las As Long
  
  las = 1
  Set sh2 = Sheets("test")
  sh2.Columns("A:G").ClearContents
  
  a = sh2.Range("H1").Value '仮です
  
  For Each s In Worksheets
    If Not s Is sh2 Then  'testシート以外を対象に
      If MsgBox(s.Name & "を検索しますか", vbYesNo) = vbYes Then
        Set myR = s.Range("B1", s.Range("B" & s.Rows.Count).End(xlUp))
        Set c = myR(myR.Cells.Count)
        Set c = myR.Find(what:=a, After:=c, LookIn:=xlFormulas, LookAt:=xlPart, _
            SearchOrder:=xlByRows, SearchDirection:=xlWhole, _
            MatchCase:=False, MatchByte:=False, SearchFormat:=False)
        If Not c Is Nothing Then
          Set f = c
          Do
            sh2.Cells(las, 1).Resize(, 7).Value = s.Cells(c.Row, "A").Resize(, 7).Value
            las = sh2.Cells(sh2.Rows.Count, 1).End(xlUp).Row + 1
            Set c = myR.FindNext(c)
          Loop While c.Address <> f.Address
        End If
      End If
    End If
  Next
  
  sh2.Select
  Set sh2 = Nothing
  Set c = Nothing
  Set f = Nothing
  
  MsgBox "貼り付けが終了しました"
  
End Sub

【70353】Re:複数のシートからデータを抽出するマ...
お礼  JIRORO  - 11/11/4(金) 20:30 -

引用なし
パスワード
   UO3 さん:

親切な御回答ありがとうございます。

Findメソッドに関しても勉強不足を痛感しています。

ちょっと化粧直しというよりまったく別のマクロでしかも速いです。

変数もまだまだ苦手なのでじっくり読ませていただいて勉強させていただきます。

ありがとうございました。

2039 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free