質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

2回答

1320閲覧

Excel VBA もしくは Google Apps Script で、複数のシートの最終列を取得し新たな1つの列にまとめる方法

yosheno

総合スコア12

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/11/01 13:34

初めに以下の Sheet をご確認ください。

https://docs.google.com/spreadsheets/d/1AlwgQLEZoZz_vWz0ZqKld528ViLAl8x2nR4SZz0VoHA/edit#gid=0

↑のような形で各商品の毎月の在庫数が記録される Excel File があるのですが、
以下のように各商品の最新月の在庫数のみを1つのテーブルに自動でまとめる方法がございませんでしょうか?

https://docs.google.com/spreadsheets/d/1AlwgQLEZoZz_vWz0ZqKld528ViLAl8x2nR4SZz0VoHA/edit#gid=1267878017

留意点
・各商品シートの最新月の在庫数が入る列はシートによってバラバラです。
・各商品シートの最新月の在庫数は最終列に追加されていくようになっています。

商品数が100以上あり手動でまとめるのがとても手間です。。。
Excel VBA、もしくは GAS で自動処理する方法はございませんでしょうか??

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/11/02 00:22

vlookupとかでできそうな気もするのですが、そもそもの管理の話としてワンピースは16巻が増えないのですか?今現在の表を拝見するとある月から数値が入っているものがありますがそれらは発生した月にまとめ表で行挿入しているのでしょうか?
guest

回答2

0

追記依頼に回答がないのですが、GASでの回答を。

どう考えても新刊があるから、まとめシートは増減せざるを得ないはず。なので、まとめシートを更新するという発想には無理がある(完了済みのマンガやあらかじめ巻数のわかる百科事典しかあつかわないなら別だが、そういう事業はないと思う)。

一方で、巻が減ることはない(減らす必然性はない)ので、特定の名前のシートを除外した全シートの1列目と最終列をとってきて、取ってきたデータでまとめシートの2行目以降を全面上書きする、というのが(明示されていない部分も含めた)仕様に対応する最も簡素な設計だと思いました。

なお、動作の都合上、まとめシートの名前に4月とかはいっているととてもとても面倒です(毎月↓の各タイトルの在庫部分を編集するなら可能)。またまとめシートのC1あたりに4月の在庫となっていますが、これもしんどいです(最新の在庫とかでいいんじゃね?)
あと私にとって学びがないので、罫線も引いてません。最初からまとめシートはひろめに罫線を引いといてください(消しはしないはず)。

javascript

1function mergeSheet() { 2 const fullset = mergeAllSheetsData(); 3 SpreadsheetApp.getActiveSpreadsheet().getSheetByName("各タイトルの在庫").getRange(2, 1, fullset.length, 3).setValues(fullset); 4} 5function mergeAllSheetsData() { 6 return SpreadsheetApp.getActiveSpreadsheet().getSheets().filter(function(s){return s.getSheetName() !== "各タイトルの在庫";}).map(function(sheet){ 7 return sheet.getDataRange().getValues().map(function(row){ const n = sheet.getSheetName(); return [n, row[0], row[row.length -1]]}); 8 }).reduce(function(prev, curr) { return prev.concat(curr);}); 9}

蛇足

  • めんどう、しんどい、と書いている点に対応したい場合は誰かに委託して対応してもらってください
  • 考えかたとして、もし一ブックが一ヶ月を表現しておらず、「各タイトルの4月の在庫」「各タイトルの5月の在庫」と12ヶ月分が1つのブックに含まれるのであれば、ワンピースやドラえもんは必ず左端から1月、2月…となっているべきだと思います。またまとめシートもそうなっていればよいと思います。最終列の見出し行でわかるじゃん、と思うかもしれませんが、偶然ドラえもんは4月の取り扱いがなかったので最終列が3月という場合を想定しないとプログラムとしては不十分ということになりますので、初心者には手強い課題になると思います。

投稿2018/11/06 00:57

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

vba

1With ThisWorkbook.WorkSheets(1) 2 LastColumn = .Cells( 1 , .Columns.Count ).End(xlToLeft).Column 3End With

上記のコードでワークシートの1行目のデータが入っている最後の列が取れるのでその値を別のシートに保存すれば残せるはずです
withを使用しなくてもかけますが長くなるので今回はwithを使用してます
シートの最大数に関しては

VBA

1ThisWorkbook.worksheets.Count

でシートの数が取れるはずなのでその回数ループさせる事で複数シート対応できます

投稿2018/11/01 16:31

koryuohproject

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問