[[20180612103342]] 『複数シートから検索し、結果を貼り付けたい』(ゆき) ページの最後に飛ぶ

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

 

『複数シートから検索し、結果を貼り付けたい』(ゆき)

給与一覧表での質問です。VBAを使用して処理をしたいと思っています。
1月、2月、3月とシートが12個あり、各シートには

A      |B   |C
社員コード |名前 |給与情報

といった感じで情報が載っています。
短期アルバイトが多いため、列は変動があります。

したいこと
1.シート1(1〜12月ではない別のシート)のA1セルに「名前」を入力すると、1〜12月のシートから「名前」の「行」をコピーする

2.シート1のA3からA4、A5といった風に順に貼り付けていく。

3.欲を言えば「シート名」をA3行、貼り付けをA4行とできれば最高です。

4.名前は1月、3月、6月といった風にとびとびの場合もあります。

ご教授いただけると助かります。

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


確認だけ。

>列は変動があります。
どのように変動するんでしょうか?

>2.シート1のA3からA4、A5といった風に順に貼り付けていく。
わからないけどこういうこと?
社員コード 名前 1月 2月  3月・・・・
00001   山田 1000  1000
00001   鈴木 2000 2000

>3.欲を言えば「シート名」をA3行、貼り付けをA4行とできれば最高です。
>4.名前は1月、3月、6月といった風にとびとびの場合もあります。
ちょっと意味がよく理解できませんでした。
具体例(レイアウト?)をあげてもらえると理解できるかもです。

(もこな2) 2018/06/12(火) 11:32


ありがとうございます!

>列は変動があります。
1月は勤務が30人、2月は40人、3月は30人といった形での変動になります。

>2.シート1のA3からA4、A5といった風に順に貼り付けていく。
シート1のA1セルに「山田」と入力すると

A      |B   |C
001     |山田 |給与情報 (1月分のシートから抜粋)
001     |山田 |給与情報 (2月分のシートから抜粋)
001     |山田 |給与情報 (4月分のシートから抜粋)
001     |山田 |給与情報 (6月分のシートから抜粋)


といった形にしたいです。
(ゆき) 2018/06/12(火) 11:37


ごめんなさい。聞き方が良くなかったですね。
項目が、A列、B列、C列ってあるのだから、人数が増えたら”行”が変動するとおもったんです。
なのに、”列”って仰ってるので、月によって項目が増えるのか、A〜C、D〜F、G〜Iっていうように3列セットでデータが1行に入っているのか、単に行と列を書き間違えたのか
どれかだとおもったので、その確認です。

とりあえず、列と行の書き間違えだとして、マクロで各月ごとのデータを一旦シート1に集約(コピー)してから、抽出についてはフィルタオプション機能を使ってみるという方向で考えてみてはどうでしょうか

(もこな2) 2018/06/12(火) 12:23


ども^^

1枚のシートに全部のデータをまとめてしまえば、
フィルターで絞り込んで、「見る」ことが可能です。
手動ですべてやってもそんなに苦になる作業ではないと思いますが、
いかがでしょうか。

で、その手順を自動化することで、いつも間違いなく素早く行うことが可能になります。
そして、その手順をエクセル君が解る言葉(=VBA)で書いてやると、
エクセル君はその通りに動いてくれます。

なので、

ただで誰かにアプリを作ってもらうつもりじゃなくて、
自分で作れるようになりたいと思っているのであれば、
まずは手動でのやり方を覚えて、
その操作を、マクロの記録という機能でVBAのコードに変換してみるところから、
マクロに入ってみてはいかがでしょうか?
それと並行して、入門書を読むなり、Webで入門系のサイトを見るなりして、
ある程度基礎も身に着ける必要があると思います。
(まっつわん) 2018/06/12(火) 12:36


まっつわんさんのコメントを拝見して、よく考えてみれば、月ごとのシートを集約するのなんてそんなに頻繁にやらないですね・・・
となると、マクロじゃなくて手動で十分な気がしてきましたが、一応、マクロで集約する処理のたたき台を作ってみました。

マクロで処理したいのであれば、ステップ実行等をして研究してみて、使えそうな部分があったらその部分だけ、ご自身のコードに組み込んでください。

    Sub Sample()
    Dim WS As Worksheet
    Dim srcRNG As Range, dstRNG As Range

    Stop '←ブレークポイントの代わり

    With ThisWorkbook.Worksheets("シート1")
        .Range("A5:D5").Value = _
            Array("社員コード", "名前", "給与情報", "由来シート")

        Set dstRNG = .Range("A6")
    End With

    For Each WS In ThisWorkbook.Worksheets
        If WS.Name <> dstRNG.Parent.Name Then
            Set srcRNG = Intersect(WS.UsedRange, WS.Range("A:C"))

            If Not srcRNG Is Nothing Then
                srcRNG.Copy dstRNG
                dstRNG.Offset(0, 3).Resize(srcRNG.Rows.Count, 1).Value = WS.Name
                Set dstRNG = dstRNG.Offset(srcRNG.Rows.Count, 0)
            End If
        End If
    Next WS

(もこな2) 2018/06/12(火) 13:49


もこな2さま、まっつわんさま、ありがとうございます!
お二人のお言葉を見て、自分なりにコードを記入してみました。
が、この方法だと、最初から1〜12月までのシートが必要であること(1〜12までタブがある場合うまく作動しました!)

まとめシートに膨大なデータが残るのでそれの処理方法をどうすべきかまだ勉強すべきことが多々ある気がします。

もこな2様のマクロを今拝見したので、自分に落とし込めないか確認しながら勉強していきたいと思います、ありがとうございました!

Sub test()

Dim i As String
i = Sheets("まとめ").Range("A1") 'i=まとめシートのA1へ人名を記入するため
Dim tuki
tuki = 1

Dim LstRow1 As Long
Dim LstRow2 As Long

Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "結果"
'「結果」シートを最後尾に作成

For tuki = 1 To 12

'最終行の取得

    LstRow1 = Worksheets(tuki & "月分").Cells(Rows.Count, 1).End(xlUp).Row
    LstRow2 = Worksheets("まとめ").Cells(Rows.Count, 1).End(xlUp).Row

'タイトル行を除き、まとめへコピー、貼り付け

    Worksheets(tuki & "月分").Range("A2:U" & LstRow1).Copy
    Worksheets("まとめ").Range("A" & LstRow2).Offset(1, 0).PasteSpecial xlPasteAll

Next tuki

With Sheets("まとめ").Range("B10")
.AutoFilter Field:=2, Criteria1:=i
.CurrentRegion.Copy Sheets("結果").Range("A1")
End With
'フィルターしてiを抽出、結果に貼り付け

End Sub

(ゆき) 2018/06/12(火) 17:12


>この方法だと、最初から1〜12月までのシートが必要であること(1〜12までタブがある場合うまく作動しました!)
遅レスですが、いったん全部のシートを対象にループを回してしまい、処理の手前で対象じゃないシートは除外するように仕掛けてみるとよいと思います。

    Sub Sample1()
        Dim i As Long

        For i = 1 To Worksheets.Count
            If Worksheets(1).Name <> "まとめ" And Worksheets(1).Name <> "結果" Then
                '処理
            End If
        Next i
    End Sub

    Sub Sample2()
        Dim ws As Worksheet

        For Each ws In Worksheets
            If ws.Name Like "*月分" Then
                '処理
            End If
        Next ws
    End Sub
(もこな2) 2018/06/14(木) 07:56

もこな2様

今更の返信で申し訳ありません。
下のマクロで1〜6月までの状態で無事処理することができました!!!

        For Each ws In Worksheets
            If ws.Name Like "*月分" Then
                '処理
            End If

こちらの処理は初めて知りました。勉強になります……!
思いつきもしなかったので本当にありがたいです!
また質問させていただくことがあるかもしれませんが、よろしくお願いします!
(ゆき) 2018/06/19(火) 10:39


そちらを採用されるのであれば、For Each〜Nextステートメント、Like演算子の復習をしておいたほうがいいかもですね。

For Each〜Nextステートメント
https://www.vba-ie.net/statement/foreachnext.html

Like演算子
http://officetanaka.net/excel/vba/tips/tips35.htm

(もこな2) 2018/06/19(火) 12:48


もこな2様

まだまだ入門書を1冊読み切った程度で知らないことが多いので、本当に参考になります…!
Like演算子は否定もできるということで、できることの幅が広がりそうです…!

For〜Nextは普段よく使用していたのですが、For Each〜Nextは初めて使用します。
リンク先の文章をよく読んで使用していきたいと思います。ありがとうございます!
(ゆき) 2018/06/19(火) 13:15


コメント返信:

[ 一覧(最新更新順) ]


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