第8回.最終行を取得して繰り返す
データは常に増減します、決まった行数しか処理できないのではこまります、
実際に入っているデータの最終行をいかに取得するかを解説します。
前回に続いて、以下の表で、
金額 = 単価 × 数量
の計算を、データ行数が増減しても対応できるようにスクリプトを書き直します。
前回は、2行目〜11行目までを繰り返し処理するように書きました。
ただし、お終いの行数の11が固定でした。
この11を固定数値ではなく、データの入っている行数に自動的になるようにします。
前回のスクリプト
function mySample4() { var sheet = SpreadsheetApp.getActiveSheet() var tannka,suuryou for (var i=2; i<=11; i++) { tannka = sheet.getRange(i, 2).getValue() suuryou = sheet.getRange(i, 3).getValue() sheet.getRange(i, 4).setValue(tannka * suuryou) } }
上のスクリプトの11という固定数値部分を書き換えます。
完成スクリプト
function mySample5() { var sheet = SpreadsheetApp.getActiveSheet() var tannka,suuryou,lastRow lastRow = sheet.getLastRow() for (var i=2; i<=lastRow; i++) { tannka = sheet.getRange(i, 2).getValue() suuryou = sheet.getRange(i, 3).getValue() sheet.getRange(i, 4).setValue(tannka * suuryou) } }
解説
その最終行取得のメソッドが、
sheet.getLastRow()
になります。
getLastRowは、データのある最終行を返してくれます。
i<=sheet.getLastRow()
としても構いません
ここではその後に使っていませんが、
最終行の数値は、その後に使う事を想定して、変数に入れておくと良いでしょう。
getLastRowと似たメソッドに、
getMaxRows
があります。
これは、シートの全行数で、データの有無に関係なく全行数を返します。
指定列の最終行
function mySample6() { var sheet = SpreadsheetApp.getActiveSheet() var tannka,suuryou,lastRow lastRow = sheet.getLastRow() for (var i=2; i<=lastRow; i++) { if (sheet.getRange(i, 2).getValue() == "") break tannka = sheet.getRange(i, 2).getValue() suuryou = sheet.getRange(i, 3).getValue() sheet.getRange(i, 4).setValue(tannka * suuryou) } }
上記では、B列の最終行まで処理します。
ifで、B列が空であれば、forを抜けています。
ifについては、次々回くらいに説明します。
Excelでは、最終行取得の定番として、
Cells(Rows.Count, 1).End(xlUp).Row
このように書きます。
これは、シートの一番下からCtrl+↑で突き当たった行数を取得します。
これと同じことが出来ないのか、と考えたいところですが、これに相当するスクリプトはありません。
もし、Excelと同じことをやるとすれば、
function mySample7() { var sheet = SpreadsheetApp.getActiveSheet() var tannka,suuryou,lastRow lastRow = getLastRow(sheet,1) for (var i=2; i<=lastRow; i++) { tannka = sheet.getRange(i, 2).getValue() suuryou = sheet.getRange(i, 3).getValue() sheet.getRange(i, 4).setValue(tannka * suuryou) } } function getLastRow(sheet,col){ var lastRow = 1 for (var i=sheet.getLastRow(); i>1; i--) { if(sheet.getRange(i, col).getValue() != "") { lastRow = i break; } } return lastRow }
このようなスクリプトを作成する必要があります。
上記のスクリプトについては、まだ早いので、解説は省略します。
スプレッドシートは基本は表で出来ています。
そのデータ処理においては、最終行の取得が必須になります。
キーとなる列を設定する等の工夫をして、
なるべく標準の方法で、最終行を取得できるように表を作成することが肝要です。
同じテーマ「Google Apps Script入門」の記事
第5回.変数って何だ?
第6回.セルの値を使って計算する
第7回.同じ計算を行数分繰り返す
第8回.最終行を取得して繰り返す
第9回.コメントの書き方
第10回.条件で処理を変える(条件分岐,if)
第11回.条件で処理を変える(条件分岐,switch)
第12回.表範囲をまとめて消去する
第13回.セルに書式を設定する
第14回.複数のシートを扱う
第15回.複数のスプレッドシートを扱う
新着記事 ・・・新着記事一覧を見る
Excelシートの複雑な計算式を解析するVBA|VBAサンプル集(2月18日)
VBAクラスの作り方:独自Rangeっぽいものを作ってみた|VBA技術解説(2月16日)
VBAクラスの作り方:列名のプロパティを自動作成する|VBA技術解説(2月14日)
VBAクラスの作り方:列名の入力支援と列移動対応|VBA技術解説(2月11日)
クラスを使って他ブックのイベントを補足する|VBA技術解説(2月6日)
Excelアドインの作成と登録について|VBA技術解説(2月3日)
参照設定、CreateObject、オブジェクト式の一覧|VBA技術解説(1月20日)
VBAでファイルを規定のアプリで開く方法|VBA技術解説(1月20日)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)|VBA技術解説(1月19日)
他ブックへのリンクエラーを探し解除|VBAサンプル集(1月15日)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数とデータ型(Dim)|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.RangeとCellsの使い方|ExcelマクロVBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.繰り返し処理(For Next)|ExcelマクロVBA入門
8.とにかく書いて見よう(Sub,End Sub)|VBA入門
9.定数と型宣言文字(Const)|ExcelマクロVBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。