EXCELのVBAを使った事務作業の効率化
EXCELのVBAを使った事務作業の効率化
せっかくなので私自身にとっても有益な情報を作業効率化してみます。
ソフト検索サイトVectorでEXCELの需要を集計するためのデータ作りです。
ベクター(株)ベクターが運営するソフトウェアをはじめとするデジタルコンテンツの流通を行うサイトです。フリーのものから有料のものまで各ジャンルにおけるソフトがあります。その中で今回はEXCELに絞ってどんなソフトがあり人気なのかを集計してみたいと思います。
取り込み・並び替えに使ったソフト
もちろんEXCELです。
まずは、登録されているソフトをEXCELに取り込みます。
カテゴリーは
ダウンロード>Windows10/8/7/Vista/XP/2000/NT>ビジネス>計算・表計算・グラフ>表計算>MS-EXCEL用
表示順を〔人気順〕にします。
表示されたソフトをEXCELに取り込み編集後集計します。
今回、取り込み作業はコピーぺです。そこ効率化するところでしょ!っと突っ込まないでください。別の機会にしたいと思います。
仕様
取り込んだデータはセルA列にソフト名と詳細が交互に並びましたので、まずはソフト名と詳細を集計しやすいように1行で表示させます。1200行の手作業は大変なのでVBAで繰り返し処理をします。
作業1
2行目のデータを1行目のB列へコピーし、2行目を削除。
これを繰り返します。
結果1
うまく編集できました。が、処理がとても遅いです。
手作業を自動にしただけでは満足できるものにはなりませんでした。
面白くないのでついでに違う方法で処理を試し速度比較したいと思います。
作業2
シートを変えることによってデータ原本の確保と行削除が不要になるので処理速度が上がるはず。
結果2
はい、一瞬で処理が出来ました。
(元データ)
(編集後)
作業3
配列を使った処理を本当はやろうと思ったのですが、作業2で一瞬なので比較できないと思い次回にします。
もっとデータ量が多い処理の時にまた。
結論
おすすめの処理は作業2なのですが処理が早い事だけではありません。
データの原本が確保できるところです。
コピーを取っておくのは当然ですが、プログラムのせいでデータがおかしくなることは絶対にあってはいけないです。あと、実際の処理がうまく動くかをチェックしながら作成しますので、結果原本確保が一番時間短縮なのです。
コードを載せておきます。参考にしてみてください。
VBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
VBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
VBAコード
****************************
Sub Data_Edit()
'手作業の途中からでも利用できる仕様
'データが正しく並んでいることが前提
'
'初期設定
Dim cnt As Integer 'B列の行数
Dim set_cell As Object 'コピーするセル位置
cnt = 0
Set set_cell = Sheets("sheet1").Range("A1")
cnt = Sheets("sheet1").Range("B1300").End(xlUp).Row
Set set_cell = set_cell.Offset(cnt + 1)
set_cell.Select 'なくても良い 作る際に確認のために入れました
'ここから繰り返し作業
For i = 1 To 1200 '1200行指定
set_cell.Offset(-1, 1) = set_cell 'データを移動
Set set_cell = set_cell.Offset(2) '次データにセット 削除前に置かないとエラーになる
set_cell.Select 'なくても良い 作る際に確認のために入れました
Rows(cnt + 2).Select '削除業の指定
Selection.Delete Shift:=xlUp '削除
cnt = cnt + 1 '削除業のカウント
'途中から始めた場合に処理終了カウントが狂うのでデータがなくなったら処理を止める
If set_cell = "" Then
Exit Sub
End If
Next i
End Sub
****************************
Sub Data_Edit2()
'
'データが正しく並んでいることが前提
'
'初期設定
Dim cnt As Integer 'A列の行数
Dim set_cell As Object 'コピーするセル位置
Dim set_cell2 As Object 'コピー先
cnt = 0
Set set_cell = Sheets("sheet1").Range("A1") 'コピーするセル位置
Set set_cell2 = Sheets("sheet2").Range("A1") 'コピー先
cnt = Sheets("sheet1").Range("A2000").End(xlUp).Row 'データー数 繰り返す回数
set_cell.Select 'なくても良い 作る際に確認のために入れました
'ここから繰り返し作業
For i = 1 To cnt '繰り返し回数 データ数を指定
set_cell2 = set_cell 'データを移動
set_cell2.Offset(, 1) = set_cell.Offset(1) 'データを移動
Set set_cell = set_cell.Offset(2) '次データにセット
Set set_cell2 = set_cell2.Offset(1) '次データにセット
cnt = cnt + 1 '処理数のカウント
If set_cell = "" Then
Exit Sub
End If
Next i
End Sub
****************************