業務を効率化!ExcelVBA実践コース レポート問題 … − − <問1> 設問 ⑴...

Preview:

Citation preview

VBM-02-1-A-1� −−

1406

 問2~問4の解答は、グレーのあみかけで示しています。

 本レポート問題集では、テキストで学習したなかでも、特に、実務でよく使わ

れる項目や、注意が必要なポイントについて出題しています。

 誤った設問については、解答を確認する前に、再度プロシージャを実行してみ

てください。エラーが発生する場合は、ステップ実行をするなどして、まず自分

でエラーの原因を探してみましょう。そのうえで、テキストの該当ページを参照

し、学習内容についての理解を徹底させてください。

   VBM-02-1

業務を効率化!ExcelVBA実践コースレポート問題集 解答・解説

第2単位

VBM-02-1-A-1 � −−

<問1>

設問 ⑴

解答:○(ア)

解説:(テキスト9ページ参照)

 VBAは、定型業務をシステム化してこそ一番意義があり、業務の効率化につながりま

す。システム化する際は、処理の流れ(手順)を整理し、必要な命令を考えていきます。

設問 ⑵

解答:○(ア)

解説:(テキスト�8ページ参照)

 FileDialogオブジェクトを使用すると、[ファイルを開く]ダイアログボックスや[参照]

ダイアログボックスなどを表示することができ、よりユーザーが使いやすいシステムを

作成することができるようになります。

設問 ⑶

解答:×(イ)

解説:(テキスト�0ページ参照)

 VBA付属のものではないため、FileSystemObjectオブジェクトを使用するためには、

参照設定を行う必要があります。異なるライブラリに含まれるオブジェクトを呼び出す

には、CreateObject関数を使用する方法もあります。

設問 ⑷

解答:×(イ)

解説:(テキスト�0ページ参照)

 参照設定は、外部のライブラリを使用するときに設定するものです。本テキストでも

学習したように、Openメソッドを使用してほかのブックを開くことができます。

VBM-02-1-A-1� −−

設問 ⑸

解答:○(ア)

解説:(テキスト��ページ参照)

 「¥」は区切り文字として記述する機会も多いので、使い方を確認しておきましょう。

設問 ⑹

解答:○(ア)

解説:(テキスト56~57ページ参照)

 AutoFilterメソッドは、1度に複数列に対する条件を指定できないため、指定する列

の数だけ設定する必要があります。異なる項目(複数列)に対してOr条件は指定できま

せん。

設問 ⑺

解答:○(ア)

解説:(テキスト78ページ参照)

 ユーザーインターフェイスを使用することで、ユーザーにとって、使いやすく、ミス

が発生しにくいシステムを作成することができます。

設問 ⑻

解答:×(イ)

解説:(テキスト9�ページ参照)

 Initializeイベントに記述します。Loadイベントはありません。このような処理のこと

を、ユーザーフォームの初期化といいます。

設問 ⑼

解答:×(イ)

解説:(テキスト���~��4ページ参照)

 「OnErrorResumeNext」ステートメントをプロシージャの先頭に記述すると、エラー

が発生しても処理が継続されてしまい、エラーの原因を見つけにくくなります。安易に

このような記述をしないようにしましょう。

VBM-02-1-A-1 4 −−

設問 ⑽

解答:○(ア)

解説:(テキスト��4ページ参照)

 本テキストでは、対象ファイルがなかった場合などに、エラー処理構文を使用せずに

処理を行っています。このように、ユーザーがどのような使い方をするかを考えてプロ

グラムを作成することは、たいへん大事なことです。

<問2> 

設問 ⑴

解答:

 SubQ_�_�()

DimTargetPathAsString

’[参照]ダイアログボックスを表示する

WithApplication.FileDialog(msoFileDialogFolderPicker)

If.ShowThen

TargetPath=.SelectedItems(�)

Else

ExitSub

EndIf

EndWith

Debug.PrintTargetPath

 EndSub

解説:(テキスト�7~�9ページ参照)

 [参照]ダイアログボックスを表示するには、FileDialogオブジェクトを使用し、引数に

「msoFileDialogFolderPicker」を指定します。フォルダーを選択するためのダイアログボッ

クスを表示する操作は、ユーザーにとって使いやすいプログラムを作成するうえで役立ち

ます。

VBM-02-1-A-15 −−

設問 ⑵

解答:

 SubQ_�_�()

DimfsoAsFileSystemObject

DimvFileListAsFiles

DimvFileAsFile

Setfso=NewFileSystemObject

SetvFileList=fso.GetFolder(ThisWorkbook.Path&"¥").Files

’ForEachNextステートメントを使用してすべてのファイルを対象に処理を行う

ForEachvFileInvFileList

’ファイル名をイミディエイトウィンドウに出力する

Debug.PrintvFile.Name

Next

 EndSub

解説:(テキスト�0~�5ページ参照)

 FileSystemObjectオブジェクトの基本的な使い方を確認しました。FileSystemObjectオ

ブジェクトは、VBAでファイルやフォルダーを操作するうえでたいへん便利なオブジェ

クトですが、変数を宣言しただけでは使用できないので、注意しましょう。また、取得

したファイルすべてに対して処理を行うという場面は、実務でもよくあります。

設問 ⑶

解答:

 SubQ_�_�()

’「商品名」欄が「パソコン(ノート)」のデータをオートフィルターを使用して抽出する

Range("A�").AutoFilterField:=�,Criteria�:="パソコン(ノート)"

 EndSub

 ※Fieldは、大文字・小文字を区別しません。

VBM-02-1-A-1 6 −−

解説:(テキスト55~57ページ参照)

 「Field:=」に続けて抽出条件を指定する列番号を、「Criteria�:=」に続けて抽出条件を

指定します。オートフィルターは便利で、よく利用される機能なので、確実にマスター

しておきましょう。

設問 ⑷

解答:

 SubQ_�_4()

DimDataLastCellAsRange

WithWorksheets("Sheet�")

’「Sheet�」ワークシートの表で、A列のデータ入力行のセルを取得し、変数DataLast-

Cellに代入する

SetDataLastCell=.Cells(.Rows.Count,"A").End(xlUp).Offset(�)

EndWith

’「Sheet�」ワークシートのA4からD9をコピーして「Sheet�」ワークシートに貼り付ける

Worksheets("Sheet�").Range("A4:D9").CopyDestination:=DataLastCell

 EndSub

解説:(テキスト�5~40ページ参照)

 Endプロパティで表の最終行を取得し、Offsetプロパティでその1つ下の入力行のセ

ルを取得しています。これは、VBAで表を扱う際には必須のテクニックです。また、

ほかのワークブックやワークシートからデータをコピーする際のCopyメソッドの使い

方も確認しておきましょう。

 なお、Destinationを省略して、つぎのように記述することもできます。

 Worksheets("Sheet�").Range("A4:D9").CopyDataLastCell

VBM-02-1-A-17 −−

設問 ⑸

解答:

 SubQ_�_5()

DimDataRangeAsRange

DimnumAsLong

’Rangeオブジェクトを使用して、セルA�を基準にしてアクティブセル領域を求める

WithThisWorkbook.Worksheets("Sheet�").Range("A�").CurrentRegion

num=.Rows.Count

’「数量」欄(見出し含む)のセル範囲を取得して変数DataRangeに代入する

SetDataRange=.Resize(num,�).Offset(0,�)

’セルA�5以降に、Valueプロパティを使用して値のみ貼り付ける

Range("A�5").Resize(DataRange.Rows.Count,DataRange.Columns.Count).Value=DataRange.Value

EndWith

 EndSub

解説:(テキスト6�~67ページ参照)

 ResizeプロパティとOffsetプロパティを使用し、選択する範囲を変更して移動した先

のセル範囲を取得しています。この処理は、VBAで表を扱う際の定番といえます。確実

にマスターしておきましょう。なお、本設問では「Offsetプロパティの引数は省略しな

いこと」という条件がありますが、「Offset(0,�)」の「0」を省略して「Offset(,�)」と記

述することもできます。

 また、Valueプロパティを使用して値の貼り付けを行っていますが、このとき、貼り

付け先のセル範囲を元のデータから取得しています。この方法も大切なテクニックの1

つです。

VBM-02-1-A-1 8 −−

設問 ⑹

解答:

 SubQ_�_6()

DimvFileNameAsString

WithThisWorkbook.Worksheets("Sheet�")

vFileName=ThisWorkbook.Path&"¥"&.Range("A�").Value&".pdf"

’PDFファイルを作成する

.ExportAsFixedFormatType:=xlTypePDF,Filename:=vFileName

EndWith

 EndSub

解説:(テキスト70~7�ページ参照)

 PDFファイルの作成には、ExportAsFixedFormatメソッドを使用します。PDFファイ

ル形式は実務でよく利用されますので、保存する際のファイル名の指定のしかたと一緒

に覚えておきましょう。

<問3> 

設問 ⑴

解答:下図参照(大きさと位置は任意)

VBM-02-1-A-19 −−

解説:(テキスト8�~86ページ参照)

 ユーザーフォーム「frmMain」を表示し、ツールボックスを使って、テキストボックス

とコマンドボタンを1つずつ配置します。オブジェクト名は、各オブジェクトを選択し、[プ

ロパティウィンドウ]で入力します。

設問 ⑵

解答:

 SubQ_�_�()

’ユーザーフォーム「frmMain」を表示する

frmMain.Show

 EndSub

解説:(テキスト��5ページ参照)

 ユーザーフォームを表示する際は、Showメソッドを使用します。

設問 ⑶

解答:

 PrivateSubtxtData_Change()

IfLen(txtData.Text)>5Then

MsgBox"5文字まで"

Application.EnableEvents=False

’テキストボックスに入力された値の左端から5文字を取得して、再度テキストボッ

クスに入力する

txtData.Text=Left(txtData.Text,5)

Application.EnableEvents=True

EndIf

 EndSub

VBM-02-1-A-1 �0−−

解説:(テキスト���~��5ページ参照)

 第1単位で学習したように、いったんイベント処理を無効にし、処理が終わったあと

に、有効に戻しています。この一連の処理の流れを覚えておきましょう。

設問 ⑷

解答:

 PrivateSubcmdMessage_Click()

’「クリックされました」というメッセージを表示する

MsgBox"クリックされました"

 EndSub

解説:(テキスト88~89ページ参照)

 クリックイベントで、メッセージを表示する方法を確認しました。ユーザーフォーム

「frmMain」のコマンドボタン「cmdMessage」をダブルクリックして「Clickイベント」

プロシージャを表示し、コードを追記します。MsgBox関数の記述は簡単ですが、メッセー

ジを表示する処理は、ユーザーにとって親切なシステムにするために大切です。

VBM-02-1-A-1��−−

設問 ⑸

解答:

 PrivateSubUserForm_Initialize()

DimListRangeAsRange

DimtempAsRange

DimvListAsCollection

SetvList=NewCollection

WithWorksheets("Sheet�").Range("A�").CurrentRegion

SetListRange=.Resize(.Rows.Count-�,�).Offset(�,�)

EndWith

ForEachtempInListRange

OnErrorResumeNext

’コレクションのアイテムとデータの両方にセルの値を設定する

vList.Addtemp.Value,temp.Value

’エラーが発生していないかかどうかを判定する

IfErr.Number=0Then

’コマンドボタンにセルの値を追加する

cmbList.AddItemtemp.Value

EndIf

OnErrorGoTo0

Next

 EndSub

解説:(テキスト9�~98ページ参照)

 コレクションオブジェクトの使用方法とコンボボックスへの値の追加方法を確認しま

した。コレクションオブジェクトは、このようにエラー処理と組み合わせることで、重

複チェックに使うことができます。これは、たとえば取引先リストから重複データを見

つけるといった処理の際にも応用できて便利です。

VBM-02-1-A-1 ��−−

<問4> 

設問 ⑴

解答:

 SubQ_4_�()

DimiAsLong

’画面の更新処理を中止する

Application.ScreenUpdating=False

Worksheets("Sheet�").Activate

Fori=�To�0000

Cells(i,�).Value=i

Next

 EndSub

解説:(テキスト�46ページ参照)

   画面の更新処理を止めることは、処理の高速化にもつながる基本的なテクニックです。

VBM-02-1-A-1��−−

設問 ⑵

解答:

 SubQ_4_�()

DimiAsLong

Worksheets("Sheet�").Activate

Fori=�To500

’ステータスバーに進捗を表す"■"を表示する。表示する"■"の数は変数iの値を�00で

割った値とする

Application.StatusBar=String(i/�00,"■")

Cells(i,�).Value=i

Next

’ステータスバーを元の状態に戻す

Application.StatusBar=False

 EndSub

解説:(テキスト�44~�46ページ参照)

 Excelのステータスバーは、簡易なメッセージを表示するのに便利です。

 なお、テキストでは触れていませんが、「i/�00」の部分は、「Int(i / �00)」、「Fix(i /

�00」としても正解となります。

VBM-02-1-A-1 �4−−

設問 ⑶

解答:

 SubQ_4_�()

WithWorksheets("Sheet�").Range("A�").CurrentRegion

’IfThenステートメントとCountプロパティを使用して、見出しを除くデータ行がある

か判定する

If.Rows.Count>�Then

’データがある場合、「データあり」とメッセージを表示する

MsgBox"データあり"

EndIf

EndWith

 EndSub

解説:(テキスト6�~64、��4~��5ページ参照)

 IfThenステートメントを使用し、表にデータあるかどうかを確認する基本的なテク

ニックです。本設問では、Withステートメントを使用していることにも注意が必要です。

 なお、設問では「1行よりも大きな行数」と指定しているため、「If .Rows.Count >�

Then」が正解となりますが、「If.Rows.Count>=�Then」でも同じように動作します。

VBM-02-1-A-1�5−−

設問 ⑷

解答:

 SubQ_4_4()

DimfsoAsFileSystemObject

DimvFilesAsFiles

Setfso=NewFileSystemObject

SetvFiles=fso.GetFolder(ThisWorkbook.Path&"¥Data").Files

’IfThenステートメントを使用してファイルが「0」か確認する

IfvFiles.Count=0Then

’「0」の場合、「ファイルがありません」とメッセージを表示する

MsgBox"ファイルがありません"

’処理を終了する

ExitSub

EndIf

 EndSub

解説:(テキスト��、��5ページ参照)

 IfThenステートメントを使用し、ファイルがあるかどうかを確認する処理です。

FileSystemObjectオブジェクトを使う場合の基本的なテクニックです。

VBM-02-1-A-1 �6−−

設問 ⑸

解答:

 SubQ_4_5()

DimfsoAsFileSystemObject

DimvFilesAsFiles

DimvFileAsFile

Setfso=NewFileSystemObject

SetvFiles=fso.GetFolder(ThisWorkbook.Path&"¥Data�¥").Files

’ForEachNextステートメントを使用して、すべてのファイルを対象に処理を行う

ForEachvFileInvFiles

’このブックと同じフォルダーにある「Data�」フォルダーに移動する

fso.MoveFileThisWorkbook.Path&"¥Data�¥"&vFile.Name,_

ThisWorkbook.Path&"¥Data�¥"&vFile.Name

Next

 EndSub

解説:(テキスト�5、���~���ページ参照)

 MoveFileメソッドを使用して、ファイルを移動する方法を確認しました。何を変数で

表しているのかをきちんと理解し、フォルダーの指定の際に間違えないように気をつけ

ましょう。

 なお、テキストでは触れていませんが、「¥」の部分を「Application.PathSeparator」に

置き換えて記述しても正解となります。

Recommended