【iOS版アプリ】不具合のお知らせ

同じブック内の複数シートの中から単語を検索し、
該当列を新規シートに貼り付けるVBAに苦戦しています。
列から数量の項目も同時に集計できると有難いですが、
集計はSUMでも構わないかなと思いますので、
複数シートから抽出するVBAを教えていただけないでしょうか?

マクロやVBAは初めての初心者です。
これが出来ると作業の効率化がかなり出来るので頑張りたいのですが
かなり苦戦しています。。

宜しくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    仰る通りです。。
    説明不足にも関わらず、とても親切なご回答を頂き本当に感謝しています。


    補足ですが、
    ブック内は日付ごとにシートを作っています。
    シート名「1日」「2日」「3日」…「31日」 計31シートあります。

    一番最後に検索用のシートを作り、
    検索したい品目を入力しボタンを押すと該当列が抽出されるVBAを作りたいと思っています。

    VBAの基礎知識などのサイトなどを見て勉強していますが、
    なかなか頭に入っていかず、VBAを貼り付け実行するまでの流れしか分かっていません。。

    ネットで検索して、同じような内容のVBAを貼り付けたりしましたが
    中身のどこを変えればいいのか分からずうまくいきませんでした。

    ご教授頂けますと幸いです。
    何卒宜しくお願いいたします。

      補足日時:2021/08/19 10:18
  • 補足です。

    1日~31日のレイアウトは同じになります。
    毎日約350行くらい入力があります。
    検索対象は、シート1日~31日の「得意先品番」です。


    tatumaru77様より回答頂きました、
    レイアウトの画像になります。

    レイアウト
    https://gyazo.com/f2449ad8b86de04a3ae3d7ae23b84d43

    検索用
    https://gyazo.com/b5f2ffc90dc952ea78f38a76d765c024



    検索用は2行目あたりに検索用のボタンを置きたいと思っています。
    7行目から抽出した行が張り付けられると有難いです。

    すみません。
    1点訂正ですが、
    上記で「該当列の抽出」と書いてしまっていますが、「該当行」の間違いです。。

      補足日時:2021/08/20 09:45
gooドクター

A 回答 (9件)

No5,7です。


以下のマクロを標準モジュールに設定してください。

使用時の注意事項です。
検索シートは必ず、一番左側に配置してください。
B列の入荷日がxx月xx日のように表示されない場合は、書式設定で、B列全体ををその形式の日付にしてください。
一度設定すれば、以降は設定不要です。
(他の列も望んだ書式設定にしてください。)

Public Sub シート検索()
Dim fs As Worksheet '検索用シート
Dim ws As Worksheet '1~31日用シート
Dim hinban As String '検索対象文字(得意先品番)
Dim dd As Long '日付
Dim frow As Long '検索シート出力行番号
Dim ws_name As String '日付シート名
Dim maxrow As Long
Dim wrow As Long
Set fs = Worksheets(1)
hinban = fs.Cells(3, "F").Value
If hinban = "" Then Exit Sub
fs.Rows("7:" & Rows.Count).ClearContents
frow = 7
For Each ws In Worksheets
If ws.Index <> 1 Then
maxrow = ws.Cells(Rows.Count, 1).End(xlUp).Row '最大行取得
For wrow = 3 To maxrow
If hinban = ws.Cells(wrow, "F").Value Then
fs.Range("A" & frow & ":L" & frow).Value = ws.Range("A" & wrow & ":L" & wrow).Value
frow = frow + 1
End If
Next
End If
Next
If frow = 7 Then
MsgBox (hinban & "は見つかりませんでした")
Exit Sub
End If
fs.Cells(frow, "H").Value = Application.WorksheetFunction.sum(fs.Range("H7:H" & frow - 1))
fs.Cells(frow, "L").Value = Application.WorksheetFunction.sum(fs.Range("L7:L" & frow - 1))
MsgBox ("検索完了")
End Sub
    • good
    • 1
この回答へのお礼

出来ました!!
嬉しすぎて声を上げてしまいました。
tatsumaru77様、本当に感謝しています!!

皆さんご親切に丁寧に回答頂き、本当に有難うございます!
私一人じゃどうにもなりませんでした。
今回tatsumaru77様をベストアンサーに選ばせていただきますが、
皆様本当に有難うございました。

お礼日時:2021/08/20 14:09

No8です。


追伸:
検索文字は検索用シートのF3に設定してください。
    • good
    • 1

>列から数量の項目も同時に集計できると有難いですが、


>集計はSUMでも構わないかなと思いますので、

これは、検索用シートに出力された検索結果の合計を算出したいということでしょうか。
合計対象となるのは
①H列(数量)
②L列(金額)
であってますか。
    • good
    • 1
この回答へのお礼

合計対象ですが、
①H列(数量)
②L列(金額)
で合っています。
度々申し訳ありません。
すみませんが、宜しくお願いいたします。

お礼日時:2021/08/20 13:25

こんにちは #2です


>上記で「該当列の抽出」と書いてしまっていますが、「該当行」の間違いです
ここ、行と列の間違いが混乱の原因かもしれませんね。

横から失礼する形になってしまいましたが、下記のような感じで処理できると思います。
これは、検索でなくフィルタ機能を活用した例です。
キーワード、おそらく会社名でしょうか?
これがは、どのように設定するのか分からないのでインプットボックスを採用しています。

Sub sample()
Dim Sh1 As Worksheet, Sh2 As Worksheet
Dim keyword As String
Set Sh1 = Worksheets("検索")
keyword = InputBox("単語を入力して下さい。")

If keyword = "" Then Exit Sub
Sh1.Range("A7", Sh1.Cells(Sh1.Cells(Rows.Count, "A").End(xlUp).Row, "L")).ClearContents

For Each Sh2 In Worksheets
With Sh2
If .Name <> "検索" Then
If .AutoFilterMode = True Then .ShowAllData
With .Range("A1")
.AutoFilter 1, keyword
.CurrentRegion.Offset(1).Copy Sh1.Cells(Rows.Count, 1).End(xlUp).Offset(1)
.AutoFilter
End With
End If
End With
Next Sh2

With Sh1
.Cells(Rows.Count, "L").End(xlUp).Offset(1, -1) = "合計:"
.Cells(Rows.Count, "L").End(xlUp).Offset(1) = Application.Sum(.Range("L3", .Cells(Rows.Count, "L").End(xlUp)))
End With
End Sub

keyword = InputBox("単語を入力して下さい。")を
keyword = Range("A2").Value とすればA2セルの値となります。

A2セルはVBAで重複しない会社名をリスト化する事も出来ますが、簡単なのは、入力規則のリストなどで参照先を顧客データ名の範囲などとすれば
良いかと、、

ちょっとしつこくなってしまったので、この辺で
    • good
    • 1
この回答へのお礼

ご回答頂き、有難うございます。
先ほど頂いたコードを入れて試してみました。
キーワードは得意先品番になります。言葉足らずで申し訳ございません。。
教えていただいたコードを見ながら、とても勉強になりました。
本当に有難うございます!

お礼日時:2021/08/20 13:22

No3です。


補足ありがとうございました。
検索シートで、得意先品番をどのように指定するかですが、
1案 予め 検索シートの所定の位置(例えばF3のセル)に得意先品番を設定しておき、マクロを実行する。(マクロはF3のセルを参照し得意先品番を取得する)

2案 マクロ起動後、inputboxから得意先品番を入力させる。

がありますが、どちらが良いですか。
個人的には1案を推奨します。
(添付図参照、例としてF3黄色のセルに得意先品番を設定しておきます)
このセルの位置はあなたが自由に決めてください。
「Excel VBAで複数シートから該当列」の回答画像5
    • good
    • 1
この回答へのお礼

ご返信有難うございます。
私以外の人が検索するときに分かりやすいように、1案がいいかもしれません。
検索位置はF3のままで構いません。

お手数お掛けし申し訳ございませんが、宜しくお願いいたします。

お礼日時:2021/08/20 12:09

上手くいかない、苦戦されている、と言う言葉よりかはそのコードを提示される方がヒントになるかもですよ。


ただコードは画像ではなく文字として貼り付けて貰えれば(最初の質問時に)と初級レベルなジジィですが思います。
    • good
    • 1
この回答へのお礼

ご回答頂き、有難うございます。
確かに、仰る通りです^^;
いろんなコードを試して消してしまったので
残っていませんが、今後質問をする際には判り易くということに
意識します。本当に有難うございます。

お礼日時:2021/08/20 10:40

補足要求です。


1.シート1日~31日のシートのレイアウトは全て同じと考えて良いですか。
2.上記1が成立する前提になりますが、
シート:1日及び検索用シートのレイアウトが判る画像をアップしていただけませんでしょうか。
下記が、私が適当に作成したサンプルの画像です。

シート名:1日 のサンプル画像
https://gyazo.com/542c7db85480118b528b0a5d776213dc

シート名:検索 のサンプル画像
https://gyazo.com/627906c10fe04c60ad3a1798694acade

このような画像をアップしていただけませんでしょうか。

尚、このgooのサイトに画像をアップしても良いですが、画像が非常に小さくなり不鮮明になります。
そうなった場合は、gayzo.comのほうへアップしてください。鮮明な画像がアップ可能です。
    • good
    • 1
この回答へのお礼

ご丁寧に、有難うございます!
補足へ画像を貼り付けました。
ご教授頂けますと幸いです。宜しくお願いいたします。

お礼日時:2021/08/20 10:17

こんばんは


すでに回答にある通り、ご質問の内容ではサンプルを書くことは、
難しいのではないかと思います。
>マクロやVBAは初めての初心者です。
表現が難しいのですが、どの程度お判りになるのでしょうか?
自動記録や一つ一つのなさりたい処理を検索などで調べ試しながら
作しかないかも知れませんね

一応、サンプル一例です。(役に立たない可能性大ですが)
パーツ取り?は出来るかも、、、

*シート名が不明の為シートインデックスを使用しています。
*シートタグ一番左に新規シートを作成してから試してください。
(必ずコピーファイルで試す事)

Sub sample()
Dim Sh1 As Worksheet, Sh2 As Worksheet
Dim keyword As String
Dim mySum, n As Long
Dim r As Range, Rng As Range
Set Sh1 = Worksheets(1)
keyword = InputBox("単語を入力して下さい。")
If keyword = "" Then Exit Sub
Sh1.Cells.ClearContents
For Each Sh2 In Worksheets
With Sh2
If .Index <> 1 Then
Set r = .Cells.Find(keyword)
If Not r Is Nothing Then
If .Cells(1, r.Column) <> "" Then
Set Rng = .Range(.Cells(1, r.Column), .Cells(Rows.Count, r.Column).End(xlUp))
Else
Set Rng = .Range(.Cells(1, r.Column).End(xlDown), .Cells(Rows.Count, r.Column).End(xlUp))
End If
mySum = Application.Sum(Rng)
n = n + 1
Rng.Copy Sh1.Cells(2, n)
Sh1.Cells(1, n) = .Name
Sh1.Cells(Rows.Count, n).End(xlUp).Offset(1) = "合計:" & mySum
End If
End If
End With
Next Sh2

End Sub

各シートで最初に見つけた単語のある列を対象とします。
複数の該当列がある(一意の単語でない)場合、
FindNextを追加して検索します

検索対象(範囲)はシート全体になっていますので
Set r = .Cells.Find(keyword)の .Cellsを限定する方が良いです。
例:2行目だけを単語の検索対象にする場合
Set r = .Range("A2", .Cells(2, Columns.Count).End(xlToLeft)).Find(keyword)
のような感じです
(検索オプションは引き継がれる為、Findについて理解が必要です。)

難しいと感じて断念してしまうかも、、なので此の辺で
    • good
    • 2
この回答へのお礼

とてもご丁寧に回答頂き、有難うございます。
貼り付け実行を行ってみました。
全31シートのF行が抽出され、少し変えると出来そうかも…と思い
調べてみようと思います!有難うございます!

お礼日時:2021/08/19 17:39

こんにちは



すみませんが、直接の回答ではありません。

どこまでできていて、何がわからないのかを具体的に示さないと、多分、役に立つ回答はつかないと思いますよ。
仮に、抽象的な回答が付いたとしても、質問者様には役に立たないのではないかと推測します。

ダメもとで書いておくなら・・・
検索は対象範囲に対して、FINDメソッドなどで検索して、見つかったものを抽出すれば宜しいかと。
https://docs.microsoft.com/ja-jp/office/vba/api/ …

>複数シートから抽出する
シートを順にループして、上記の検索・抽出を行えばよいです。
対象シートが全部(抽出シートを除く?)とかであるなら
 For Each sh in Worksheets
  If sh.Name <>"抽出シート" Then
   ' 検索・抽出等の処理
  End If
 Next sh
みたいな感じでしょうか。
予め対象シートが決まっているなら、そのシートを順に処理すれば良いでしょう。


あるいは、まるっきりわからずに丸投げしたいのなら、最低でもシートの構成やセルの位置、及び、なさりたいことを明確に示さないと誰にも内容が分りません。
まぁ、きちんと示したとしても、作ってくれる人が現れるかどうかはわかりませんけれど・・
    • good
    • 2
この回答へのお礼

こんにちわ。
説明不足で大変申し訳ございません。
丁寧に説明してくださり、有難うございます。
貼り付けていただいたサイトでFINDメソッドについて
勉強します。有難うございます。

お礼日時:2021/08/19 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング