こんにちは!「デザインもできるシステムエンジニア」のあつもり(プロフィール)です。
今日も業務効率化のアイデアを発信していきますっ!
エクセルVBAを使ってランチャーアプリを作ります。
全10回の連載で今回は第10回目。いよいよ最終回になりました。
今回は「同じデータが切り替わる項目ごとに空白行を挿入する」する機能を追加していきます。
エクセルで表データを作るときに、見栄えを良くすることは重要なことです。自分で見るだけならいいかもしれないですが、他人に見せるデータなら、なおさら見栄えは大切です。
見栄えを良くすることで相手の理解が深まり、説得力が増すからです。
見栄えを整えていると、
「項目の切り替わる所に改行を入れたい」というケースがあります。
例えばこんな感じ。
取引先名が変わるたびに改行を入れて見やすくする。
エクセルの集計機能を使えば手動でできないこともないのですが、やはりいくつかの手順を踏まなければならないし、職場など複数人で作業する場合、それぞれの人にやり方を教えなければならず不便です。
というわけでVBAを使って「項目ごとに空白行を挿入する」プログラムを作っていきます。
一度プログラムを作ってしまえば、あとの作業が楽になるし、教える手間も省けるからです。
目次
項目ごとに空白行を入れるプログラムの作成
前回使用した一括変換プログラムにボタンを追加する
毎度のことですが作業効率を考え、前回使ったプログラムを再利用します。デスクトップにある「一括変換.xls」を開きます。
UserFrom1を開いて新たに「項目ごとに空白行を入れる」ボタンを追加します。ボタンの表示名はプロパティウィンドウのCaptionで変更できます。前回に比べてボタンが増えたので全体的に少し小さくして、2列に並べました。
サンプルコードを貼り付ける
さきほど追加した「項目ごとに空白行を入れる」ボタンをダブルクリックしてコードウィンドウを開きます。
「CommandButton7_Click()」の下に以下のコードを貼り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
'項目ごとに空白行を入れる Private Sub CommandButton7_Click() Dim tmp Dim Col As Long Dim Row_Start As Long Dim Row_End As Long Dim y As Long '最終行を取得 With ActiveSheet.UsedRange Row_End = .Rows(.Rows.Count).Row End With 'キャンセルが押された場合は処理を終了する On Error GoTo myError tmp = Application.InputBox("列を選択して下さい", "列の選択", Type:=8).Address Range(tmp).Select '選択した列番号 Col = Selection.Column '処理開始行 Row_Start = InputBox("開始行を数字で入力してください") On Error GoTo 0 For y = Row_End To Row_Start Step -1 With Cells(y, Col) If .Value <> .Offset(-1, 0).Value Then '空白行を挿入して下方向に移動 Rows(y).Insert Shift:=xlDown End If End With Next y myError: End Sub |
これでランチャーに改行機能が追加されました。
このままでも使えますが、手直して自分の思うようにプログラムを変えたい人向けに、プログラムコードの解説をします。
プログラムコードの解説
改行挿入機能に絞って説明していきます。過去の連載記事で解説してきたことについては触れていません。
プログラムの流れは以下のようになります。
- 項目列を選択するInputBoxを表示させる
- 開始行を入力するInputBoxを表示させる
- 最終行から開始行に向かってループさせる
- 項目行の項目名が変わったらInsertメソッドで空白行を入れる
なぜ最終行から開始行に向かってループさせるのかというと、空白行を挿入すると行番号がずれてしまうためです。
空白行を入れる度に行番号がずれてしまうと、想定通りの動きになりません。
詳しくは前回の記事で説明していますので参考にしてください。
Withステートメントを使ってプログラムコードを見やすくする
Withステートメントはプログラムの可読性を高めるために使います。
Withを使うとオブジェクトコードを何度も書く必要がなくなります。そのため、可読性が上がるだけでなく、プログラミングの効率アップにもつながるわけです。
でも、絶対使わなければいけないわけではないので、使わないのもアリです。
処理
End With
Withを使わない場合
1 2 3 |
If Cells(y, Col).Value <> Cells(y, Col).Offset(-1, 0).Value Then Rows(y).Insert Shift:=xlDown End If |
Withを使った場合
1 2 3 4 5 |
With Cells(y, Col) If .Value <> .Offset(-1, 0).Value Then Rows(y).Insert Shift:=xlDown End If End With |
Withを使わない場合はCells(y, Col)を2回書かないといけませんが、Withを使う場合は1回書くだけで済みます。
Withを使えばプログラムコードの可読性を上げるだけでなく、プログラム変更時も少ない修正で済むということです。
Offsetプロパティで前のセルのデータを取得する
Offsetプロパティは基準となるセルからの位置を指定することで、別のセルの値を取得することができます。
Rangeオブジェクトには基準となるセルを指定します。
RowOffsetは取得したいセルの縦座標と基準となるセルの縦座標の差を入れます。
ColomnOffsetには取得したいセルの横座標と基準となるセルの横座標の差を入れます。
data = Cells(5, 5).Offset(-1, 0).value
とした場合、dataにはCells(4, 5)のデータが入ります。
項目ごとに空白行を入れるプログラムの動作確認
それでは実際に出来上がったプログラムを動かしてみましょう。
まずワークシートの起動するボタンを押します。
フォームが表示されたら対象のシートに移動し「項目ごとに空白行を入れる」ボタンを押します。
列を選択するInputboxが表示されたら、項目列を選択しOKボタンを押します。
続いて開始行を入力するInputboxが表示されるので、処理を開始したい行番号を入力します。
項目の変わり目に空白行が挿入されました。
まとめ
いかがでしたか?今回は同じデータが切り替わる項目ごとに空白行を挿入する方法をお伝えしました。
- Withを使うことでプログラムコードを見やすくする
- Offsetプロパティを使って前のセルを取得する
それではまた~。
[連載記事 全10回] エクセルVBAで文字列変換ツールを作る
全角半角の変換をしたり、空白行や改行を削除したり。データ編集に便利な機能を詰め込んだランチャーアプリを作っていきます。1つの記事で1機能ずつ追加していきますので、少しずつVBAを学びながら進めることができます。
- エクセルVBAでセル内の文字列に含まれる改行を一括で削除する方法
- エクセルVBAでセル内の文字列を操作して全角文字を半角に一括変換する方法
- エクセルVBAでチェックボックスのONOFFでボタン表示を変える方法
- エクセルVBAでセル内文字列の前後の空白をまとめて一括で削除する方法
- エクセルVBAのReplace関数でセルの文字列内の空白をまとめて一括削除する
- エクセルVBAのCountA関数でシート内の空白行をまとめて一括で削除する方法
- エクセルVBAで空白行を削除しないでまとめて一括非表示で隠す方法
- エクセルVBAで条件付き書式を使わず1行おきに色を付ける方法
- エクセルVBAで集計や並び替えを使わず1行おきに空白行を一括で挿入する方法
- エクセルVBAで同じデータが切り替わる項目ごとに空白行を挿入する方法 (本記事です)
その使い方だと損してます!
会社員、個人事業主のかたへ。
無料で登録できるAmazonビジネスアカウントを知ってますか?
何と言っても便利なのが請求書払いによる後払いができるということ。
また、承認ルールを作成すれば、業務上必要な物だけに購入を制限することができます。
さらに多くの商品にビジネスアカウント価格が設定されており、個人アカウントより安く購入できます。
このように個人アカウントと比べてビジネスアカウントはお得な機能や特典がついています。
無料で登録できるので、会社員、個人事業主なら使ったほうが得なのは言うまでもありません。