はじめてのVBA

ExcelVBAと格闘した時の、備忘録。

ミッションは、CSVが出力できる、Excelを作ること。

・はじめてのVBA
・本開発までの暫定対応

品質
・改修想定なし
・問題なく動く(想定通りに使った場合に限る)

構成
シート1:説明書シート。コピペボタン・CSV出力ボタンをつける
シート2:CSV出力元シート(シート3の入力値をコピペする)。セルの書式を設定する。
シート3:ユーザが入力するシート。プルダウンを作る。



Excel
仕様上、月日は0埋め。

月日が1桁の時も日付の先頭を揃えたい
(ググったワード:"excel 日付 0埋め")

セルを右クリック > 「セルの書式設定」を選択
「表示形式」タブ > 「分類」から「ユーザー定義」を選択

パターン1
「種類」yyyy/mm/dd > 「OK」をクリック
例)セルの入力値→"2017/7/1"
表示 →"2017/07/01"

パターン2
「種類」yyyymmdd > 「OK」をクリック
例)セルの入力値→"2017/7/1"
表示 →"20170701"


複数の候補から選択する項目。
項目によって、数字が全角だったり半角だったり…。
入力よりも、選ばせた方がよさそう。
そうだ、プルダウンを作ろう。

3ステップ!Excelでプルダウンリストを作成する方法|エクセルハック
(ググったワード:"excel プルダウン")

「データ」タブ > 「データの入力規則」をクリック > 「データの入力規則」を選択
「設定」タブ > 「リスト」を選択 > 「ドロップダウン リストから選択する」にチェックを入れる > 「元の値」に候補を","区切りで入力 > 「OK」をクリック



VBA
まずは、メインのCSV出力を作る。

EXCELからCSVファイルの出力方法について - Excel(エクセル) 締切済 | 教えて!goo
(ググったワード:"エクセル csv 出力 ボタン")

回答No.5のコードを参考にさせていただく。
マクロ実行でCSVが出力されることは確認できた。

これをベースにどんどん仕様を盛り込んでいく。


次に、ファイル名に設定する今日の日付の取得。


VBAで今日の日付をyyyymmdd形式で取得する-Date・Format関数:エクセルマクロ・Excel VBAの使い方-VBA関数 http://www.relief.jp/itnote/archives/excel-vba-today-yyyymmdd.php
(ググったワード:"エクセル マクロ 日付取得")


最後に、シートの入力値のコピペ。

エクセルVBA 別シートの複数のセルの値をコピーする方法 - Excel(エクセル) 解決済 | 教えて!goo
(ググったワード:"エクセル マクロ シート コピー 範囲 指定")


入力されたセルだけをコピペ範囲にしたい。

No.8 ワークシートの最終行、最終列を取得する
(ググったワード:"マクロ 最大行")


マクロ実行用のボタンをつける。

Excel マクロ実行ボタンを作ろう~やさしいマクロ講座
(ググったワード:"マクロ ボタン")

操作の説明を書いて、Excel完成。


ところが、処理にやたら時間がかかる。
処理速度の改善へ。

Office TANAKA - Excel VBA高速化テクニック[無駄な表示を止める]
Office TANAKA - Excel VBA高速化テクニック[名前で呼ぶな]
Office TANAKA - Excel VBA高速化テクニック[セルの指定方法]
Office TANAKA - Excel VBA高速化テクニック[セルを配列に入れる]
(ググったワード:"マクロ 処理 高速化")


…で、最終的にできたマクロがこんな感じ、だったような。

Sub copyInputValue()
 Dim sh2 As Worksheet
 Dim sh3 As Worksheet
 Dim tmp As Variant
 Application.ScreenUpdating = False
 Set sh2 = Worksheets(2)
 Set sh3 = Worksheets(3)
 maxRow = sh3.Cells(Rows.Count, 1).End(xlUp).Row
 maxCol = sh3.Cells(1, Columns.Count).End(xlToLeft).Column
 tmp = sh3.Range(sh3.Cells(2, 1), sh3.Cells(maxRow, maxCol))
 sh2.Range(sh2.Cells(2, 1), sh2.Cells(maxRow, maxCol)) = tmp
 Application.ScreenUpdating = True
 End Sub

Sub outputCsv()
 Application.DisplayAlerts = False
 Application.ScreenUpdating = False
 main_f = ActiveWindow.Caption
 out_pass = ActiveWorkbook.Path & "\"
 Sheets(2).Select
 Sheets(2).Copy
 ActiveWorkbook.SaveAs Filename:= _
 out_pass & Format(Date, "yyyymmdd") & ".csv", _
 FileFormat:= xlCSV, CreateBackup:= False
 ActiveWindow.Close
 Application.ScreenUpdating = True
 Application.DisplayAlerts = True
 End Sub

もうひとつマクロ作ってたような気がするけど、忘れた。