Excel VBA 自動作成
追加機能編
目次
A.表の形を変える
B.他のシートを参照する
G.集計する
H.セルを修飾する
I.ブック、データの取り扱い
J.フォームを作成する
K.マクロを実行する
A. 表の形を変える
縦表(同じ項目は1列しかない)を見やすい横表に変換します。横キーを出力表に見つけ、その列にデータを移動する。
入力表は縦キー順に分類しておきます。
入力表
出力表
あらかじめ横キーを貼り付けておく必要があります。
設定方法
結果
ピボットテーブルと異なり、集計しません。横方向に複数項目を貼り付けます。
横表(横方向に同じ項目が並んでいる表)を入力表とするとプログラムが複雑になります。
横表を縦表(同じ項目は1列しかない)に変更します。
入力表
出力表
設定方法
結果
この形ではフィルタや分類など処理が容易になります。
1件のデータを1シートに配置します。
入力表
テキストボックスに項目名の名前をつけ、設置します。
記入するデータ
設定方法
テキストボックスを配置したシートを選択してから設定してください。
結果
プログラムで表示する行を指定します。5行を指定した例。
B. 他のシートを参照する
基本編で説明しました参照表から価格を取り込むことに加え、参照表にもデータを記入します。
入力表
参照表
設定方法
作成されたプログラム
Sub 合成() Dim INS, EN, SBK, I, KEYD, F Application.ScreenUpdating = False Set INS = Sheets("Sheet8") '入力出力シート EN = INS.Range("$B65536").End(xlUp).Row If EN < 3 Then Exit Sub INS.Range("$D3:$D" & EN).ClearContents '出力データクリヤ Set SBK = Sheets("Sheet9") '参照ブックシート SBK.Range("$C3:$C65536").ClearContents For I = 3 To EN KEYD = INS.Range("$B" & I).Value Set F = SBK.Range("$A:$A").Find(What:=KEYD, LookIn:=xlValues, _ LookAt:=xlWhole, MatchCase:=False) If F Is Nothing Then INS.Range("$D" & I).Value = "" '見つからない Else INS.Range("$D" & I).Value = SBK.Range("$B" & F.Row).Value SBK.Range("$C" & F.Row).Value = SBK.Range("$C" & F.Row).Value & INS.Range("$A" & I).Value & "," End If Application.StatusBar = I & "<--" & EN Next I Application.StatusBar = "" End Sub
|
赤字部は複数の伝票NOを表示できるよう修正
結果
参照表に参照した伝票NOを記入しました。
合成縦横
出力表に縦キー、横キーを記入しておきます。入力表の縦キー、横キーを見て、出力表に転記します。
入力表
出力表
設定方法
結果
金額も出力するようプログラムを修正しました。
キー重複の場合は合計するようプログラム修正が必要です。
合成繰返
参照表が同一キー複数行ある場合の処理。複数行あってもすべて参照します。
(ここでは合計する)
入力表
参照表
設定方法
作成されたプログラム
Sub 合成繰返() '参照表に同一キーが複数あってもすべて参照する。 Application.ScreenUpdating = False Set INS = Sheets("Sheet12") '入力出力シート EN = INS.Range("$A65536").End(xlUp).Row If EN < 3 Then Exit Sub INS.Range("$B$3:$B" & EN).ClearContents '出力データクリヤ Set SBK = ThisWorkbook.Sheets("Sheet13") '参照ブックシート 'ENC=SBK.RANGE("$A65536").End(xlUp).Row ’参照最終行 For I = 3 To EN KEYD = INS.Range("$A" & I).Value ST = 1 '検索開始行 Do If ST = 1 Then Set F = SBK.Range("$A:$A").Find(What:=KEYD, LookIn:=xlValues, _ LookAt:=xlWhole, MatchCase:=True) Else Set F = SBK.Range("$A:$A").FindNext(After:=F) End If If F Is Nothing Then '見つからない Exit Do ElseIf F.Row < ST Then ' または 上にもどった Exit Do Else ' 複数あった場合、合計する例 INS.Range("$B" & I).Value = INS.Range("$B" & I).Value + SBK.Range("$C" & F.Row).Value ST = F.Row + 1 '次に探す先頭行 End If Loop Application.StatusBar = I & "<--" & EN Next I Application.StatusBar = "" End Sub |
結果
合成高速
合成と機能は同じですが、参照表が10,000件あっても高速で処理できます。
(MATCH関数を使用)
参照表はキー順に並んでいる必要があります。
入力表
参照表
設定方法
結果
合成挿入
参照した結果、キーが連続して複数行あった場合、入力表に挿入します。
入力表
参照表
設定方法
結果
合成貼付
入力表
参照表
設定方法
コピーするセル範囲を選択できます。
結果
G.集計する
SUMIF関数を使って集計します。
入力表
集計表
設定方法
作成されたプログラム
SUB 計算SUMIF ’SUMIF関数を使って集計 Application.ScreenUpdating = False SET INS=Sheets("Sheet6") ’入力出力シート SET SS=Sheets("Sheet7") ’入力出力シート EN = INS.Range("$A65536").End(xlUp).Row IF EN<3 THEN EXIT SUB SET SENR = SS.Range("$B$4").CURRENTREGION '集計範囲の連続セル SEN = SENR.ROWS.COUNT+SENR.ROW-1 '最終行 を連続範囲よりもとめる SUMIFを下の行に記入可能 INS.Range("$B$3" ).Formula = "=SUMIF(Sheet7!$B$4:$B$"& SEN &",A3,Sheet7!$D$4:$D$"& SEN &")" INS.Range("$B$3").COPY INS.RANGE("$B$3:$B"&EN).PasteSpecial Paste:=xlFormulas, Operation:=xlNone INS.CALCULATE END SUB |
結果
作成された式
=SUMIF(Sheet7!$B$4:$B$13,A3,Sheet7!$D$4:$D$13)
キーごとの合計を挿入します。
入力表
設定方法
結果
H.セルを修飾する
書式シートよりボディ、最終行の書式をコピーします。
入力表
書式シート
設定方法
結果
I.ブック、データの取り扱い
ホルダを指定してファイル一覧を作成します。
入力表
設定方法
作成されたプログラム
Sub ファイル一覧() Set fs = CreateObject("Scripting.FileSystemObject") Set ous = Sheets("Sheet4") ous.Range("a4:iv65536").ClearContents fld = "C:\Users\KANA\d\anki_eitango" Set F = fs.GetFolder(fld) Set fc = F.Files 'ファイル 'Set fc = F.SubFolders ’サブホルダ PU = 4 For Each f1 In fc ous.Range("$A" & PU).Value = f1.Name ' 'ファイル名 パス付 f1.Path ous.Range("$B" & PU).Value = f1.DateLastModified '作成日 ous.Range("$C" & PU).Value = f1.Size 'サイズ PU = PU + 1 Next Set fs = Nothing End Sub |
結果
ブック読込書込
ブックの読込、書込のプログラムを作成します。
設定方法
作成するプログラムを選択する。
6つのプログラムが作成できます。
Sub ブック読込書込禁止() |
書込み禁止で開く |
Sub ブック読込書込可能() |
書込み可で開く |
Sub ブック選択読込() |
ブックを選択して読む |
Sub ブック保存() |
ブックを名前を付けて保存する |
Sub ブックCLOSE() |
ブックを閉じる |
Sub ブックCLOSE上書保存() |
ブックを上書き保存し閉じる |
テキストを読み込みシートに貼り付け、
シートの内容をテキストに書込するプログラム例を出力します。
設定方法
作成されたプログラム
Sub テキスト読込() ' A3よりテキストデータを出力する INF = "C:\Users\KANA\d\anki_eitango\説明.txt" 'SET OUS=WORKBOOKS("一覧.xls").SHEETS("Sheet5") ’入力出力シート Set OUS = Sheets("Sheet5") '入力出力シート ' INF 入力ファイル名 OUS 出力シート名 OUS.Range("A3:IV65535").ClearContents '全消去 OUS.Columns("A:A").NumberFormatLocal = "@" '文字列書式に変更 Close #1 Open INF For Input As #1 C = 3 Do Line Input #1, A OUS.Range("A" & C).Value = A C = C + 1 Loop Until EOF(1) Close #1 End Sub Sub テキスト書込() ' A3よりテキストデータに出力する OUF = "C:\d\説明TEST.txt" 'SET OUS=WORKBOOKS("一覧.xls").SHEETS("Sheet5") ’入力出力シート Set INS = Sheets("Sheet5") '入力出力シート Close #1 On Error Resume Next Kill OUF '出力ファイルを削除 On Error GoTo 0 Open OUF For Output As #1 en = INS.Range("A65536").End(xlUp).Row For C = 3 To en Print #1, INS.Range("A" & C).Value Next C Close #1 End Sub |
J.フォームを作成する
表の内容をフォームに表示し、フォームで入力した結果を表に貼りつける。
フォームを作成し、すべてのオブジェクトの名称を連番にしておきます。
例 TextBox1 ComboBox2 TextBox3 ListBox4
入力表
選択データを登録する
設定方法
結果
入力結果が入力シート1行目に記入される
作成したフォームに合わせ、プログラムの修正が必要になりますが、
慣れれば簡単にできます。
修正箇所 本体プログラム
Set DS1 = Sheets("Sheet2").Range("$A$1") '格納セル Set DS2 = Sheets("Sheet2").Range("$B$1") '格納セル Set LS2 = Sheets("Sheet2").Range("$B$3").Offset(-1) Set DS3 = Sheets("Sheet2").Range("$C$1") '格納セル Set LS3 = Sheets("Sheet2").Range("$C$3").Offset(-1) Set DS4 = Sheets("Sheet2").Range("$D$1") '格納セル Set DS5 = Sheets("Sheet2").Range("$E$1") '格納セル
|
修正箇所 フォーム内プログラム
Private Sub UserForm_Initialize() 'UserForm表示前自動的に実行 データをセルから読込み Call TEXTboxINT(Me.TextBox1, DS1) Call COMBOINT(Me.ComboBox2, DS2, LS2) Call LISTBOXINT(Me.ListBox3, DS3, LS3) Call checkboxINT(Me.CheckBox4, DS4) Call OPTIONINT(Me.OptionButton5, DS5) End Sub Private Sub CommandButton1_Click() 'OK入力で データをセルに貼付け 'リストにデータを追加 Call TEXTboxen(Me.TextBox1, DS1) Call COMBOEN(Me.ComboBox2, DS2, LS2) Call listboxen(Me.ListBox3, DS3, LS3) Call checkboxen(Me.CheckBox4, DS4) Call OPTIONen(Me.OptionButton5, DS5) CAN = 0 'ok Unload Me ' hide me End Sub |
K.マクロを実行する
他のブックのマクロ(プログラム)を実行します。
設定方法
マクロ(プログラム)の入っているブックを選択し、設定します。
作成されたプログラム
次の3つのプログラムが作成されます。
Sub マクロ実行() |
マクロを実行する |
Sub 実行ブック読込書込禁止() |
マクロの入っているブックを開く |
Sub 実行ブックCLOSE() |
マクロの入っているブックを閉じる |
プログラムの機能を選択するのに、テキストボックスを使った切り替えボタンを使用します。機能を選択には他にセルで選択、フォームで選択などの方法がありますが、テキストボックスを使うと、どこにでも設置でき、簡単に切り替えできます。
入力表
テキストボックスを作成し、名前を付けます。ここではMD。
設定方法
テキストボックスを選択し、設定します。
処理名を3つまで記載できます。
結果
テキストボックスをクリックすると、次の処理名が表示されます。
もう一回クリックするともとに戻ります。
このテキストボックスの値により、処理内容が変わるようにプログラム作成します。
Sub 実行() Dim T Set T = Sheets("Sheet3").TextBoxes("MD").Characters Select Case T.Text Case "処理1" '’プログラム1を記入 Case "処理2" '’プログラム2を記入 End Select End Sub |
表の列、行を削除、追加するとプログラムが動作しなくなります。一方、表が変更できないようにプロテクトすると、分類等の手作業での機能が制限されます。
「データチェック」により表がユーザーにより変更されていないかを事前にチェックします。
入力表
設定方法
チェックするセルを選択し、設定します。この例では黄色部を選択。
作成されたプログラム
Sub データチェック() Set INS = Sheets("Sheet4") '入力出力シート ra = Array("$A$4", "$B$4", "$J$3") DAT = Array("大分類", "小分類", "当月残高") For k = LBound(ra) To UBound(ra) If Trim(INS.Range(ra(k)).Value) <> DAT(k) Then INS.Select 'アクティブワークブックにしておくこと INS.Range(ra(k)).Select MsgBox (INS.Name & "シートのセル" & INS.Range(ra(k)).Address & " 値「" & Trim(INS.Range(ra(k)).Value) & "」は「" & DAT(k) & "」と異なります フォーマット異常停止します") End End If Next k End Sub |
結果
セル"$A$4", "$B$4", "$J$3" の値がそれぞれ "大分類", "小分類", "当月残高"
でなければ エラー表示し プログラムを停止します。