View
1
Download
0
Category
Preview:
Citation preview
VBM-01-1-A-1� −−
1406
問2~問5の解答は、グレーのあみかけで示しています。
本レポート問題集では、テキストで学習したなかでも、特に、実務でよく使わ
れる項目や、注意が必要なポイントについて出題しています。
誤った設問については、解答を確認する前に、再度プロシージャを実行してみ
てください。エラーが発生する場合は、ステップ実行をするなどして、まず自分
でエラーの原因を探してみましょう。そのうえで、テキストの該当ページを参照
し、学習内容についての理解を徹底させてください。
VBM-01-1
業務を効率化!ExcelVBA実践コースレポート問題集 解答・解説
第1単位
VBM-01-1-A-1 � −−
<問1>
設問 ⑴
解答:×(イ)
解説:(テキスト�0ページ参照)
マクロを含むブックの拡張子は「.xlsm」です。互換モード(「.xls」)を使用すること
が多い場合は、マクロを含むブックを保存するときに、ファイル形式に注意しましょう。
設問 ⑵
解答:○(ア)
解説:(テキスト�3ページ参照)
Functionプロシージャは処理した結果を呼び出し元に返すプロシージャで、自作の関
数を作成することもできます。
設問 ⑶
解答:○(ア)
解説:(テキスト�4ページ参照)
オブジェクトの階層構造を意識してコードを記述することで、プログラムを作成する
際のミスが減り、思わぬエラーを避けることができます。
設問 ⑷
解答:×(イ)
解説:(テキスト�8、�0ページ参照)
データ型を指定しなかった場合、エラーが起きた原因が見つけにくくなります。変数
を宣言するときには、あらかじめデータ型を指定するようにしましょう。
設問 ⑸
解答:×(イ)
解説:(テキスト�5~�6ページ参照)
配列のインデックスは0から始まるため、要素数は、「指定した値+ 1」になります。
VBM-01-1-A-13 −−
設問 ⑹
解答:×(イ)
解説:(テキスト�9~3�ページ参照)
実際のプログラミングでミスしがちな点です。条件式を指定する場合には、「=」の有
無をきちんと確認しましょう。
設問 ⑺
解答:×(イ)
解説:(テキスト33ページ参照)
「Is」句や「To」句を使用して、値の範囲を指定することができます。また、「,(カン
マ)」で区切って複数の条件を指定することもできます。
設問 ⑻
解答:○(ア)
解説:(テキスト36ページ参照)
「Step」句には負の値を指定することもできます。省略した場合は、1ずつ増加され
ます。「Step」句は単純な繰り返し処理では使用しないことも多いですが、処理を逆順
に行いたい場合などに使用する大切なキーワードです。
設問 ⑼
解答:○(ア)
解説:(テキスト38ページ参照)
ForEachNextステートメントは、繰り返し処理の対象がグループであることが重要な
ポイントです。
設問 ⑽
解答:○(ア)
解説:(テキスト4�ページ参照)
「DoLoop」ステートメントを使用する際には、特に、「無限ループ」の状態にならな
いよう注意が必要です。
VBM-01-1-A-1 4 −−
<問2>
設問 ⑴
解答:
SubQ_�_�()
’Rangeオブジェクトを使用してセルA�とC6を選択する
Range("A�,C6").Select
EndSub
解説:(テキスト46~47ページ参照)
離れたセルを指定する場合は、「:」ではなく、「,」を使用します。
なお、テキストでは「Range プロパティ」と表現していますが、「Range オブジェクト」
も同義ととらえてかまいません。より正確に表現すると、Range プロパティを使用して
取得できるセル(オブジェクト)が、Range オブジェクトになります。
設問 ⑵
解答:
SubQ_�_�()
’「Sheet�」ワークシートにある社員名簿のセルB�からC6を
’「Sheet�」ワークシートのセルA�0以降にコピーして貼り付ける(Pasteメソッドは使用し
ない)
Range("B�:C6").CopyRange("A�0")
EndSub
解説:(テキスト53~56ページ参照)
単発のコピー処理であれば、Pasteメソッドを使用するよりも、Copyメソッドを使用
したほうが効率的です。
なお、テキストでは触れていませんが、引数名を明示して、つぎのように記述しても
正解となります。
Range("B�:C6").CopyDestination:=Range("A�0")
VBM-01-1-A-15 −−
設問 ⑶
解答:
SubQ_�_3()
’セルA�をコピーする
Range("A�").Copy
’セルB�からC�に書式のみ貼り付ける
Range("B�:C�").PasteSpecialxlPasteFormats
EndSub
解説:(テキスト53~56ページ参照)
コピーしたセルを「形式を選択して貼り付け」するには、PasteSpecialメソッドを使
用します。書式のみ貼り付ける場合には、「xlPasteFormats」を引数に指定します。実務
でもよく行う作業ですので、指定のしかたを確認しておきましょう。
設問 ⑷
解答:
SubQ_�_4()
’セルE�の値のみをコピーしてセルB8に貼り付ける(Copyメソッドは使用しない)
Range("B8").Value=Range("E�").Value
EndSub
解説:(テキスト49、57ページ参照)
実務でも、数式を入力したセルの結果だけを貼り付けたいという場合がよくありま
す。Valueプロパティを使用した値の貼り付けは記述が簡単で便利ですので、覚えてお
くとよいでしょう。
なお、テキストでは触れていませんが、Valueを省略しても同じように動作します。
ただし、「動作する」というだけで、よい記述のしかたとはいえない(また、現在では
一般的ではない)ため、不正解とします。
VBM-01-1-A-1 6 −−
設問 ⑸
解答:
SubQ_�_5()
’実線で格子の罫線をセルA�からC6の表全体に引く
Range("A�:C6").Borders.LineStyle=xlContinuous
’二点鎖線の罫線を表の�行め(セルA�からC�)の下側に引く
Range("A�:C�").Borders(xlEdgeBottom).LineStyle=xlDashDotDot
EndSub
解説:(テキスト63~65ページ参照)
Bordersプロパティで、セルの個々の罫線を設定することができます。引数を省略し
た場合は、格子状に罫線が設定されます。LineStyleプロパティで罫線の種類を指定しま
す。本設問のように、表などに罫線を設定する場合は、まず全体を指定し、そのあと個
別の設定を行うとよいでしょう。
<問3>
設問 ⑴
解答:
SubQ_3_�()
’削除後警告のメッセージを非表示にする
Application.DisplayAlerts=False
’「3月」ワークシートを削除する
Worksheets("3月").Delete
’削除後警告のメッセージを表示する
Application.DisplayAlerts=True
EndSub
解説:(テキスト7�~74ページ参照)
ワークシートを削除する場合、「警告」のメッセージを非表示にするコードも記述する
ことが大切です。プロシージャの終了後もその設定は有効になるため、ワークシートを削
除したあとに、「警告」のメッセージを表示する設定に戻す必要があります。この一連の
処理は、まとめて覚えておきましょう。
VBM-01-1-A-17 −−
設問 ⑵
解答:
SubQ_3_�()
’「4月」ワークシートのコピーをブックの一番右端に作成する
Worksheets("4月").CopyAfter:=Worksheets(Worksheets.Count)
’コピーしたワークシートの名前を「6月」にする
Worksheets(Worksheets.Count).Name="6月"
EndSub
※「After」は、大文字・小文字を区別しません。
解説:(テキスト75~76ページ参照)
ワークシートをコピーするときの引数の指定方法について確認しました。Countプロ
パティで取得した値を、Worksheetsプロパティのインデックス番号として指定できる点
がポイントです。また、ワークシート名の設定方法についても、あわせて確認しておき
ましょう。
VBM-01-1-A-1 8 −−
設問 ⑶
解答:
SubQ_3_3()
DimFileNameAsString
DimBookAsWorkbook
’[ファイルを開く]ダイアログボックスを表示し、選択されたブックのパスを変数
FileNameに代入する
’ダイアログボックスに表示されるファイルの種類は「Excelファイル("Excelブック,*.
xlsx")」を指定する
FileName=Application.GetOpenFilename("Excelブック,*.xlsx")
’選択されたブックを開き、変数Bookに代入する
SetBook=Workbooks.Open(FileName)
MsgBoxBook.Worksheets(�).Range("A�").Value
Book.Close
EndSub
解説:(テキスト80~83ページ参照)
「ファイルを開く」ダイアログボックスを表示する処理は、業務用のプログラムを作
成する際にも頻出するため、覚えておくとよいでしょう。
また、ブックを開くと、開いたブックがアクティブになります。そのため、アクティ
ブブックに対する処理を行うコードを記述してしまいがちですが、これはエラーの原因
になります。ブックを開く処理を行う際には、開くと同時に変数に代入することが大切
です。
VBM-01-1-A-19 −−
設問 ⑷
解答:
SubQ_3_4()
DimBookAsWorkbook
’新規ブックを追加して、変数Bookに代入する
SetBook=Workbooks.Add
’追加したブックを「保存データ.xlsx」という名前で、「�-3.xlsm」ブックと同じフォルダー
に保存する
‘なお、「�-3.xlsm」ブックが保存されているフォルダーは、Pathプロパティを使用して取
得すること
Book.SaveAsThisWorkbook.Path&"¥"&"保存データ.xlsx"
EndSub
解説:(テキスト84~86ページ参照)
ブックを追加したときに、変数に代入しています。こうすることで、そのあとの処理
を確実に行うことができます。Addメソッドだけでなく、この一連の流れを確認してお
きましょう。
また、名前を付けてブックを保存する処理も、プログラム作成時に大切な処理です。
覚えておきましょう。
なお、「&"¥"&"保存データ.xlsx"」の部分は、「&"¥保存データ.xlsx"」と記述して
も正解となります。また、テキストでは触れていませんが、「&"¥"&」の部分をつぎの
ように記述することもできます。
&Application.PathSeparator&
※PathSeparatorプロパティは、区切り文字(¥)を表します。
VBM-01-1-A-1 �0−−
<問4>
設問 ⑴
解答:
SubQ_4_�()
DimnumAsLong
’セルA�からA6に入力されているデータの個数をCOUNTAワークシート関数を用いて取得
し、変数numに代入する
’なお、引数にはRangeオブジェクトを使用し、「:」を使った形式でセル範囲を指定する
こと
num=Application.WorksheetFunction.CountA(Range("A�:A6"))
MsgBox"人数:"&num
EndSub
解説:(テキスト96~97ページ参照)
ワークシート関数をVBAで利用するには、WorksheetFunctionオブジェクトのメソッ
ドを使用します。VBAでワークシート関数を利用できると、Excelのワークシートを操
作する感覚で関数を使うことができるため、とても便利です。
VBM-01-1-A-1��−−
設問 ⑵
解答:
SubQ_4_�()
DimtempAsString
DimposAsLong
DimvNameAsString
DimiAsLong
Fori=�To6
temp=Cells(i,�).Value
’半角スペースの位置をInStrRev関数を使用して取得し、変数posに代入する
pos=InStrRev(temp,"")
’「氏名」から「名」のみを取得して変数vNameに代入する
vName=Right(temp,Len(temp)-pos)
Debug.PrintvName
Next
EndSub
解説:(テキスト�00~�03ページ参照)
テキストで紹介している、ブックのフルパスからファイル名のみを取得するプロシー
ジャの応用です。たとえば、住所から県名のみを取り出すなど、ある文字を区切り文字
としてその前後のいずれかの文字を取り出すという処理は、実務でもよく登場します。
コードの記述方法をきちんと理解しておきましょう。
なお、InStrRev関数を使用する指示が特になければ、InStr関数を使用して、つぎのよ
うに記述することもできます。
pos=InStr(temp,"")
VBM-01-1-A-1 ��−−
設問 ⑶
解答:
SubQ_4_3()
DimTargetAsRange
DimtempAsString
DimiAsLong
ForEachTargetInRange("C�:C6")
’セルの値をすべて全角に置換して変数tempに代入する。変換する文字列は、Valueプ
ロパティを使って取得する
temp=StrConv(Target.Value,vbWide)
’置換後の値の全角スペースを半角スペースに変換し、元のセルに入力する
Target.Value=Replace(temp," ","")
Next
EndSub
解説:(テキスト�04~�08ページ参照)
文字列の変換と置換を1つのプロシージャ内で行っています。文字列を変換するには
StrConv関数を、置換するにはReplace関数を使用します。文字列操作は、このように複
数の処理を組み合わせて行うことがよくあります。
VBM-01-1-A-1�3−−
設問 ⑷
解答:
SubQ_4_4()
DimtempAsDate
DimvStrAsString
’本日の日付から30日後の日付を求め、変数tempに代入する
temp=DateAdd("d",30,Date)
’変数tempの値の書式を「yyyy/mm/dd」にして変数vStrに代入する
vStr=Format(temp,"yyyy/mm/dd")
MsgBox"30日後:"&vStr
EndSub
解説:(テキスト���~��6ページ参照)
日付の処理は、業務でも必須のものです。そのため、DateAdd関数について、テキス
トとは少し異なる応用問題で確認しました。また、ここで行っているように、日付の
フォーマットを整えることは、書類を作成するうえで大切なことです。Format関数を使っ
た表示形式の設定もできるようにしておきましょう。
<問5>
設問 ⑴
解答:
PrivateSubWorkbook_Open()
WithWorksheets("Sheet�")
.Activate
’A列の入力行を取得する
.Cells(.Rows.Count,�).End(xlUp).Offset(�).Select
EndWith
EndSub
VBM-01-1-A-1 �4−−
解説:(テキスト�3�~�35ページ参照)
[プロジェクトエクスプローラ]で「ThisWorkbook」ブックモジュールをクリックし
て[コードウィンドウ]を開き、「Openイベント」プロシージャにコードを記述します。
Endプロパティを使用して表の最終行を取得する処理、Offsetプロパティを使用して最
終行の1つ下のセルを取得する処理は、プログラムで表を扱う際に必須の処理です。こ
こでは、Withステートメントを使用して記述を省略していることに注意しましょう。
なお、テキストでは触れていませんが、つぎのように記述しても正解となります。
.Range("A"&.Rows.Count).End(xlUp).Offset(�).Select
.Cells(.Rows.Count,"A").End(xlUp).Offset(�).Select
設問 ⑵
解答:
PrivateSubWorksheet_Change(ByValTargetAsRange)
WithRange("A�").CurrentRegion
IfNotIntersect(Target,.Columns("A"))IsNothingThen
IfLen(Target.Value)<>5Then
MsgBox"会員番号は5桁の値です"
’イベント処理が発生しないようにする
Application.EnableEvents=False
’入力されたセルの値のみ削除する(書式は削除しない)
Target.ClearContents
’イベント処理が発生するようにする
Application.EnableEvents=True
EndIf
EndIf
EndWith
EndSub
解説:(テキスト�36~�4�ページ参照)
[プロジェクトエクスプローラ]で「Sheet�」シートモジュールをクリックして[コー
ドウィンドウ]を開き、「Changeイベント」プロシージャにコードを記述します。
VBM-01-1-A-1�5−−
セルの内容だけを削除したい場合は、ClearContentsメソッドを使用します。また、
Changeイベント内でセルに対する処理を行うときには、イベントが発生しないようにす
ることが大切です。この処理を行わなくてもプログラムが動作することはありますが、
その場合、必ずムダな処理が発生します。イベントを有効に戻しておくことも忘れない
ようにしましょう。
設問 ⑶
解答:
SubQ_5_3()
DimshAsWorksheet
’エラーが発生したときに、ラベル(ErrHdl)にジャンプして処理を行う
OnErrorGoToErrHdl
Setsh=Worksheets("名簿")
sh.Activate
MsgBox"処理を終了します"
’プロシージャを抜けて処理を終了する
ExitSub
ErrHdl:
MsgBox"エラーが発生しました"
EndSub
解説:(テキスト�59~�66ページ参照)
エラー処理の基本的な記述方法を確認しました。このプロシージャは、「名簿」とい
う名前のワークシートがあれば、アクティブにして「処理を終了します」というメッセー
ジを表示し、ない場合には、ラベルまでジャンプして処理を行います。
特に、「ExitSub」を記述して処理を終了することが大切です。この記述を忘れてしま
うと、エラーが発生しなかった場合でも、ラベル以降の処理が行われてしまいます。
VBM-01-1-A-1 �6−−
Recommended