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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

VBA

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

Q&A

解決済

2回答

5744閲覧

同じデータ別にシートを分割したい

XTJP

総合スコア11

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

VBA

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

0グッド

1クリップ

投稿2020/05/09 08:52

やりたいこと

  • Google Apps ScriptかExcel VBAを使用してD7:D1000の項目(30個くらい)で分類したデータをシートに分割したい
  • できればスプレッドシートで実現したいがExcelでもかまわない
  • 分割したシートの名前はその項目名にしたい

環境

  • mac OS 10.14.4
  • Excel
  • Googleスプレッドシート

やったこと

https://teratail.com/questions/186623
これがまさにやりたいことと一緒です。が、=filterを手動でやると途方も無いのでできればGASかVBAでやりたいです。

https://eijiman.com/excelvba-sheet-split/
これもやりたいことをVBAで実現しています。しかし、A列の3行目から65535行目までで項目を選んでいるため、自分のデータではうまくいきません。

Private Sub CommandButton1_Click() Call SheetSplit End Sub Sub SheetSplit() Dim i As Integer Application.ScreenUpdating = False With Worksheets(1) ' A列の3行目から65535行目まで処理 For i = 3 To .Range("A65535").End(xlUp).Row Call NewSheetCreate(i, .Cells(i, 1).Value) Next End With Application.ScreenUpdating = True End Sub Sub NewSheetCreate(lineNum As Integer, NewSheetName As String) Dim NewSheet As Worksheet Dim lastLine As Integer On Error Resume Next Set NewSheet = Worksheets(NewSheetName) ' シート作成時、1行目に項目名を入力 If NewSheet Is Nothing Then Worksheets.Add after:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = NewSheetName Worksheets(1).Rows(2).Copy Worksheets(NewSheetName).Rows(1).Insert Shift:=xlDown End If lastLine = Worksheets(NewSheetName).Range("A65535").End(xlUp).Row + 1 Worksheets(1).Rows(lineNum).Copy Worksheets(NewSheetName).Rows(lastLine).Insert Shift:=xlDown On Error GoTo 0 End Sub

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

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

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

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

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

guest

回答2

0

ベストアンサー

スプレッドシート+GASで考えてみました。
コピー先のシートのヘッダ行とかは考慮してないので、必要なら自分で考えてください。

JavaScript

1function myFunction() { 2 //スプレッドシートを取得 3 // const file = SpreadsheetApp.openById("xxxx"); 4 const file = SpreadsheetApp.getActiveSpreadsheet(); 5 //分類元となるシート 6 const baseSheet = file.getSheets()[0]; 7 //データの最初の行番号 8 const firstRow = 7; 9 //データの最後の行番号 10 const lastRow = baseSheet.getLastRow(); 11 //データの最後の列番号 12 const lastCol = baseSheet.getLastColumn(); 13 //すべてデータを2次元配列として取得 14 const rowValues = baseSheet 15 .getRange(firstRow, 1, lastRow, lastCol) 16 .getValues(); 17 Logger.log(`rowValues = ${JSON.stringify(rowValues)}`); 18 //分類するキーの列番号 19 const KeyColumn = 4; 20 21 //データを分類するキーごとに配列を保持するオブジェクトへ変換 22 const classifiedValues = rowValues.reduce((result, values) => { 23 const key = values[KeyColumn - 1]; 24 if (key) { 25 if (result[key]) { 26 result[key].push(values); 27 } else { 28 result[key] = [values]; 29 } 30 } 31 return result; 32 }, {}); 33 Logger.log(`classifiedValues = ${JSON.stringify(classifiedValues)}`); 34 35 //オブジェクトのキーごとにループしながらシートを追加 36 Object.keys(classifiedValues).forEach((key) => { 37 const newValues = classifiedValues[key]; 38 file.insertSheet(key) 39 .getRange(1, 1, newValues.length, lastCol) 40 .setValues(newValues); 41 }); 42} 43

投稿2020/05/10 16:00

draq

総合スコア2577

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

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

XTJP

2020/05/11 06:56

ありがとうございます。まさにやりたかったことが実現できました。
guest

0

7行目が項目名でいいでしょうか。
このコードを生かすならばA列の処理をD列に変えて

VBA

1 ' D列の8行目から65535行目まで処理 2 For i = 8 To .Range("D65535").End(xlUp).Row 3 Call NewSheetCreate(i, .Cells(i, 4).Value) 4 Next

NewSheetCreateでは

VBA

1 ' シート作成時、1行目に項目名を入力 2 If NewSheet Is Nothing Then 3 Worksheets.Add after:=Worksheets(Worksheets.Count) 4 Worksheets(Worksheets.Count).Name = NewSheetName 5 Worksheets(1).Rows(7).Copy 6 Worksheets(NewSheetName).Rows(1).Insert Shift:=xlDown 7 End If

とすればいいと思います。

投稿2020/05/09 12:10

ryuno_vanilla

総合スコア119

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

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

XTJP

2020/05/11 06:55

ありがとうございます。引用したコードを編集して頂き、参考になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問